Spring Cloud Alibaba系列(四)使用gateway作为服务网关 (3)

一般情况下我们配合path路由使用,这里的意思是假如,我们的demo-provider服务种有一个/test的接口,实际上我们的请求路径经过网关时应该时/demo/test,这样就能把这个路由分发到demo-provider服务中,但是分发过去的路由是/demo/test,和我们实际的/test接口不一样。这时候我们用StripPrefix=1,来截取掉一级路由,这样转发过去的路由就是/test了。

自定义网关过滤器

除了上面提供的30种过滤器外,我们还可以实现自定义的过滤器。

1. 实现GatewayFilter接口和Ordered接口

gatewayFilter接口是为了实现请求过滤,ordered接口是为了给过滤器设定优先级,值越大级别越低。

想要实现一个自定义的过滤器,无非就是两个步骤:1.实现过滤器,2.将过滤器添加到具体路由上。

public class TokenGatewayFilter implements GatewayFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { System.out.println("这里处理自身逻辑"); return chain.filter(exchange); } @Override public int getOrder() { return 0; } } @Configuration class RouteConfiguration{ @Bean public RouteLocator routeLocator(RouteLocatorBuilder builder){ return builder.routes().route( r-> r.path("/demo/**") .uri("lb://demo-provider ") .filter(new TokenGatewayFilter()) .id("demo_route ")) .build(); } } 2.继承AbstractGatewayFilterFactory类 @Component public class TokenCheckGatewayFilterFactory extends AbstractGatewayFilterFactory<TokenCheckGatewayFilterFactory.Config> { public TokenCheckGatewayFilterFactory() { super(Config.class); } @Override public List<String> shortcutFieldOrder() { return Arrays.asList("enabled"); } @Override public GatewayFilter apply(Config config) { return (exchange, chain) -> { system.out.println("这里处理自身逻辑") return chain.filter(exchange); }; } public static class Config { // 控制是否开启认证 private boolean enabled = true; public Config() {} public boolean isEnabled() { return enabled; } public void setEnabled(boolean enabled) { this.enabled = enabled; } } }

这里我们可以直接在application.yml中为需要过滤的路由添加这个过滤器。

spring: cloud: gateway: routes: - id: demo_route # 路由id,建议配合服务名 uri: lb://demo-provider #匹配路由名 predicates: - Path=http://www.likecs.com/demo/** # 断言,路径相匹配的进行路由 filters: - TokenCheck=true

需要注意的是,这个地方自定义的过滤器名称必须是XXGatewayFilterFactory,并且配置文件中配置过滤器时名字必须时这个XX

当然,我们也可以为每个路由都添加这个过滤器,可以直接这样写配置,而不用在每个路由上都去写。

spring: cloud: gateway: default-filters: - TokenCheck=true 3.实现GlobalFilter和ordered

这个GlobalFilter从名字中就可以看出,是一个全局过滤器,也就是说实现这个接口后,所有的请求都会被过滤,我们就不需要在去找往某个路由中加过滤器了。

@Component public class TokenGlobalFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { System.out.println("这里处理自身逻辑"); return chain.filter(exchange); } @Override public int getOrder() { return 0; } }

以上就是实现自定义网关过滤器的三种方式了。实际开发中根据需求来实现合适的过滤器就可以了。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzgffd.html