spring cloud gateway获取真实ip以及跨服务器时路由转发的一些问题

时间:2024-04-13 21:08:30

springCloud主版本Greenwitch SR2  gateway版本2.1.2

网上大多教程是添加如下一段代码,然后就可以在网关拿到真实路由ip而不是路由id

但是网上教程杂七杂八,我也不记得我是抄的哪的了,然后他这个办法是直接用自定义过滤器重写了源码的 LoadBlancerClientFilter类,下图为源码

spring cloud gateway获取真实ip以及跨服务器时路由转发的一些问题

也就是这里的时候网关将注册服务的路由id改换成目标服务的ip+port+路径

然后我的自定义过滤器如下

spring cloud gateway获取真实ip以及跨服务器时路由转发的一些问题

 

spring cloud gateway获取真实ip以及跨服务器时路由转发的一些问题

直接重写源码LoadBlancerClientFilter,这里有一点,自定义过滤器重写LoadBlancerClientFilter之后,定义的Ordered不能小于10000

因为重写判断依据是根据 

exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR);

来做的处理,源码中这个attribute的值是在RouteToRequestUrlFilter这个过滤器中才放进去的,这个过滤器的order是10000,如果小于这个数在这之前执行,那GATEWAY_SCHEME_PREFIX_ATTR这个key将无法获取

spring cloud gateway获取真实ip以及跨服务器时路由转发的一些问题

而且因为源码中的LoadBlancerClientFilter不再执行,所以

spring cloud gateway获取真实ip以及跨服务器时路由转发的一些问题

这段关键代码将不执行,然后转发的请求将会维持lb://route-id/xxx/xxx这种形式发送,结果就是。请求404

spring cloud gateway获取真实ip以及跨服务器时路由转发的一些问题自定义过滤器-1,然后debug改写转发路由的代码

spring cloud gateway获取真实ip以及跨服务器时路由转发的一些问题

没有看到有对应gatewayRequestUrl的attribute,正常情况应该是这样的

spring cloud gateway获取真实ip以及跨服务器时路由转发的一些问题

所以自定义过滤器如果是extends LoadBlancerClientFilter的话,切记切记,order不能小于10000,当然,

如果是老老实实的实现GlobalFilter和Ordered接口的话,order优先级高了你只是无法获取到请求真实目标IP,不会影响到路由转发,网上获取真实ip的例子似乎都没太关注这个东西,要么0或者-1,-2的

这里多一句嘴,源码中替换路由id为真实ip的逻辑我没去研究,但是如果配置文件中不写当前服务的discovery-ip的话,源码的替换会直接默认网关所在机器的ip(主要是nacos,eureka时代没有实际分离服务器部署服务,不知道啥效果)

spring cloud gateway获取真实ip以及跨服务器时路由转发的一些问题

 

 

最近又升级了下整个微服务全家桶,当心会出什么幺蛾子,顺道也试了下

 

cloud  Greenwich.SR2——>Hoxton.SR8

gateway 2.1.2 ——>2.2.5

spring boot  2.1.6.RELEASE ——>2.3.4.RELEASE

alibaba cloud——>2.2.3.RELEASE

nacos 2.1.0.RELEASE——>1.3.2

本质上没有太大区别,除了要废弃LoadBlancerClientFilter,使用流行的Reactive式之外,好像没太大改动

spring cloud gateway获取真实ip以及跨服务器时路由转发的一些问题

以上就是填坑的记录,主要问题是在抄别人代码的时候,没太关注写法,以及那弱不起眼的order值,导致在搭新版的时候将自定义过滤器的order设为-2,然后一直拿不到目标服务的真实IP之后才去看了下源码

顺便吐槽一句,spring系列的官方文档啥时候能国际化一下下,英文看的脑阔真是咋咋疼,是咱中国不够大还是spring社区的中国人不够多啊,怎么说几乎中文也算世界第二大语言了,真就后妈养的呗.......