springcloud微服務系列教程(十) 鏈路追蹤組件 SpringCloudSleuth

前言

前面幾篇博文咱們講了Spring Cloud的一些基礎組件,實際上經過這些組件的結合咱們已經能夠搭建一個基礎的微服務架構了,然而,在實際應用中,隨着業務的發展,微服務的數量會愈來愈多,服務之間的調用關係也會愈來愈複雜,一個請求可能會通過多個微服務的協做調用來獲取結果,這時候,全局的服務鏈路追蹤顯得很是必要,一旦一個請求出現失敗的回調,咱們能夠立馬經過服務追蹤來尋找錯誤根源並加以修改。html

Spring Cloud Sleuth 主要功能就是在分佈式系統中提供追蹤解決方案 ,而且兼容了zipkin,提供了REST API接口來輔助咱們查詢跟蹤數據以實現對分佈式系統的監控程序 。java

Spring Cloud Sleuth 簡介

下面這段文字是從官網翻譯過來的,讀者有興趣能夠到官網查看原文 http://cloud.spring.io/spring-cloud-static/Finchley.RELEASE/single/spring-cloud.htmlgit

Spring Cloud Sleuth 借用了 Dapper 的術語github

  • Span:基本工做單元,例如,在一個新建的span中發送一個RPC等同於發送一個迴應請求給RPC,span經過一個64位ID惟一標識,trace以另外一個64位ID表示,span還有其餘數據信息,好比摘要、時間戳事件、關鍵值註釋(tags)、span的ID、以及進度ID(一般是IP地址) 。web

    span在不斷的啓動和中止,同時記錄了時間信息,當你建立了一個span,你必須在將來的某個時刻中止它。 spring

    最初的 span 是從一個叫 root span 開啓鏈路的,span 中 ID的值等於 追蹤的ID。apache

  • Trace:一系列spans組成的一個樹狀結構,例如,若是你正在跑一個分佈式大數據工程,你可能須要建立一個trace。瀏覽器

  • Annotation:用來及時記錄一個事件的存在,一些核心annotations用來定義一個請求的開始和結束 服務器

    • cs - Client Sent -客戶端發起一個請求,這個annotion描述了這個span的開始
    • sr - Server Received -服務端得到請求並準備開始處理它,若是將其sr減去cs時間戳即可獲得網絡延遲
    • ss - Server Sent -註解代表請求處理的完成(當請求返回客戶端),若是ss減去sr時間戳即可獲得服務端須要的處理請求時間
    • cr - Client Received -代表span的結束,客戶端成功接收到服務端的回覆,若是cr減去cs時間戳即可獲得客戶端從服務端獲取回覆的全部所需時間

下面的圖片顯示 Span和Trace配合Zipkin註解 在系統中的查看情形:
這裏寫圖片描述
每個標註的顏色表示一個span,(有七個span,從A到G),例以下面的標註:網絡

Trace Id = X
Span Id = D
Client Sent

這些語句代表了當前的span 有值設爲XTrace Id 和 值爲 DSpan Id

下面的圖片顯示了span 視圖中的父子關係:
這裏寫圖片描述
以上就是對於這個組件的一些術語信息的簡單介紹。

準備工程

前面講到,Spring Cloud Sleuth 兼容了Zipkin。Zipkin是Twitter的一個開源項目,它基於Google Dapper實現。咱們可使用它來收集各個服務器上請求鏈路的跟蹤數據,並經過它提供的REST API接口來輔助咱們查詢跟蹤數據以實現對分佈式系統的監控程序 。

因此,在本章的案例中,咱們須要有三個工程,一個是提供收集調用數據的zipkin-server,還有兩個對外暴露接口的工程trace-A和trace-B,兩個工程都向外暴露接口可供其餘服務調用,一旦調用成功,zipkin-server就能夠記錄服務調用的鏈路追蹤數據。

首先須要準備zipkin-server工程,Spring Cloud官方提供了一系列關於zipkin-server工程的jar,開發者直接下載並啓動便可使用,筆者使用的 zipkin-server-2.10.4-exec.jar 的jar 包,下載地址爲https://dl.bintray.com/openzipkin/maven/io/zipkin/java/zipkin-server/2.10.4/zipkin-server-2.10.4-exec.jar

運行ctrl + R ,輸入cmd,打開命令行窗口跳轉到jar所在的文件路徑下,運行

java -jar zipkin-server-2.10.1-exec.jar

開啓成功後能夠看到工程的端口爲 9411.
這裏寫圖片描述
打開瀏覽器訪問 http://localhost:9411,會出現這樣的界面,
這裏寫圖片描述
這是zipkin-server中集成的ui界面,點擊 「查找調用鏈 」 能夠查看服務的追蹤鏈路關係。由於如今咱們沒有啓動服務在互相調用,因此這裏看不到鏈路。

新建兩個服務工程

新建一個module工程,命名爲trace-A,在pom文件中加入web的基礎依賴以及spring-cloud-start-zipkin依賴 ,具體代碼以下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>

   <groupId>com.yeya</groupId>
   <artifactId>zipkin</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>trace-A</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.0.4.RELEASE</version>
      <relativePath/> <!-- lookup parent from repository -->
   </parent>

   <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
      <java.version>1.8</java.version>
      <spring-cloud.version>Finchley.SR1</spring-cloud.version>
   </properties>

   <dependencies>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-zipkin</artifactId>
      </dependency>

      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>

   <dependencyManagement>
      <dependencies>
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
         </dependency>
      </dependencies>
   </dependencyManagement>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
</project>

接着,配置application.yml,

server:
  port: 8886
spring:
  zipkin:
    base-url: http://localhost:9411
  application:
    name: trace-A

其中,base-url表明的是zipkin-server工程的地址,這樣就能被zipkin-server所追蹤。
配置好以後,寫好兩個接口,分別是 返回調用其餘服務的結果的接口 「hello」 以及輸出本服務信息的接口 「info」,
代碼以下:

@SpringBootApplication
@RestController
public class TraceAApplication { 
 
   

   public static void main(String[] args) {
      SpringApplication.run(TraceAApplication.class, args);
   }

   @Autowired
   private RestTemplate restTemplate;

   @Bean
   public RestTemplate getRestTemplate(){
      return new RestTemplate();
   }

   @RequestMapping("/hello")
   public String toTraceA(){
      return restTemplate.getForObject("http://localhost:8887/info", String.class);
   }

   @RequestMapping("/info")
   public String info(){
      return "trace A";

   }
}

接着建立新的module工程trace-B,建立過程同trace-A,引入相同的依賴並添加配置,在應用啓動類中一樣加兩個接口 「hi」 和 「info」,

@RequestMapping("/hi")
public String toTraceB(){
   return restTemplate.getForObject("http://localhost:8886/info", String.class);
}

@RequestMapping("/info")
public String info(){
   return "trace B";

}

添加代碼後,依次啓動兩個工程,在瀏覽器訪問 http://localhost:8886/hello,窗口會顯示

trace B

一樣,訪問 http://localhost:8887/hi ,會顯示

trace A

這是,咱們從新訪問 http://localhost:9411 ,點擊 「依賴分析」 能夠看到 服務的調用鏈路關係
這裏寫圖片描述
訪問首頁的 「find traces」 能夠查看服務間調用的具體數據
這裏寫圖片描述
到這裏,咱們的服務鏈路追蹤就實現了,是否是以爲很簡單,實際上是zipkin幫咱們作了不少事,有興趣的讀者能夠經過debug來跟蹤源碼查看,這樣對於組件的運行過程會有比較好的瞭解。

源碼地址:https://github.com/Taoxj/SpringCloudDemo/tree/master/feign

本文分享 CSDN - 鄙人薛某。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索