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

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社区的中国人不够多啊,怎么说几乎中文也算世界第二大语言了,真就后妈养的呗.......

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值