服務調用鏈路追蹤
微服務架構是一個分佈式架構,它按業務劃分服務單元,一個分佈式系統每每有不少個服務單元。因爲服務單元數量衆多,業務的複雜性,若是出現了錯誤和異常,很難去定位。主要體如今,一個請求可能須要調用不少個服務,而內部服務的調用複雜性,決定了問題難以定位。因此微服務架構中,必須實現分佈式鏈路追蹤,去跟進一個請求到底有哪些服務參與,參與的順序又是怎樣的,從而達到每一個請求的步驟清晰可見,出了問題,很快定位。html
舉個例子,在微服務系統中,一個來自用戶的請求,請求先達到前端A(如前端界面),而後經過遠程調用,達到系統的中間件B、C(如負載均衡、網關等),最後達到後端服務D、E,後端通過一系列的業務邏輯計算最後將數據返回給用戶。對於這樣一個請求,經歷了這麼多個服務,怎麼樣將它的請求過程的數據記錄下來呢?這就須要用到服務鏈路追蹤。前端
Google開源的 Dapper鏈路追蹤組件,並在2010年發表了論文《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》,這篇文章是業內實現鏈路追蹤的標杆和理論基礎,具備很是大的參考價值。 java
常見的業界開源解決方案
一、Dapper(谷歌)web
二、Zikpin,與Spring Cloud Sleuth結合的比較好spring
三、Eagleeye(阿里)apache
四、pinpoint後端
五、skywalking瀏覽器
本文主要講述如何在Spring Cloud Sleuth中集成Zipkin。在Spring Cloud Sleuth中集成Zipkin很是的簡單,只須要引入相應的依賴和作相關的配置便可。服務器
Spring Cloud Sleuth簡介
Spring Cloud Sleuth爲Spring Cloud實現了分佈式跟蹤解決方案。網絡
術語
Span:基本工做單元。例如,發送RPC是一個新的跨度,就像發送響應到RPC同樣。跨度由跨度的惟一64位ID和跨度所屬的跟蹤的另外一個64位ID標識。跨區還具備其餘數據,例如描述,帶有時間戳的事件,鍵值註釋(標籤),引發跨度的跨區ID和進程ID(一般爲IP地址)。
跨度能夠啓動和中止,而且能夠跟蹤其時序信息。建立跨度後,您必須在未來的某個時間點將其中止。
PUT
請求造成。
Annotation:用來及時記錄一個事件的,一些核心註解用來定義一個請求的開始和結束 。這些註解包括如下:
-
- cs:客戶端已發送。客戶提出了要求。此註釋指示跨度的開始。
- sr:接收到服務器:服務器端收到了請求並開始處理它。今後時間戳中減去
cs
時間戳可顯示網絡延遲。 - ss:服務器已發送。在請求處理完成時進行註釋(當響應被髮送回客戶端時)。今後時間戳中減去
sr
時間戳將顯示服務器端處理請求所需的時間。 - cr:收到客戶。表示跨度結束。客戶端已成功收到服務器端的響應。今後時間戳中減去
cs
時間戳將顯示客戶端從服務器接收響應所需的整個時間。
圖顯示了Span和Trace在系統中的外觀以及Zipkin批註:
音符的每種顏色都表示一個跨度(從A到G共有七個spans- )。請考慮如下注意事項:
Trace Id = X Span Id = D Client Sent
該說明指出,當前跨距跟蹤編號設定爲X和Span標識設置爲d。一樣,發生了Client Sent
事件。
下圖顯示了spans的父子關係:
Zipkin簡介
Zipkin是一個分佈式跟蹤系統。它有助於收集解決服務體系結構中的延遲問題所需的時序數據。功能包括該數據的收集和查找。
鏈路追蹤案例
架構圖
Zipkin服務端搭建
一、下載Zipkin服務端jar包,能夠去網關下載,也能夠去地址:https://dl.bintray.com/openzipkin/maven/io/zipkin/java/zipkin-server/
二、使用命令啓動Zipkin服務端,命令:java -jar zipkin-server-2.12.9-exec.jar
三、使用瀏覽器訪問地址:http://127.0.0.1:9411,9411是Zipkin的默認端口
Sleuth服務提供者項目搭建
Eureka註冊中心搭建參考:【SpringCloud】快速入門(一)
一、新建一個模塊(springcloud-provider-sleuth-payment8010)做爲Slehtu服務提供者
二、修改pom文件,引入依賴zipkin + sleuth,以及eureka
1 <!-- zipkin + sleuth --> 2 <dependency> 3 <groupId>org.springframework.cloud</groupId> 4 <artifactId>spring-cloud-starter-zipkin</artifactId> 5 </dependency> 6 7 <!-- eureka client --> 8 <dependency> 9 <groupId>org.springframework.cloud</groupId> 10 <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> 11 </dependency>
查看spring-cloud-starter-zipkin依賴,能夠看到它包含了spring-cloud-starter-sleuth以及spring-cloud-starter-sleuth-zipkin依賴
完整pom文件以下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <parent> 6 <artifactId>test-springcloud</artifactId> 7 <groupId>com.test</groupId> 8 <version>1.0-SNAPSHOT</version> 9 </parent> 10 <modelVersion>4.0.0</modelVersion> 11 12 <artifactId>springcloud-provider-sleuth-payment8010</artifactId> 13 14 <dependencies> 15 16 <!-- zipkin + sleuth --> 17 <dependency> 18 <groupId>org.springframework.cloud</groupId> 19 <artifactId>spring-cloud-starter-zipkin</artifactId> 20 </dependency> 21 22 <!-- eureka client --> 23 <dependency> 24 <groupId>org.springframework.cloud</groupId> 25 <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> 26 </dependency> 27 28 <!-- spring boot --> 29 <dependency> 30 <groupId>org.springframework.boot</groupId> 31 <artifactId>spring-boot-starter-web</artifactId> 32 </dependency> 33 <dependency> 34 <groupId>org.springframework.boot</groupId> 35 <artifactId>spring-boot-starter-actuator</artifactId> 36 </dependency> 37 38 <dependency> 39 <groupId>org.springframework.boot</groupId> 40 <artifactId>spring-boot-devtools</artifactId> 41 <scope>runtime</scope> 42 <optional>true</optional> 43 </dependency> 44 45 <dependency> 46 <groupId>org.projectlombok</groupId> 47 <artifactId>lombok</artifactId> 48 <optional>true</optional> 49 </dependency> 50 <dependency> 51 <groupId>org.springframework.boot</groupId> 52 <artifactId>spring-boot-starter-test</artifactId> 53 <scope>test</scope> 54 </dependency> 55 </dependencies> 56 57 </project>
三、編輯application.yml配置文件
1 # 端口 2 server: 3 port: 8010 4 5 spring: 6 application: 7 name: cloud-sleuth-provider 8 zipkin: 9 # zipkin url地址 10 base-url: http://localhost:9411 11 sleuth: 12 sampler: 13 # 採樣率值介於 0 到 1 之間, 1 則表示所有采集 14 # 默認值:0.1,即10% 15 probability: 1 16 17 eureka: 18 client: 19 service-url: 20 defaultZone: http://localhost:8761/eureka
四、編寫啓動類
1 @SpringBootApplication 2 public class PaymentMain8010 { 3 public static void main(String[] args) { 4 SpringApplication.run(PaymentMain8010.class, args); 5 } 6 }
五、編寫Controller
1 @RestController 2 public class PaymentController { 3 4 @GetMapping("/payment/zipkin") 5 public String paymentZipkin(){ 6 return "Hi, this is payment zipkin server"; 7 } 8 }
六、測試
1)啓動Eureka註冊中心,啓動Slehtu服務提供者
2)訪問地址:http://127.0.0.1:8010/payment/zipkin,正常獲取內容
Sleuth服務消費者項目搭建
一、新建一個模塊(springcloud-consumer-sleuth-order7995)做爲Slehtu服務消費者
二、修改pom文件,引入依賴zipkin + sleuth,以及eureka,內容同上
三、編輯application.yml配置文件
1 # 端口 2 server: 3 port: 7995 4 5 spring: 6 application: 7 name: cloud-order 8 zipkin: 9 base-url: http://localhost:9411 10 sleuth: 11 sampler: 12 # 採樣率值介於 0 到 1 之間, 1 則表示所有采集 13 probability: 1 14 15 eureka: 16 client: 17 service-url: 18 defaultZone: http://localhost:8761/eureka
四、編寫啓動類
1 @SpringBootApplication 2 public class OrderMain7995 { 3 public static void main(String[] args) { 4 SpringApplication.run(OrderMain7995.class, args); 5 } 6 }
五、編寫配置類
1 @Configuration 2 public class AppConfig { 3 4 /** 5 * 注入restTemplate,請用請求rest接口 6 * @return 7 */ 8 @Bean 9 // 標註此註解後,RestTemplate就具備了客戶端負載均衡能力 10 // 負載均衡技術依賴於的是Ribbon組件~ 11 // RestTemplate都塞入一個loadBalancerInterceptor 讓其具有有負載均衡的能力 12 @LoadBalanced 13 public RestTemplate restTemplate(){ 14 return new RestTemplate(); 15 } 16 }
六、編寫controller,調用服務
1 @RestController 2 public class OrderController { 3 4 @Autowired 5 private RestTemplate restTemplate; 6 7 @GetMapping("/consumer/payment/zipkin") 8 public String paymentZipkin(){ 9 String result = restTemplate.getForObject("http://CLOUD-SLEUTH-PROVIDER" + "/payment/zipkin", String.class); 10 return result; 11 } 12 13 }
七、測試
1)啓動Eureka註冊中心,啓動Slehtu服務提供者、消費者,Zipkin服務端
2)訪問地址:http://127.0.0.1:7995/consumer/payment/zipkin,正常獲取內容
3)查看Zipkin的Web界面,地址:http://127.0.0.1:9411/zipkin,點擊查詢按鈕
顯示以下,能夠看到裏面的請求記錄,包括:ROOT(微服務名,請求方式,請求路徑)、TRACE ID、開始時間、持續時間
4)查看最近一次請求CLOUD-ORDER的詳情數據
5)打開依賴頁面,進行搜索,能夠看打時間段內,服務之間的依賴關係