自定义过滤器整合hystrix:重新实现一遍HystrixGatewayFilterFactory
时间: 2024-05-01 10:22:10 浏览: 24
HystrixGatewayFilterFactory是Spring Cloud Gateway提供的一个默认的过滤器工厂,它通过在网关上应用HystrixCommand来实现服务熔断和降级。如果需要对该过滤器进行自定义扩展,可以参考以下步骤:
1. 创建自定义过滤器工厂类,例如MyHystrixGatewayFilterFactory,继承HystrixGatewayFilterFactory类,并实现其create方法。
```java
@Component
public class MyHystrixGatewayFilterFactory extends HystrixGatewayFilterFactory<MyHystrixGatewayFilterFactory.Config> {
public MyHystrixGatewayFilterFactory() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
HystrixCommand.Setter setter = HystrixCommand.Setter
.withGroupKey(HystrixCommandGroupKey.Factory.asKey(config.getGroupKey()))
.andCommandKey(HystrixCommandKey.Factory.asKey(config.getCommandKey()))
.andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey(config.getThreadPoolKey()))
.andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
.withExecutionIsolationStrategy(config.getExecutionIsolationStrategy())
.withExecutionTimeoutInMilliseconds(config.getExecutionTimeoutInMilliseconds())
.withCircuitBreakerRequestVolumeThreshold(config.getCircuitBreakerRequestVolumeThreshold())
.withCircuitBreakerErrorThresholdPercentage(config.getCircuitBreakerErrorThresholdPercentage())
.withCircuitBreakerSleepWindowInMilliseconds(config.getCircuitBreakerSleepWindowInMilliseconds())
.withFallbackIsolationSemaphoreMaxConcurrentRequests(config.getFallbackIsolationSemaphoreMaxConcurrentRequests())
.withFallbackEnabled(config.isFallbackEnabled())
.withMetricsRollingStatisticalWindowInMilliseconds(config.getMetricsRollingStatisticalWindowInMilliseconds())
.withMetricsRollingStatisticalWindowBuckets(config.getMetricsRollingStatisticalWindowBuckets())
.withMetricsHealthSnapshotIntervalInMilliseconds(config.getMetricsHealthSnapshotIntervalInMilliseconds())
.withRequestCacheEnabled(config.isRequestCacheEnabled())
.withRequestLogEnabled(config.isRequestLogEnabled()));
return new MyHystrixGatewayFilter(setter);
}
public static class Config extends HystrixGatewayFilterFactory.Config {
//添加自定义参数
private String myParam;
public String getMyParam() {
return myParam;
}
public void setMyParam(String myParam) {
this.myParam = myParam;
}
}
}
```
2. 创建自定义过滤器类,例如MyHystrixGatewayFilter,继承HystrixGatewayFilter,并实现其构造方法。
```java
public class MyHystrixGatewayFilter extends HystrixGatewayFilter {
public MyHystrixGatewayFilter(HystrixCommand.Setter setter) {
super(setter);
}
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//添加自定义逻辑
return super.filter(exchange, chain);
}
}
```
3. 在配置文件中配置自定义过滤器工厂。
```
spring.cloud.gateway.routes[0].filters[0]=MyHystrixGatewayFilterFactory
spring.cloud.gateway.routes[0].filters[0].myParam=myValue
```
4. 使用自定义过滤器。
```java
@Configuration
public class GatewayConfig {
@Autowired
private MyHystrixGatewayFilterFactory myHystrixGatewayFilterFactory;
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("my_route", r -> r.path("/myPath")
.filters(f -> f.filter(myHystrixGatewayFilterFactory.apply(new MyHystrixGatewayFilterFactory.Config())))
.uri("http://localhost:8080"))
.build();
}
}
```
以上就是使用自定义过滤器整合Hystrix的步骤。其中,自定义过滤器工厂通过继承HystrixGatewayFilterFactory类,并实现其create方法,创建自定义过滤器。然后,在配置文件中配置自定义过滤器工厂的参数,使用自定义过滤器工厂创建自定义过滤器。最后,在RouteLocator中使用自定义过滤器即可。