spring-cloud-starter-gateway进阶版(续)
上一篇:spring-cloud-starter-gateway进阶版


上面这种方式构建是有效的,看上一篇就知道了
这里有个坑,啥坑呢?就是把配置文件里面的内容转换成代码配置时,有失效的情况,以下自己构建的失效情况
@Bean
public RouteLocator customerRemoteLocat(RouteLocatorBuilder routeLocatorBuilder) {
StripPrefixGatewayFilterFactory.Config config0 = new StripPrefixGatewayFilterFactory.Config();
config0.setParts(1);
StripPrefixGatewayFilterFactory.Config config = new StripPrefixGatewayFilterFactory.Config();
config.setParts(1);
GatewayFilter stripPrefixFilter = stripPrefixGatewayFilterFactory.apply(config);
RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
routes.route("payment_0001",
r -> r.path("/0000/payment/payment/lb/**")
.uri("lb://cloud-payment-server")
.filters(stripPrefixFilter)).build();
return routes.build();
}


接下来看下正常的:

很奇怪,就算自己构建的代码顺序是对的也不行。然后得打开调试日志:
logging.level.org.springframework.cloud.gateway: DEBUG

唯一看到的区别就是,order原生的方式是0,自己构建的后面没有order这个值。
进行代码改造:
@Configuration
public class GateWayConfig {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
StripPrefixGatewayFilterFactory.Config config = new StripPrefixGatewayFilterFactory.Config();
config.setParts(1);
GatewayFilter apply = new StripPrefixGatewayFilterFactory().apply(config);
return builder.routes()
.route("payment_0001",
r -> r.path("/0000/payment/payment/lb/**")
.filters(f -> f.filter(apply, 1
))
.uri("lb://cloud-payment-server"))
.build();
}
}
@Configuration
public class GateWayConfig {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("payment_0001",
r -> r.path("/0000/payment/payment/lb/**")
.filters(f -> f.filter(prefixPathFilter(1), 1
))
.uri("lb://cloud-payment-server"))
.build();
}
private GatewayFilter prefixPathFilter(Integer part) {
StripPrefixGatewayFilterFactory.Config config = new StripPrefixGatewayFilterFactory.Config();
config.setParts(part);
return new StripPrefixGatewayFilterFactory().apply(config);
}
}
这是能访问通了,下面制定的为1看下日志,原来就是没有指定拦截器的顺序导致的,

所以啊,还得看源码知道原理才行呀
接下来上源码:

PredicateSpec,

BooleanSpec,

UriSpec

这三个类通过继承与建造者模式进行链式处理,完成路由的信息封装。
连接器GatewayFilterSpec这里面完成了对路径的加工处理工作,具体去看源码吧,这里截取一部分
有个眼熟的在里面,里面构建了很多有用的处理

下面一篇,讲网关限流
本文来自博客园,作者:余生请多指教ANT,转载请注明原文链接:https://www.cnblogs.com/wangbiaohistory/p/18652480

浙公网安备 33010602011771号