主要問題
由於springboot新版本(2.1.0)、springcloud新版本(Greenwich.M1)實現鏈路追蹤sleuth+zipkin的一些“新特性”,使得我在實現sleuth+zipkin的過程上踩了不少坑。
在springboot1.X版本的時候,實現鏈路追蹤服務需要用戶自己實現client以及server,通常在server服務端需要引入各種各樣的包(spring-cloud-sleuth-stream,以及支持zipkin的一些相關依賴包等等);
但在spring cloud新版本實現鏈路追蹤sleuth+zipkin的方式上已經不再需要自己再去實現一個server服務端(集成sleuth+zipkin),而是由zinkin官方提供了一個現成的zipkin-server.jar,或者是一個docker鏡像,用戶可以下載並通過命令進行啓動它,用戶可以通一些配置來確定sleuth收集到信息後傳輸到zipkin之間採用http,還是通過rabbit/kafka的方式。在新的版本下,用戶只需要關注slenth-client選用何種傳輸方式(http或mq(rabbit/kafka),如果選擇http,則在配置中指明base-url;如果選擇mq,則在配置指明相關消息中間件的相關信息host/port/username/password...),至於zipkin的信息storage問題,則由zipkin-server要負責,可以通過zipkin-server.jar 配置一些具體的參數來啓動。(下面會細講)
ps:這不是教程貼,這主要是解決一些問題的一些方法,不會有詳細的實現過程,但爲了簡明我會貼上部分代碼。
背景
最近開始實習了,老大讓我自學一下sc(spring cloud),學就學嘛,也不是難事。看完spring cloud的全家桶,老大說讓我重點了解一下它的鏈路追蹤服務,後期會有這方面的任務安排給我做,所以呢我就重點關注這一方面,打算自己做個demo練練手,看了網上的教程,膨脹的我選擇了個最新的版本,結果發現就這麼掉坑裏了。。。
版本
按照慣例,先說下springboot跟spring cloud的版本
springboot:2.1.0
springcloud:Greenwich.M1
個人建議新手不要過分追求新版本,舊版本的還是夠用的,比springboot 2.6.0搭配sringcloud Finchley SR2還是挺穩的,如果真的要探索新版本你會發現這裏面的坑實在是踩不完,基本要花個一兩天才能讓自己從坑裏跳出去,這樣頻繁踩坑會讓新手很容易放棄~~~
ps:不要問我爲什麼知道。。。
主要問題
閒話扯完了,可以進入正題了
一共四個服務
eureka-server
zipkin-server:新版本的zipkin服務端,負責接受sleuth發送過來的數據,完成處理、存儲、建立索引,並且提供了一個可視化的ui數據分析界面。
需要的同學話可以直接在github上下載https://github.com/openzipkin...
嗯就是這兩個傢伙
下面兩個是兩個服務
eureka-server服務註冊中心,這個實現我就不講了,網上搜一大把,各個版本實現基本都是一致的,並不存在版本更新跨度極大的情況。而且這裏我把它是打包成一個jar包,在需要的時候直接用java -jar XXX.jar 直接啓動
至於product跟order(也即實際場景下各種種樣的服務A、B、C...)
order服務只有一個接口/test,去調用product的接口
這裏的productclient就是使用feignf去調用order的/product/list接口
product只有一個接口/product/list,查找所有商品的列表
簡單的來說,這裏的場景就是order服務--(去調用)-->product服務
說完場景後,貼一下這兩個服務的相關配置信息(order跟producet的配置基本上是相同的)
application.yml
spring:
application:
#服務名
name: product
#由於業務邏輯需要操作數據庫,所以這裏配置了mysql的一些信息
datasource:
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 123456
url: jdbc:mysql://127.0.0.1:3306/sc_sell?characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
jpa:
show-sql: true
#重點
zipkin:
#base-url:當你設置sleuth-cli收集信息後通過http傳輸到zinkin-server時,需要在這裏配置
base-url: http://localhost:9411
enabled: true
sleuth:
sampler:
#收集追蹤信息的比率,如果是0.1則表示只記錄10%的追蹤數據,如果要全部追蹤,設置爲1(實際場景不推薦,因爲會造成不小的性能消耗)
probability: 1
eureka:
client:
service-url:
#註冊中心地址
defaultZone: http://localhost:8999/eureka/
logging:
level:
#這個是設置feign的一個日誌級別,key-val的形式設置
org.springframework.cloud.openfeign: debug
說完配置信息,就該講一下依賴了,很簡單,client實現鏈路追蹤只需要添加一個依賴spring-cloud-starter-zipkin。就是這個
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
其實這些都是基礎操作,是吧,那麼來點進階的。
- 在sleuth-cli跟zipkin-server之間插入一個消息中間件rabbitmq/kafka,這裏我舉例中只使用rabbitmq來實現
- 將鏈路追蹤的數據存儲到DB上,目前zipkin暫時只支持mysql/elasticsearch,這裏我使用mysql
如果你是剛開始學習sc,給你去實現的話,你肯定會開始打開瀏覽器開始搜索教程。
結果你會發現,大部分博客上都是以前版本的實現方式,一些較舊會讓你自己實現一個zipkin-server(我懷疑他們的版本是1.x),你會發現很鬱悶,因爲這跟你想象的不太一樣啊。
繼續找,終於在茫茫帖子中,找到了一篇是關於springboot2.0.X版本的實現鏈路追蹤的教程,這時候你會興奮,終於找到靠譜一點的啊,喜出望外有木有啊,但是,事情還沒完,它會讓你在客戶端依賴下面這個依賴包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin-stream</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-stream</artifactId>
</dependency>
結果你會發現,你在依賴它的時候,其實是依賴不了,爲什麼?因爲版本的問題,什麼?你跟我說你的pom文件沒報錯啊,但是,你打開idea右邊的maven插件看一下
這真的是一個巨坑,我一直不明白是怎麼回事,直到有一次,我打開了這個頁面,花了我一天的時間去摸索是什麼原因造成的集成rabbitmq失敗,真的是被安排得明明白白
最後,豪無頭緒的我,繼續在網上查找一些springboot2.x版本的一些鏈路追蹤的教程,在搜索了一個下午,我突然想起,誒不對,我應該直接去官網看它的官方教程的啊。。。雖然都英文,大不了我用chrome自帶的翻譯工具翻譯一下咯。結果就立馬打開spring的官網,選擇了最新的版本,進去找了一下,還真的讓我找到了!!!
不得不說官方文檔的重要性!
https://cloud.spring.io/sprin...