Spring Cloud Gateway -- 关于Path的配置

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Cloud Gateway -- 关于Path的配置相关的知识,希望对你有一定的参考价值。

参考技术A 直接用官方文档的例子好了。。假设网关的地址是localhost:8080

若直接访问localhost:8080/test 则网关会匹配失败

结合一些filter更好用哦

假如应用访问地址是localhost:8001/app, 接口地址是/test,这里设置了prefixPath为/app, 那么当你访问localhost:8080/test, 网关在帮你转发请求之前,会在/test 前加上/app,转发时的请求就变成了localhost:8001/app/test。

这个filter比较灵活的就是可以进行正则匹配替换,如下的例子就是当请求localhost:8080/test时,匹配所有以/开头的路径,然后在前面加上/app,所以现在请求变成了localhost:8080/app/test。然后转发时的url变成了localhost:8001/app/test 。在测试的时候,这个filter是没办法使用模板进行匹配的。可能是因为它是用的正则进行匹配替换,所以没办法使用模板吧

值得注意的是在yml文档中 $ 要写成 $\ 。替换路径是使用的是String.replaceAll()方法,这个方法和replace()不同,是根据正则进行替换的。具体的替换规则感兴趣的话可以去了解一下Pattern。
https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html

这个filter的使用方式比较简单。就是匹配到满足/a开头的路径后重新设置路径为以/app开头。

看到这里,大家应该大概了解了模板...的具体用法了吧。模板里面的变量可通过ServerWebExchange.getAttributes()获得。具体的请参看官方文档。

最后的最后,因为好奇三种关于path的filter能不能一起用,所以做了个测试。

但是!!我们来看看SetPathGatewayFilterFactory的apply方法。一进入这个方法,path(/test)就被记录下来了。当另外两个filter的return方法执行完了之后,才会执行这个方法的return 方法。最后路径就会被替换为/a/test。所以SetPathFilter和另外两个Filter是没办法同时生效滴!

最后的最后的最后。。来打脸了。这个filter的执行顺序和配置定义的顺序是有关系的。。

按照这个顺序的话,先执行的就是将 /test替换为 /a/test,然后替换为/api/a/test,最后替换为/app/api/test。。
由此得出的结论是只要SetPath这个filter在其他两个filter之前执行的话还是不冲突的。。

spring cloud gateway 的执行流程

参考技术A 请求分发处理器,是WebFlux的访问入口。看这似曾相识的样子,没错,对应到Spring MVC中,跟它承担类似作用的,就是DispatcherServlet。DispatcherHander也和DispatcherServlet的请求处理流程类似:

执行他的核心方法:

她的本职工作是将GlobalFilter(全局过滤器)、GatewayFilter(一般来说是我们自己配置的,当然也默认内置了一些,也内含了自己在application配置文件中配的defaultFilter[如果有陪置的话]),放到同一个List里进行优先级排序,生成一个过滤器链。执行过滤器链,就能顺序执行链中保存的所有Filter。

参考文章:

spring cloud gateway 专题收录1

spring cloud gateway 专题收录2

以上是关于Spring Cloud Gateway -- 关于Path的配置的主要内容,如果未能解决你的问题,请参考以下文章

Spring Cloud实战Spring Cloud GateWay服务网关

spring cloud gateway 如何工作

Spring Cloud Gateway集成

spring cloud gateway 的执行流程

spring cloud gateway 某些路由中跳过全局过滤器

spring cloud gateway 报错 Unable to find GatewayFilterFactory with name