SpringCloud(九):springcloud——鏈路追蹤springcloud-sleuth

Spring-Cloud-Sleuth是Spring Cloud的組成部分之一,爲SpringCloud應用實現了一種分佈式追蹤解決方案,其兼容了Zipkin, HTrace和log-based追蹤,追蹤微服務rest服務調用鏈路的問題,接觸到zipkin,而spring cloud也提供了spring-cloud-sleuth來方便集成zipkin實現。java

 爲何須要進行分佈式鏈路追蹤springcloud-sleuth呢?web

  隨着分佈式系統愈來愈複雜,你的一個請求發過發過去,各個微服務之間的跳轉,有可能某個請求某一天壓力太大了,一個請求過去沒響應,一個請求下去依賴了三四個服務,可是你去不知道哪個服務出來問題,這時候我是否是須要對微服務進行追蹤呀?監控一個請求的發起,從服務之間傳遞之間的過程,我最好記錄一下,記錄每個的耗時多久,一旦出了問題,咱們就能夠針對性的進行優化,是要增長節點,減輕壓力,仍是服務繼續拆分,讓邏輯更加簡單點呢?這時候springcloud-sleuth集成zipkin能幫咱們解決這些服務追蹤問題。spring

如下是來自springcloud官方文檔對springcloud-sleuth部分名字的解釋:

Span:基本工做單元,例如,在一個新建的span中發送一個RPC等同於發送一個迴應請求給RPC,span經過一個64位ID惟一標識,trace以另外一個64位ID表示,span還有其餘數據信息,好比摘要、時間戳事件、關鍵值註釋(tags)、span的ID、以及進度ID(一般是IP地址)
span在不斷的啓動和中止,同時記錄了時間信息,當你建立了一個span,你必須在將來的某個時刻中止它。
Trace:一系列spans組成的一個樹狀結構,例如,若是你正在跑一個分佈式大數據工程,你可能須要建立一個trace。
Annotation:用來及時記錄一個事件的存在,用於定義請求的開始和中止的一些核心註釋是:網絡

  1.cs- Client Sent -客戶端發起一個請求,這個annotion描述了這個span的開始app

  2.sr- Server Received -服務端得到請求並準備開始處理它,若是將其sr減去cs時間戳即可獲得網絡延遲maven

  3.ss- Server Sent -註解代表請求處理的完成(當請求返回客戶端),若是ss減去sr時間戳即可獲得服務端須要的處理請求時間分佈式

  4.cr- Client Received -代表span的結束,客戶端成功接收到服務端的回覆,若是cr減去cs時間戳即可獲得客戶端從服務端獲取回覆的全部所需時間ide

接下來,進行spring-cloud-sleuth來方便集成zipkin實現的演示以下:spring-boot

首先咱們在先前文章的兩個服務提供者provider1,provider2,Feign模塊,都須要引入以下依賴:微服務

    <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-sleuth-zipkin</artifactId>
            <version>1.3.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-sleuth</artifactId>
            <version>1.3.0.RELEASE</version>
        </dependency>

這裏還要說明一下,這裏要provider1和provider2模塊和Feign模塊注意springcloud的版本號的匹配,若是不跟換的話,會啓動不起來的,更換後的版本以下:

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston SR4</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

接着進行進行provider1的配置進行修改,以下:

(接着進行provider2模塊的配置文件進行修改,只須要把server.port:8081改爲8082:)

#端口號
server:
  port: 8011
#Eureka實例名,集羣中根據這裏相互識別
spring:
  application:
    name: user-service
  zipkin:
    base-url: http://localhost:9400
    enabled: true
#服務跟蹤消息收集率,1表明每一條都收集,0.1表明收集百分之10,若是不配置,有個默認的百分比的
#  sleuth:
#    sampler:
#      percentage: 0.3

eureka:
#客戶端
  client:
#註冊中心地址
    service-url:
      defaultZone: http://localhost:8001/eureka/

Feign模塊的配置修改以下:

server:
  port: 8083
spring:
  application:
    name: feign-consumer
  zipkin:
    base-url: http://localhost:9400
    enabled: true
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8001/eureka/
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutinMilliseconds: 5000
ribbon:
  connectTimeout: 500

新建一個子模塊叫作springcloud-sleuth模塊,以下圖:

 

pom要引入的依賴以下:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.12.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>Dalston.SR5</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-server</artifactId>
            <version>2.4.0</version>
        </dependency>
        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-autoconfigure-ui</artifactId>
            <version>2.4.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</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>

Sleuth模塊的配置文件以下:

server:
  port: 9400
spring:
  application:
    name: zipkin-server

Sleuth模塊啓動類以下:

@SpringBootApplication
@EnableZipkinServer
public class SleuthApplication {

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

接着分別啓動兩個Eureka註冊中心,兩個provider1,provider2模塊,1個Feign模塊,1個Sleuth模塊,以下圖:

首先進入Sleuth和zipkin整合後的鏈路跟蹤圖形化界面以下圖所視:

 

接着在經過Feign去顯示調用兩個provider1和provider2模塊的服務,http://localhost:8083/hello?name=8889999999   多按幾回F5,進行屢次請求,由於服務跟蹤消息是有收集率,1表明每一條都收集,0.1表明收集百分之10,若是不配置,有個默認的百分比的,所以須要屢次請求,確保被跟蹤消息能被收集到。以下:

 接着去ZipKin控制檯進行查看鏈路調用,以下:

 

 

 

                    好比feign-consumer 100%並且有藍色的橫條包裹表示調用成功率,紅色橫條包裹表示失敗,出現異常錯誤。

再點擊其中一個調用服務,進入能夠看到詳細信息,以下:

Zipkin容許您可視化跟蹤中的錯誤。當異常被拋出而且沒有被捕獲時,咱們在Zipkin能夠正確着色的跨度上設置適當的標籤。您能夠在痕跡列表中看到一條是紅色的痕跡。這是由於拋出了一個異常。

若是您點擊該軌跡,您將看到相似的圖片:

相關文章
相關標籤/搜索