一:概述
spring cloud sleuth可以結合zipkin,將信息發送到zipkin,利用zipkin的存儲來存儲信息,利用zipkin ui來展示數據。
1.提供鏈路追蹤。通過sleuth可以很清楚的看出一個請求都經過了哪些服務。可以很方便的理清服務間的調用關係。
2.可視化錯誤。對於程序未捕捉的異常,可以在zipkin界面上看到。
3.分析耗時。通過sleuth可以很方便的看出每個採樣請求的耗時,分析出哪些服務調用比較耗時。當服務調用的耗時隨著請求量的增大而增大時,也可以對服務的擴容提供一定的提醒作用。
4.優化鏈路。對於頻繁地調用一個服務,或者並行地調用等,可以針對業務做一些優化措施
二: 術語
span:最基本的工作單元。由spanId來標誌。Span也可以帶有其他數據,例如:描述,時間戳,鍵值對標籤,起始Span的ID,以及處理ID(通常使用IP地址)等等。 Span有起始和結束,他們跟蹤著時間信息。span應該都是成對出現的,所以一旦創建了一個span,那就必須在未來某個時間點結束它。起始的span通常被稱為:root span。它的id通常也被作為一個跟蹤記錄的id。
traceId:一個樹結構的span集合。把相同traceId的span串起來。
annotation:用於記錄一個事件時間信息。
cs:client send。客戶端發送,一個span的開始
cr:client receive。客戶端接收。一個span的結束
ss:server send。服務器發送
sr:server receive。服務器接收,開始處理。
sr-cs和cr-ss:表示網絡傳輸時長
ss-sr:表示服務端處理請求的時長
cr-cs:表示請求的響應時長
採樣率
如果服務的流量很大,全部採集對存儲壓力比較大。這個時候可以設置採樣率,sleuth 可以通過設置 spring.sleuth.sampler.percentage=0.1。不配置的話,默認採樣率是0.1。也可以通過實現bean的方式來設置採樣為全部採樣(AlwaysSampler)或者不採樣(NeverSampler)
三:項目構建
新建三個項目,Sleuth Server,Sleuth Provider,Sleuth Consume
3.1:Sleuth Server提供服務追蹤的Zipkin界面,以便服務的的追蹤
3.1.1:pom.xml
<dependency>
<groupid>io.zipkin.java/<groupid>
<artifactid>zipkin-server/<artifactid>
<dependency>
<groupid>io.zipkin.java/<groupid>
<artifactid>zipkin-autoconfigure-ui/<artifactid>
3.1.2:application.yml
spring:
application:
name: sleuth-zipkin-server
server:
port: 9411
#服務註冊
eureka:
client:
serviceUrl:
defaultZone: http://eureka:123456@localhost:8761/eureka/
3.1.3:程序入口
@SpringBootApplication
@EnableZipkinServer //收集spans,通過zipkin-UI查詢
@EnableEurekaClient
public class SleuthServerApplication {
public static void main(String[] args) {
SpringApplication.run(SleuthServerApplication.class, args);
}
}
3.2:Sleuth Provider項目
3.2.1:pom.xml
<dependency>
<groupid>org.springframework.cloud/<groupid>
<artifactid>spring-cloud-starter-sleuth/<artifactid>
<dependency>
<groupid>org.springframework.cloud/<groupid>
<artifactid>spring-cloud-sleuth-zipkin/<artifactid>
3.2.2:application.properties
#應用(服務)名稱
spring.application.name=sleuth-zipkin-provider
#端口號
server.port=8768
#服務註冊
eureka.client.serviceUrl.defaultZone=http://eureka:123456@localhost:8761/eureka/
#zipkin中心
spring.zipkin.base-url=http://localhost:9411
spring.zipkin.enabled=true
#收集信息需要一定的比列,默認0.1 修改為1 採樣率
spring.sleuth.sampler.percentage=1
說明:採樣率默認是0.1,十次中有一次計入Zipkin,所有有時候,感覺運行了很多次項目,就是在監控平臺沒有服務的相關追蹤。
3.2.3:程序入口
@SpringBootApplication
@EnableEurekaClient
public class SleuthProviderApplication {
public static void main(String[] args) {
SpringApplication.run(SleuthProviderApplication.class, args);
}
}
3.2.4:提供一個服務
@RestController
public class SleuthProviderController {
private static final Logger LOGGER = LoggerFactory.getLogger(SleuthProviderController.class);
@GetMapping({"","/"})
public String index(){
return "this is a spring-cloud sleuth provider!";
}
/**
* 用來測試鏈路
* @return
*/
@GetMapping("/index")
public String providerIndex(){
return "Hello dy_bom ,this is a spring-cloud sleuth provider!";
}
}
3.3:Sleuth 的消費者
pom.xml,application.properties(修改端口),入口程序與Sleuth提供者代碼一致,寫一個消費者的調用測試
@RestController
public class SleuthConsumerController {
private static final Logger LOGGER = LoggerFactory.getLogger(SleuthConsumerController.class);
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
@Autowired
private RestTemplate restTemplate;
@Autowired
private Tracer tracer;
/**
* 項目說明
* @return
*/
@GetMapping({"/",""})
public String index(){
return "this is spring-cloud-sleuth-consumer";
}
/**
* 遠程服務
* @return
*/
@GetMapping( "/index")
public Object sleuthProviderIndex() {
LOGGER.info("<<<<<<<<<<<<<<<<calling>>>>>>>>>>>>>>>");/<calling>
String str = restTemplate.getForEntity("http://spring-cloud-sleuth-provider/index", String.class).getBody();
return str;
}
}
分別啟動項目Eureka Server,Sleuth Server,Sleuth Provider,Sleuth Consumer。
在Eureka Server管理後臺查看服務註冊情況
打開Zipkin的監控
開始服務的調用,同時跟蹤服務ZipKin變化
ZipKin提供了服務的追蹤和項目的依賴。
說明:Sleuth與Zipkin的結合,數據默認存放的是內存,數據傳輸通過HTPP,一旦,Sleuth Server重啟,數據將會丟失,,那我們如何保住數據的穩定性呢?下節我們結合Stream,Mysql,將對鏈路追蹤的數據持久化操作。
閱讀更多 nicky猿 的文章