#spring-boot #spring-cloud #spring-cloud-gateway
#spring-boot #spring-cloud #spring-cloud-gateway
Вопрос:
У меня есть приложение Spring cloud gateway. Я пытаюсь настроить фильтр шлюза. Версия Spring Boot 2.3.4.RELEASE
— это зависимости:
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
implementation platform(SpringBootPlugin.BOM_COORDINATES)
implementation platform('org.springframework.cloud:spring-cloud-dependencies:Hoxton.SR8')
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
implementation 'org.springframework.cloud:spring-cloud-starter-sleuth'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
}
Вот конфигурация для клиента шлюза
server:
port: 8081
spring:
cloud:
gateway:
routes:
- id: onboard_redirect
uri: http://localhost:8080/api/v1/onboard
predicates:
- Path=/api/v1/onboard
filters:
- name: MyLogging
args:
baseMessage: My Custom Message
preLogger: true
postLogger: true
Вот мой класс фильтра:
@Component
public class MyLoggingGatewayFilterFactory extends AbstractGatewayFilterFactory<MyLoggingGatewayFilterFactory.Config> {
final Logger logger =
LoggerFactory.getLogger(MyLoggingGatewayFilterFactory.class);
public MyLoggingGatewayFilterFactory() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> {
// Pre-processing
if (config.preLogger) {
logger.info("Pre GatewayFilter logging: "
config.baseMessage);
}
return chain.filter(exchange)
.then(Mono.fromRunnable(() -> {
// Post-processing
if (config.postLogger) {
logger.info("Post GatewayFilter logging: "
config.baseMessage);
}
}));
};
}
public static class Config {
public String baseMessage;
public boolean preLogger;
public boolean postLogger;
}
}
Все работает без настройки фильтра, но когда я настраиваю фильтр, я получаю следующую ошибку:
reactor.core.Exceptions$ErrorCallbackNotImplemented: java.lang.IllegalArgumentException: Unable to find GatewayFilterFactory with name MyLogging
Caused by: java.lang.IllegalArgumentException: Unable to find GatewayFilterFactory with name MyLogging
что я здесь делаю не так?
Комментарии:
1. если вы введете точку останова,
MyLoggingGatewayFilterFactory()
она попадет?2. Нет, это не так, приложение не запускается
3. В этом проблема. Ваш
@Component
файл не обнаруживается при сканировании. Попробуйте создатьMyLoggingGatewayFilterFactory
@Bean
в классе конфигурации.
Ответ №1:
Класс фильтра MyLoggingGatewayFilterFactory
не MyLogging
такой, как вы задали в своих свойствах.
Попробуйте внести следующие изменения в свой application.yml
файл:
filters:
- name: MyLoggingGatewayFilterFactory
Комментарии:
1. На самом деле, установка имени фильтра на
MyLogging
также очень допустима, поскольку имя класса фильтраMyLoggingGatewayFilterFactory
соответствует соглашению Spring об именовании для разрешения этих фильтров…. Он просто должен удовлетворять таким именам, как<filter-name>GatewayFilterFactory
Ответ №2:
Добавьте эту зависимость в файл application.properties.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-reactor-
resilience4j</artifactId>
</dependency>