Spring cloud sleuth

一、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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章