一、簡(jiǎn)介
微服務(wù)結(jié)構(gòu)是一個(gè)分布式架構(gòu)拐纱,微服務(wù)系統(tǒng)按照業(yè)務(wù)劃分服務(wù)單元铜异,一個(gè)微服務(wù)系統(tǒng)往往有很多個(gè)服務(wù)單元。由于服務(wù)單元數(shù)量眾多秸架,服務(wù)單元之間的調(diào)用很復(fù)雜揍庄,一旦出現(xiàn)錯(cuò)誤和異常,很難去定位咕宿。所以在微服務(wù)架構(gòu)中必須實(shí)現(xiàn)分布式服務(wù)鏈路追蹤币绩。目前,常見的鏈路追蹤組件有Google的Dapper府阀,Twitter的Zipkin缆镣,以及阿里的Eagleeye(鷹眼)等,它們都是非常優(yōu)秀的鏈路追蹤開源組件试浙。
本章主要講述如何在Spring Cloud Sleuth中集成Zipkin董瞻。
二、基本術(shù)語
- Span:基本哦工作單元田巴,發(fā)送一個(gè)遠(yuǎn)程調(diào)度任務(wù)就會(huì)產(chǎn)生一個(gè)Span钠糊,Span是用一個(gè)64位ID唯一標(biāo)識(shí)的,Trace是用另一個(gè)64位ID唯一標(biāo)識(shí)的壹哺。Span還包含了其它信息抄伍,例如:摘要,時(shí)間戳事件管宵,Span的ID以及進(jìn)程ID;
- Trace:由一系列的Span組成截珍,呈樹狀結(jié)構(gòu)。請(qǐng)求一個(gè)微服務(wù)系統(tǒng)的API接口箩朴,這個(gè)API接口需要調(diào)用多個(gè)微服務(wù)單元岗喉,調(diào)用每個(gè)微服務(wù)單元都會(huì)產(chǎn)生一個(gè)新的Span,所有由這個(gè)請(qǐng)求產(chǎn)生的Span組成這個(gè)Trace;
- Annotation:用于記錄一個(gè)事件炸庞,一些核心注解用于定義一個(gè)請(qǐng)求的開始和結(jié)束钱床,這些注解如下:
- cs - Client Sent:客戶端發(fā)送一個(gè)請(qǐng)求,表示Span的開始
- sr - Server Received:服務(wù)端接收請(qǐng)求并準(zhǔn)備開始處理它埠居。(sr-cs)等于網(wǎng)絡(luò)的延遲
- ss - Server Sent:服務(wù)端發(fā)送響應(yīng)查牌,該注解表明請(qǐng)求處理的完成。(ss-sr)表示服務(wù)端處理請(qǐng)求的時(shí)間
- cr - Client Received:客戶端接收響應(yīng)拐格,此時(shí)Span結(jié)束僧免。(cr-cs)表示整個(gè)請(qǐng)求所消耗的時(shí)間
如果一個(gè)服務(wù)的調(diào)用關(guān)系如下:
調(diào)用關(guān)系
那么此時(shí)將Span和Trace在一個(gè)系統(tǒng)中使用Zipkin注解的過程圖形化:
Zipkin注解的過程圖形化
每個(gè)顏色的表明一個(gè)Span(總計(jì)7個(gè)Spans,從A到G)捏浊,每個(gè)Span有類似的信息:
Trace Id = X
Span Id = D
Client Sent
此Span表示Span的Trance Id是X懂衩,Span Id是D,同時(shí)它發(fā)送一個(gè)Client Sent事件金踪。
Spans 的parent/child關(guān)系圖形化如下:
Spans的parent/child關(guān)系圖形化
三浊洞、Spring Cloud Sleuth + Zipkin整合案例
3.1 相關(guān)工程說明
服務(wù) | 端口 | 服務(wù)說明 |
---|---|---|
eureka | 8761 | 服務(wù)注冊(cè)于發(fā)現(xiàn) |
provider | 8800 | 服務(wù)提供者 |
consumer | 8801 | 服務(wù)消費(fèi)者 |
chainMonitor | 8770 | 鏈路追蹤服務(wù)端 |
3.2 服務(wù)鏈路追蹤服務(wù)端
1. pom.xml添加依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- zipkin 界面-->
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
<version>2.11.5</version>
</dependency>
<!-- zipkin 服務(wù)類-->
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
<version>2.11.5</version>
</dependency>
2.配置文件
server:
port: 8770
spring:
application:
name: chainmonitor
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
management:
metrics:
web:
server:
auto-time-requests: false
3.啟動(dòng)類添加注解@EnableZipkinServer
@SpringBootApplication
@EnableEurekaClient
@EnableZipkinServer
public class ChainmonitorApplication {
public static void main(String[] args) {
SpringApplication.run(ChainmonitorApplication.class, args);
}
}
3.3 服務(wù)鏈路追蹤客戶端
3.3.1 服務(wù)提供者provider
1.pom.xml添加依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
2.配置文件
server:
port: 8800
spring:
application:
name: provider
# zipkin的地址:通過真實(shí)IP地址訪問
zipkin:
base-url: http://localhost:8770
#通過服務(wù)名訪問
#base-url: http://chainmonitor/
sleuth:
sampler:
#設(shè)置采樣率,為了測(cè)試設(shè)置100%采集胡岔,設(shè)置為1.0
probability: 1.0
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
3.服務(wù)接口
@RestController
public class HelloController {
@RequestMapping(value = "/getBookByName")
public String getNameById(@RequestParam("id") String id){
String bookName = "";
switch (id){
case "1" :
bookName = "Java";
break;
case "2" :
bookName = "C++";
break;
default:
bookName = "phython";
}
return bookName;
}
}
3.3.2 服務(wù)消費(fèi)者consumer
1.pom.xml添加依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
2.配置文件
server:
port: 8801
spring:
application:
name: consumer
# zipkin的地址:通過真實(shí)IP地址訪問
zipkin:
base-url: http://localhost:8770
#通過服務(wù)名訪問
#base-url: http://chainmonitor/
sleuth:
sampler:
#設(shè)置采樣率法希,為了測(cè)試設(shè)置100%采集,設(shè)置為1.0
probability: 1.0
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
3.feign遠(yuǎn)程調(diào)用接口
@FeignClient(name = "provider")
public interface FeignService {
@RequestMapping(value = "/getBookByName",method = RequestMethod.GET)
String getBookByName(@RequestParam("id") String id);
}
4.服務(wù)接口
@RestController
public class HelloController {
@Autowired
private FeignService feignService;
@RequestMapping(value = "getBookName")
public String getBookName(@RequestParam("id") String id){
return feignService.getBookByName(id);
}
}
四靶瘸、zipkin中圖形化數(shù)據(jù)解析
4.1 zipkin可視化成功調(diào)用
在Zipkin中展示了跟蹤信息苫亦,紅框里是一個(gè)Trace
Trace
點(diǎn)擊每個(gè)Trace毛肋,可以看到多個(gè)Span
span
點(diǎn)擊每個(gè)span,可以看到詳細(xì)信息
span詳細(xì)信息
4.2 zipkin可視化失敗調(diào)用
如果調(diào)用鏈路中發(fā)生接口調(diào)用失敗,zipkin會(huì)默認(rèn)使用紅色展示信息屋剑,如下圖:
span
點(diǎn)擊紅色的span润匙,可以看到詳細(xì)的失敗信息:
失敗信息