Мы пытаемся использовать Spring Cloud Gateway для настройки архитектуры на основе микросервиса.В настоящее время мы определили маршрут программно:
@ServletComponentScan
@SpringBootApplication
public class GatewayApplication {
// to be passed to and used by custom filter
@Autowired
RestTemplate restTemplate;
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("status", r -> r
.method(HttpMethod.GET)
.and()
.path("/status")
.filters(f -> f.rewritePath("/status", "/v2/status")
.filter(new AuthorizationFilter(restTemplate).apply(new Config(""))))
.uri("http://localhost:8081/"))
.build();
}
}
Выше было бы перенаправить входящий запрос /status
через GET в другую конечную точку.Мы хотели бы применить пользовательский фильтр, который мы реализовали в AuthorizationFilter
.Этот фильтр, как следует из названия, является еще одной микросервисной службой, которая будет разрешать или отклонять входящий запрос на основе учетных данных и разрешений.
В настоящее время шаблон, которому мы следуем, который работает, заключается в добавлении Spring * 1008.* в вышеприведенный класс шлюза, а затем передать это RestTemplate
в конструктор фильтра.
Однако как это можно сделать, если мы хотим перейти к использованию файла YAML для определения всех маршрутов?Предположительно в обоих случаях Spring будет создавать новый фильтр для каждого входящего запроса.Но в случае YAML, как мы можем передать что-то в construtor?Если это невозможно, есть ли другой способ добавить RestTemplate
или любой другой ресурс в пользовательский фильтр Spring Gateway?