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这里面完成了对路径的加工处理工作,具体去看源码吧,这里截取一部分

 有个眼熟的在里面,里面构建了很多有用的处理

 下面一篇,讲网关限流

posted @ 2025-01-04 21:41  余生请多指教ANT  阅读(15)  评论(0)    收藏  举报