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
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能夠正確着色的跨度上設置適當的標籤。您能夠在痕跡列表中看到一條是紅色的痕跡。這是由於拋出了一個異常。
若是您點擊該軌跡,您將看到相似的圖片: