天天看點

當Spring Cloud Alibaba Sentinel碰上Spring Cloud Sleuth會擦出怎樣的火花

當Spring Cloud Alibaba Sentinel碰上Spring Cloud Sleuth會擦出怎樣的火花

前言

今年主要會做一個比較完整的微服務項目開源出來。目前已經開始了,剛興趣的先Star一個吧。

項目:

https://github.com/yinjihuan/kitty-cloud 基礎架構: https://github.com/yinjihuan/kitty

在做的過程中遇到一個問題那就是标題所說的兩個架構碰撞了火花。都是S開頭的誰都不服誰。

問題描述

既然使用了Sentinel來限流,那麼幹脆熔斷也直接用Sentinel好了,是以就沒使用Hystrix了。

Sentinel對Feign做了适配,使用的時候隻需要引入spring-cloud-starter-alibaba-sentinel,如下:

<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>           

然後在配置檔案打開 Sentinel 對 Feign 的支援:feign.sentinel.enabled=true就可以了。

一開始都很正常,平平淡淡的小日子過得也挺舒坦。

突然有一天,來了一位同姓但不同名的哥們,它叫Sleuth。

Sleuth文檔:

https://cloud.spring.io/spring-cloud-static/Greenwich.SR5/single/spring-cloud.html#_spring_cloud_sleuth

Spring Cloud Sleuth為Spring Cloud實作了分布式追蹤解決方案。可以配合Zipkin或者Jaeger使用。

自從Sleuth來了之後,Sentinel Feign 的日子就不好過了,莫名其妙熔斷回退失效了。

問題排查

Sentinel 對 Feign 的适配入口在SentinelFeignAutoConfiguration中。

主要是建構了Feign 的 Builder類,隻要這個類被自動配置了,那麼Sentinel 對 Feign 的支援也會生效。突然不生效了,那麼肯定是這裡有問題。

于是開啟debug模式,發現啟動的時候這裡沒有執行。feign.sentinel.enabled已經配置了,剩下就隻有@ConditionalOnMissingBean的問題了。

@ConditionalOnMissingBean的作用是如果容器中已經有Builder那麼這裡就不會執行。

接下來就要看Sleuth的代碼了,之是以能馬上知道是Sleuth影響了,是因為一開始都是正常的,加了Sleuth後就出問題了。

在Sleuth中Feign相關的配置是在TraceFeignClientAutoConfiguration中。

可以看到,Sleuth中對Feign Builder也有配置,一種是如果開啟了Hystrix就用SleuthHystrixFeignBuilder,如果沒有開啟就用SleuthFeignBuilder。

在這裡打個斷點,啟動時直接就進來了,這邊執行完後Builder對象就有了,是以Sentinel中的自然就不會執行了。

解決方案

發生沖突的根本原因在于兩個架構都要對Feign進行擴充,Sentinel擴充是為了再調用的時候可以實作限流熔斷等功能。Sleuth擴充是為了使用Feign調用接口的時候可以傳遞鍊路跟蹤的資訊。

要想解決這個問題,要麼妥協隻用一個架構,這樣是最簡單的。

要麼看看Sleuth後面會不會支援Sentinel,目前可以看到已經支援了Hystrix。

最後一種就是自己改源碼,将Sentinel融入到Sleuth中。

SleuthFeignBuilder 中隻是對Client做了包裝。

SentinelFeign 中隻是對Builder做了增強。

是以我們隻要把兩者結合起來就可以了。

PS:沒Star的現在接着Star吧!

原文位址

https://www.cnblogs.com/yinjihuan/p/12730654.html