【spring cloud】spring cloud Sleuth 和Zipkin 進行分散式鏈路跟蹤
spring cloud 分散式微服務架構下,所有請求都去找閘道器,對外返回也是統一的結果,或者成功,或者失敗。
但是如果失敗,那分散式系統之間的服務呼叫可能非常複雜,那麼要定位到發生錯誤的具體位置,就是一個比較麻煩的問題。
所以定位故障點,就引入了spring cloud Sleuth【Sleuth是獵犬的意思】 和Zipkin 【zipkin是一款開源的分散式資料跟蹤系統】。
Spring Cloud Sleuth是對Zipkin的一個封裝,對於Span、Trace等資訊的生成、接入HTTP Request,以及向Zipkin Server傳送採集資訊等全部自動完成。
最後,你可以在zipkin的UI上看到一個比較完善的追蹤結果和分析。
Zipkin提供了可插拔資料儲存方式:In-Memory、MySql、Cassandra以及Elasticsearch。接下來的測試為方便直接採用In-Memory方式進行儲存,生產推薦Elasticsearch。
一 、下面開始spring cloud整合步驟
【GitHub原始碼地址:https://github.com/AngelSXD/springcloud】
版本介紹:
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-boot.version>2.0.4.RELEASE</spring-boot.version> <spring-cloud.version>Finchley.SR1</spring-cloud.version> <lcn.last.version>4.2.1</lcn.last.version> </properties>
1.建立ms-sleuth-zipkin 子服務,新增pom.xml架包依賴【標紅部分,你們可以不需要,我的demo里正好需要才加的】
<!-- zipkin服務端 --> <dependency> <groupId>io.zipkin.java</groupId> <artifactId>zipkin-server</artifactId> <version>2.10.1</version> <!--排除--> <exclusions> <exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> </exclusion> </exclusions> </dependency> <!-- zipkin UI展示 --> <dependency> <groupId>io.zipkin.java</groupId> <artifactId>zipkin-autoconfigure-ui</artifactId> <version>2.10.1</version> </dependency>
2.啟動類加註解
package com.swapping.springcloud.ms.sleuth.zipkin; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import zipkin.server.internal.EnableZipkinServer; //啟用Zipkin服務 @EnableZipkinServer @EnableEurekaClient @SpringBootApplication(scanBasePackages = {"com.swapping"}) public class SpringcloudMsSleuthZipkinApp { public static void main(String[] args) { SpringApplication.run(SpringcloudMsSleuthZipkinApp.class, args); } }
3.配置檔案中配置基礎的配置即可【如果啟動zipkin之後,無法訪問或者報錯,參考:https://www.cnblogs.com/sxdcgaq8080/p/10007735.html】
spring.application.name=springcloud-ms-sleuth-zipkin server.port=8002 eureka.client.service-url.defaultZone=http://127.0.0.1:8000/eureka/
#zipkin啟動報錯無法訪問的解決方法
management.metrics.web.server.auto-time-requests=false
4.然後依次啟動eureka服務,和zipkin服務即可
訪問地址:【注意最後需要帶上/】
http://localhost:8002/zipkin/
可以看到頁面
5.接著,就是需要在zipkin自己服務中,和各個需要開啟鏈路跟蹤的服務的配置檔案中新增配置 ,並且新增pom依賴
我是載入父級pom中,這樣所有子module都可以用
<!-- zipkin 支援 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> </dependency>
配置【注意,spring boot 1.X的取樣率配置是spring.sleuth.sampler.percentage=1】
【我在zipkin服務、ms-member服務、ms-gateway服務、ms-integral都做了新增】
#在需要鏈路的服務 以及 zipkin服務新增配置
spring.zipkin.base-url=http://localhost:8002
#採集率
spring.sleuth.sampler.probability=1.0
關於取樣率的解釋:
Spring Cloud Sleuth有一個Sampler策略,可以通過這個實現類來控制取樣演算法。取樣器不會阻礙span相關id的產生,但是會對匯出以及附加事件標籤的相關操作造成影響。 Sleuth預設取樣演算法的實現是Reservoir sampling,具體的實現類是PercentageBasedSampler,預設的取樣比例為: 0.1(即10%)。不過我們可以通過spring.sleuth.sampler.percentage來設定,所設定的值介於0.0到1.0之間,1.0則表示全部採集。
但是如果是全部採集的話,儲存的效能需要考慮一下。
6.測試
ms-member有一個save的介面,自己做了save操作,並且feign呼叫了ms-integral服務做了save操作。【並且在最終ms-member中返回結果之前,丟擲一個除零異常】
啟動eureka
啟動閘道器ms-gateway
啟動ms-zipkin
啟動ms-member
啟動ms-integral
那麼請求的流程就是 閘道器(ms-gateway)---->ms-member--->ms-integral 【每一個結點採集到的資訊會由Sleuth 傳送給zipkin服務】
訪問地址:
http://localhost:8001/v1/ms-member/member/save?auth=111
訪問介面完成後,訪問zikpin的UI
http://localhost:8002/zipkin/
然後選擇檢視ms-gateway服務
點選進去:
從進入gateway開始看,也就是請求的第一步:
同時還可以看到:
點選依賴分析,還可以看到呼叫關係
二、Zipkin整合elasticsearch