springboot新版本(2.1.0)、springcloud新版本(Greenwich.M1)實現鏈路追蹤的一些坑

主要問題

     由於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...

clipboard.png

嗯就是這兩個傢伙
下面兩個是兩個服務

clipboard.png

eureka-server服務註冊中心,這個實現我就不講了,網上搜一大把,各個版本實現基本都是一致的,並不存在版本更新跨度極大的情況。而且這裏我把它是打包成一個jar包,在需要的時候直接用java -jar XXX.jar 直接啓動

至於product跟order(也即實際場景下各種種樣的服務A、B、C...)

order服務只有一個接口/test,去調用product的接口
clipboard.png

這裏的productclient就是使用feignf去調用order的/product/list接口

product只有一個接口/product/list,查找所有商品的列表
clipboard.png

簡單的來說,這裏的場景就是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>

其實這些都是基礎操作,是吧,那麼來點進階的。

  1. 在sleuth-cli跟zipkin-server之間插入一個消息中間件rabbitmq/kafka,這裏我舉例中只使用rabbitmq來實現
  2. 將鏈路追蹤的數據存儲到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插件看一下
clipboard.png

這真的是一個巨坑,我一直不明白是怎麼回事,直到有一次,我打開了這個頁面,花了我一天的時間去摸索是什麼原因造成的集成rabbitmq失敗,真的是被安排得明明白白
clipboard.png

最後,豪無頭緒的我,繼續在網上查找一些springboot2.x版本的一些鏈路追蹤的教程,在搜索了一個下午,我突然想起,誒不對,我應該直接去官網看它的官方教程的啊。。。雖然都英文,大不了我用chrome自帶的翻譯工具翻譯一下咯。結果就立馬打開spring的官網,選擇了最新的版本,進去找了一下,還真的讓我找到了!!!
不得不說官方文檔的重要性!
https://cloud.spring.io/sprin...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章