本章簡單介紹了如何使用java代碼配置springcloud gateway的route,已及集成gateway內置的限流組件。
起因
因為有需求需要自定義route,完成自定義后route后發現不知道怎么添加內置的RequestRateLimiter限流組件,網上大多都是yml配置的。
解決辦法
廢話不多先直接上代碼
@Bean
public RouteLocator routes(RouteLocatorBuilder builder,
RequestRateLimiterGatewayFilterFactory requestRateLimiterGatewayFilterFactory,
HystrixGatewayFilterFactory hystrixGatewayFilterFactory) {
HystrixGatewayFilterFactory.Config hystrixConfig = new HystrixGatewayFilterFactory.Config();
hystrixConfig.setFallbackUri("forward:/fallback");
hystrixConfig.setName("openApiFallback");
RequestRateLimiterGatewayFilterFactory.Config config = new RequestRateLimiterGatewayFilterFactory.Config();
config.setRateLimiter(openApiRedisRateLimiter()).setKeyResolver(hostAddrKeyResolver());
return builder.routes()
.route("openApi", r -> r.path("/openApi")
.and()
.readBody(JSONObject.class, requestBody -> true)
.filters(f -> f.filter(new OpenApiFilter())
.filter(requestRateLimiterGatewayFilterFactory.apply(config))
.filter(hystrixGatewayFilterFactory.apply(hystrixConfig)))
.uri("lb://openApi"))
.build();
}
@Bean
public RedisRateLimiter openApiRedisRateLimiter() {
return new RedisRateLimiter(1, 200);
}
/**
* 用戶ip限流
* @return
*/
@Bean
public KeyResolver hostAddrKeyResolver() {
return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
}
效果與yml中類似
spring:
cloud:
gateway:
globalcors:
corsConfigurations:
'[/**]':
allowedOrigins: "*"
exposedHeaders:
- content-type
allowedHeaders:
- content-type
allowCredentials: true
allowedMethods: "*"
routes:
- id: main
uri: lb://main
predicates:
- Path=/main/**
filters:
- RemoveRequestHeader=from
- StripPrefix=1
- name: CustomRequestRateLimiter
args:
#用於限流的鍵的解析器的 Bean 對象的名字,使用 SpEL 表達式根據#{@beanName}獲取Bean對象
key-resolver: '#{@hostAddrKeyResolver}'
#令牌桶填充速率
redis-rate-limiter.replenishRate: 1
#令牌桶總容量
redis-rate-limiter.burstCapacity: 200
其中RedisRateLimiter中的參數分別與redis-rate-limiter.replenishRate、redis-rate-limiter.burstCapacity相同。
而RequestRateLimiterGatewayFilterFactory與HystrixGatewayFilterFactory都是springcloud gateway內置的filter。還有更多內置Filter請看下圖。
許多Filter源碼看起來並不是很困難,用到可以多了解了解。
gateway源碼相關也可以在 芋道源碼 了解學習。多了解了解可以解決很多問題。