服务热线
135-6963-3175
关于spring cloud gateway进行sentinel的集成和自定义规则加载。
1、首先定义全局配置类
@Configuration public class GovernConfiguration { private final List<ViewResolver> viewResolvers; private final ServerCodecConfigurer serverCodecConfigurer; public GovernConfiguration(ObjectProvider<List<ViewResolver>> viewResolversProvider, ServerCodecConfigurer serverCodecConfigurer) { this.viewResolvers = viewResolversProvider.getIfAvailable(Collections::emptyList); this.serverCodecConfigurer = serverCodecConfigurer; } //异常处理器 @Bean @Order(Ordered.HIGHEST_PRECEDENCE) public SentinelGatewayBlockExceptionHandler sentinelGatewayBlockExceptionHandler() { // Register the block exception handler for Spring Cloud Gateway. return new SentinelGatewayBlockExceptionHandler(viewResolvers, serverCodecConfigurer); } //限流拦截器 @Bean public GovernFilter sentinelGatewayFilter(SidecarLoadBalancerClientFilter sidecarLoadBalancerClientFilter) { return new GovernSentiFilter(); } //可声明一个bean进行自定义规则的加载(略) }
2、然后定义GovernSentiFilter类
public class GovernFilter implements GatewayFilter, GlobalFilter, Ordered { private final int order; public GovernFilter() { this(Ordered.HIGHEST_PRECEDENCE); } public GovernFilter(int order) { this.order = order; } private final GatewayParamParser<ServerWebExchange> paramParser = new GatewayParamParser<>( new ServerWebExchangeItemParser()); @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { String path = exchange.getRequest().getPath().value(); //根据规则组装限流资源标志id //扩展点: 可在此处通过path进行规则的匹配计算出最终限流id List<String> resources = ...; if (resources.size() == 0) { return chain.filter(exchange); } Mono<Void> filter = chain.filter(exchange); //通过上面结果id进行限流 for(String resource: resources){ filter = from((Publisher)((Function)buildSentinelTransformer(exchange, resource)).apply(filter)); } return filter; } private SentinelReactorTransformer<Void> buildSentinelTransformer(ServerWebExchange exchange, String finalPath) { String origin =""; return new SentinelReactorTransformer<>(new EntryConfig(finalPath, ResourceTypeConstants.COMMON_WEB, EntryType.IN, new ContextConfig(finalPath, origin))); } }
3、在限流slot里通过步骤2的id反向计算出规则进行原规则的获取,进而进行相关定义流控行为的处理。
待补充...