一、spring cloud sleuth
1.Spring-Cloud-Sleuth:是Spring Cloud的組成部分之一,爲SpringCloud應用實現了一種分佈式追蹤解決方案,其兼容了Zipkin, HTrace和log-based追蹤
2.Span:基本工作單元,例如,在一個新建的span中發送一個RPC等同於發送一個迴應請求給RPC,span通過一個64位ID唯一標識,trace以另一個64位ID表示,span還有其他數據信息,比如摘要、時間戳事件、關鍵值註釋(tags)、span的ID、以及進度ID(通常是IP地址)
span在不斷的啓動和停止,同時記錄了時間信息,當你創建了一個span,你必須在未來的某個時刻停止它。
3.Trace:一系列spans組成的一個樹狀結構,例如,如果你正在跑一個分佈式大數據工程,你可能需要創建一個trace。
4.Annotation:用來及時記錄一個事件的存在,一些核心annotations用來定義一個請求的開始和結束
1)cs(Client Sent) :客戶端發起一個請求,這個annotion描述了這個span的開始
2)sr(Server Received): 服務端獲得請求並準備開始處理它,如果將其sr減去cs時間戳便可得到網絡延遲
3)ss(Server Sent):註解表明請求處理的完成(當請求返回客戶端),如果ss減去sr時間戳便可得到服務端需要的處理請求時間
4)cr(Client Received):表明span的結束,客戶端成功接收到服務端的回覆,如果cr減去cs時間戳便可得到客戶端從服務端獲取回覆的所有所需時間
二、實例:http通信方式、Mq異步通信+Mysql方式、Mq異步通信+elasticsearch方式
建三個項目:server-monitor監控(負責數據收集以及信息展示功能)、consumer-beehive服務消費者、provider-user服務提供者
1.http方式:將數據保存到內存中,但是生產環境還是需要將數據持久化中
1)server-monitor:
a.pom.xml依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>io.zipkin.java</groupId> <artifactId>zipkin-server</artifactId> </dependency> <dependency> <groupId>io.zipkin.java</groupId> <artifactId>zipkin-autoconfigure-ui</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
b.**Application.java:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import zipkin.server.EnableZipkinServer; @SpringBootApplication @EnableZipkinServer //將http改爲mq時,用EnableZipkinStreamServer代替 public class ServerMonitorApplication { public static void main(String[] args){ SpringApplication.run(ServerMonitorApplication.class,args); } }
c.application.yml:
server: port: 8050 spring: application: name: server-monitor output: ansi: enabled: always encrypt: failOnError: false
d.bootstap.yml:
spring: zipkin: base-url: http://10.83.3.12:8050 eureka: client: serviceUrl: defaultZone: http://10.83.3.1:8761/eureka/,http://10.83.3.2:8762/eureka/,http://10.83.3.3:8763/eureka/ instance: prefer-ip-address: true #指定自身服務的顯示ip形式 ip-address: ${spring.cloud.client.ipAddress} instance-id: ${spring.cloud.client.ipAddress}:${server.port}
2)provider-user 和 consumer-beehive配置
a.pom.xml:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-sleuth-zipkin</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency>
b.application.yml:
server: port: 8001 spring: application: name: provider-user #consumer-beehive項目就填:consumer-beehive output: ansi: enabled: always
c.bootstrap.yml:
spring: zipkin: base-url: http://10.83.3.12:8050
eureka: client: serviceUrl: defaultZone: http://10.83.3.1:8761/eureka/,http://10.83.3.2:8762/eureka/,http://10.83.3.3:8763/eureka/ instance: prefer-ip-address: true #指定自身服務的顯示ip形式 ip-address: ${spring.cloud.client.ipAddress} instance-id: ${spring.cloud.client.ipAddress}:${server.port}
3)測式:
a.訪問:http://localhost:8050
剛開始service name可能無法選擇,說明目前沒有數據,我們查看數據庫也可以看到沒有任何數據信息
b.訪問consumer-beehive,調用provider-user方法:
b1.http://10.83.29.110:8020/consumerBeehive/1
b2.再刷新a中的請求,這時service name可選擇consumer-beehive或proivder-user
b3.點Find Traces按鈕,就可看到調用的鏈路和耗時情況
b4.點Dependencies,可看到調用關係
4)優缺:
a.spring-cloud-sleuth收集信息是有一定的比率的,默認的採樣率是0.1,配置此值的方式在配置文件中增加spring.sleuth.sampler.percentage參數配置(如果不配置默認0.1),如果我們調大此值爲1,可以看到信息收集就更及時.
但是對同一個請求兩次耗時信息相差非常大,spring-cloud-sleuth這種追蹤服務調用鏈路會給我們業務程序性能帶來一定的影響
b.zipkin客戶端向zipkin-server程序發送數據使用的是http的方式通信,每次發送的時候涉及到連接和發送過程。
c.當我們的zipkin-server程序關閉或者重啓過程中,因爲客戶端收集信息的發送採用http的方式會被丟失。
5)改進的辦法是
a.通信採用socket或者其他效率更高的通信方式。
b.客戶端數據的發送儘量減少業務線程的時間消耗,採用異步等方式發送收集信息。
c.客戶端與zipkin-server之間增加緩存類的中間件,例如redis、MQ等,在zipkin-server程序掛掉或重啓過程中,客戶端依舊可以正常的發送自己收集的信息。
2.Mq異步通信+Mysql方式:
1)server-monitor:
a.pom.xml
a1.去掉io.zipkin.java:zipkin-server
a2.添加spring-cloud-sleuth-zipkin-stream和spring-cloud-starter-stream-rabbit
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-sleuth-zipkin-stream</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-stream-rabbit</artifactId> </dependency>
b.**Application.java
b1.去掉@EnableZipkinServer註解
b2.添加@EnableZipkinStreamServer註解
c.bootstrap.yml
spring: zipkin: base-url: http://10.83.3.12:8050 sleuth: enabled: false #表示當前程序不使用sleuth datasource: #數據庫腳本創建地址,當有多個是可使用[x]表示集合第幾個元素,spring boot數據源配置 schema: classpath:/zipkin.sql driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://10.83.3.16:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false username: root password: root initialize: true continue-on-error: true rabbitmq: #rabbitmq配置 host: 10.83.3.0 port: 5672 username: guest password: guest eureka: client: serviceUrl: defaultZone: http://10.83.3.1:8761/eureka/,http://10.83.3.2:8762/eureka/,http://10.83.3.3:8763/eureka/ instance: prefer-ip-address: true #指定自身服務的顯示ip形式 ip-address: ${spring.cloud.client.ipAddress} instance-id: ${spring.cloud.client.ipAddress}:${server.port} #zipkin數據保存到數據庫中需要進行如下配置 zipkin: storage: type: mysql #表示zipkin數據存儲方式是mysql
d.sql文件:
在resource下添加:zipkin.sql文件。
注:具體zipkin.sql可搜索官方的。
2)provider-user 和 consumer-beehive配置
a.pom.xml
a1.去掉spring-cloud-starter-zipkin
a2.添加spring-cloud-sleuth-zipkin-stream和spring-cloud-starter-stream-rabbit
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-sleuth-zipkin-stream</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-stream-rabbit</artifactId> </dependency>
b.bootstrap.yml:添加mq配置
rabbitmq: #rabbitmq配置 host: 10.83.3.0 port: 5672 username: guest password: guest
3.Mq異步通信+elasticsearch方式:
1)server-monitor:
a.pom.xml
a1.去掉mqsql 的相關配置
a2.添加elasticsearch配置
<dependency> <groupId>io.zipkin.java</groupId> <artifactId>zipkin</artifactId> <version>1.24.0</version> </dependency> <!--保存到數據庫需要如下依賴--> <!-- 添加 spring-data-elasticsearch的依賴 --> <dependency> <groupId>io.zipkin.java</groupId> <artifactId>zipkin-autoconfigure-storage-elasticsearch-http</artifactId> <version>1.24.0</version> <optional>true</optional> </dependency>
b.bootstrap.yml
b1.去掉mqsql 的相關配置
b2.添加elasticsearch配置
spring: zipkin: base-url: http://10.83.3.12:8050 sleuth: enabled: false #表示當前程序不使用sleuth rabbitmq: #rabbitmq配置 host: 10.83.3.0 port: 5672 username: guest password: guest eureka: client: serviceUrl: defaultZone: http://10.83.3.1:8761/eureka/,http://10.83.3.2:8762/eureka/,http://10.83.3.3:8763/eureka/ instance: prefer-ip-address: true #指定自身服務的顯示ip形式 ip-address: ${spring.cloud.client.ipAddress} instance-id: ${spring.cloud.client.ipAddress}:${server.port} #zipkin數據保存到數據庫中需要進行如下配置 zipkin: storage: type: elasticsearch #表示zipkin數據存儲方式是elasticsearch StorageComponent: elasticsearch elasticsearch: cluster: elasticsearch-zipkin-cluster hosts: 127.0.0.1:9300 max-requests: 64 index: zipkin index-shards: 5 index-replicas: 1
2)provider-user 和 consumer-beehive配置 不變。
3)問題:若dependencies有問題,不能顯示依賴關係
解決:添加jar:io.zipkin.dependencies:zipkin-dependencies