Мы пытаемся использовать 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 RestTemplate
в класс шлюза, указанный выше, а затем передать это RestTemplate
конструктору фильтра.
Однако как это сделать, если мы хотим переключиться на использование файла YAML для определения всех маршрутов? Предположительно в обоих случаях Spring будет создавать новый фильтр для каждого входящего запроса. Но как мы можем передать что-то в конструкторе в случае YAML? Если это невозможно сделать, есть ли другой способ добавить RestTemplate
или любой другой ресурс в настраиваемый фильтр шлюза Spring?