一、問題介紹
這兩天在做服務遷移,替換原有的網關和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>