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

Spring Cloud Gateway是基于Spring Boot 2.x和Spring WebFlux实现的网关服务,提供统一的负载均衡和路由转发的功能。它支持多种路由方式,比如URL路径匹配、请求头匹配、请求参数匹配等等。 路由转发Spring Cloud Gateway的一个重要功能,可以通过路由转发把来自客户端的请求转发到指定的目标服务。路由转发的过程中,网关会根据预定义的路由规则来匹配请求,并选择合适的目标服务进行转发Spring Cloud Gateway路由规则可以通过配置文件或者编程方式进行定义。在配置文件中,可以使用YAML或者Properties格式来定义路由规则。下面是一个YAML格式的路由规则示例: ``` spring: cloud: gateway: routes: - id: my_route uri: http://localhost:8080 predicates: - Path=/my_service/** ``` 这个示例定义了一个名为my_route的路由规则,它会把以/my_service开头的请求转发到http://localhost:8080。 除了Path,Spring Cloud Gateway还支持其他各种路由方式,比如Header、Cookie、Method、Query等等。你可以根据自己的需求选择合适的路由方式。 在路由转发过程中,Spring Cloud Gateway还可以实现负载均衡的功能。它可以根据定义的负载均衡策略来选择合适的目标服务。目前Spring Cloud Gateway支持的负载均衡策略有Round Robin、Weighted Response Time等等。 总之,Spring Cloud Gateway是一个非常强大的网关服务框架,它可以提供统一的负载均衡和路由转发的功能,并且支持多种路由方式和负载均衡策略。如果你的微服务架构需要一个可靠的网关服务,Spring Cloud Gateway是一个非常不错的选择。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值