一、问题介绍
这两天在做服务迁移,替换原有的网关和consul注册中心。改造成spring cloud gateway + nacos的架构组合。原本验证没发现什么问题,但是发布生产环境后,发现有服务乱串的现象。大概过程如下:
> curl -X GET http://gateway/service-A/api/v1/test
> service-A success
> curl -X GET http://gateway/service-B/admin/api/v1/test
> service-B success
> curl -X GET http://gateway/service-B/api/v1/test
> service-A success
> curl -X GET http://gateway/service-A/api/v1/test
> service-B 404 fail
> curl -X GET http://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-ribbon | 2.2.2.RELEASE | 替换前 |
spring-cloud-starter-loadbalancer | 2.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>