SpringCloudGateway+Nacos出现服务乱串的问题记录
⼀、问题介绍
这两天在做服务迁移,替换原有的⽹关和consul注册中⼼。改造成spring cloud gateway + nacos的架构组合。原本验证没发现什么问题,但是发布⽣产环境后,发现有服务乱串的现象。⼤概过程如下:
> curl -X GET gateway/service-A/api/v1/test
> service-A success
> curl -X GET gateway/service-B/admin/api/v1/test
> service-B success
springcloud和springboot> curl -X GET gateway/service-B/api/v1/test
> service-A success
> curl -X GET gateway/service-A/api/v1/test
> service-B 404 fail
> curl -X GET gateway/service-B/admin/api/v1/test
> service-A 404 fail
⼤致上来讲就是服务完全乱掉了,从表现上看客户端的loadbalancer⽆法正确命中。后来翻看⽹上资料,到了唯⼀⼀篇讲这个问题的⽂章,简单的说了下需要移除rabbion的负载均衡器。结合着零散的资料,⾃⼰⼜在本地做了⼀些测试,最终解决了问题。
核⼼⽅案(替换LoadBalancerClient):⽤ spring-cloud-starter-loadbalancer 替换 spring-cloud-starter-netflix-ribbon
⼆、个⼈项⽬组件依赖
gateway使⽤spring-cloud-starter-netflix-ribbon 做负载均衡有问题,估计也有版本不匹配的问题。我这⾥没有深究如何去匹配合适的版本,罗列个⼈的jar包依赖情况如下
组件版本
spring-boot  2.1.8.RELEASE
spring-cloud-gateway-starter  2.1.5.RELEASE
spring-cloud-starter-netflix-ribbon2.2.2.RELEASE替换前
spring-cloud-starter-loadbalancer2.2.2.RELEASE替换后
三、简单的排查
本地调试了⼀下ribbon的负载均衡,发现按照上述的测试。⼀旦请求报错,ribbon创建负载均衡器就会错乱。本来请求service-A,结果给我返回service-B的loadbalancer。源码逻辑⽐较复杂,没有深究。
四、解决问题
4.1、排除掉rabbion的相关依赖
4.2、依赖spring-cloud-starter-loadbalancer
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>