07.27 Spring Cloud(六):鏈路追蹤Sleuth與Zipkin結合

一:概述

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管理後臺查看服務註冊情況

Spring Cloud(六):鏈路追蹤Sleuth與Zipkin結合

打開Zipkin的監控

Spring Cloud(六):鏈路追蹤Sleuth與Zipkin結合

開始服務的調用,同時跟蹤服務ZipKin變化

Spring Cloud(六):鏈路追蹤Sleuth與Zipkin結合

ZipKin提供了服務的追蹤和項目的依賴。

Spring Cloud(六):鏈路追蹤Sleuth與Zipkin結合

說明:Sleuth與Zipkin的結合,數據默認存放的是內存,數據傳輸通過HTPP,一旦,Sleuth Server重啟,數據將會丟失,,那我們如何保住數據的穩定性呢?下節我們結合Stream,Mysql,將對鏈路追蹤的數據持久化操作。


分享到:


相關文章: