springCloud主版本Greenwitch SR2 gateway版本2.1.2
网上大多教程是添加如下一段代码,然后就可以在网关拿到真实路由ip而不是路由id
但是网上教程杂七杂八,我也不记得我是抄的哪的了,然后他这个办法是直接用自定义过滤器重写了源码的 LoadBlancerClientFilter类,下图为源码
也就是这里的时候网关将注册服务的路由id改换成目标服务的ip+port+路径
然后我的自定义过滤器如下
直接重写源码LoadBlancerClientFilter,这里有一点,自定义过滤器重写LoadBlancerClientFilter之后,定义的Ordered不能小于10000
因为重写判断依据是根据
exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR);
来做的处理,源码中这个attribute的值是在RouteToRequestUrlFilter这个过滤器中才放进去的,这个过滤器的order是10000,如果小于这个数在这之前执行,那GATEWAY_SCHEME_PREFIX_ATTR这个key将无法获取
而且因为源码中的LoadBlancerClientFilter不再执行,所以
这段关键代码将不执行,然后转发的请求将会维持lb://route-id/xxx/xxx这种形式发送,结果就是。请求404
自定义过滤器-1,然后debug改写转发路由的代码
没有看到有对应gatewayRequestUrl的attribute,正常情况应该是这样的
所以自定义过滤器如果是extends LoadBlancerClientFilter的话,切记切记,order不能小于10000,当然,
如果是老老实实的实现GlobalFilter和Ordered接口的话,order优先级高了你只是无法获取到请求真实目标IP,不会影响到路由转发,网上获取真实ip的例子似乎都没太关注这个东西,要么0或者-1,-2的
这里多一句嘴,源码中替换路由id为真实ip的逻辑我没去研究,但是如果配置文件中不写当前服务的discovery-ip的话,源码的替换会直接默认网关所在机器的ip(主要是nacos,eureka时代没有实际分离服务器部署服务,不知道啥效果)
最近又升级了下整个微服务全家桶,当心会出什么幺蛾子,顺道也试了下
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式之外,好像没太大改动
以上就是填坑的记录,主要问题是在抄别人代码的时候,没太关注写法,以及那弱不起眼的order值,导致在搭新版的时候将自定义过滤器的order设为-2,然后一直拿不到目标服务的真实IP之后才去看了下源码
顺便吐槽一句,spring系列的官方文档啥时候能国际化一下下,英文看的脑阔真是咋咋疼,是咱中国不够大还是spring社区的中国人不够多啊,怎么说几乎中文也算世界第二大语言了,真就后妈养的呗.......