?我的博客:程序員笑笑生,歡迎瀏覽博客术荤!
?上一章 SpringCloud 基礎教程(十)-Zuul 服務網關當中,我們了解了Zuul在微服架構中擔任著重要的網關角色,并實現了一個簡單的Token過濾涯保。本章我們將介紹另一個服務組件Spring Cloud Sleuth。
前言
?在微服務系統中勇劣,業(yè)務的調用多數不是在一個進程中實現的靖避,可以知道,隨著服務的拆分比默,微服務組件是越來越多幻捏,每個模塊都是不同的人維護,一個請求會涉及多個服務協調的處理命咐,那么當出現故障時篡九,如何快速的定位線上的故障呢?
?比較成熟的方案是通過調用鏈的方式醋奠,把一個用戶的請求串聯起來榛臼。Sping Cloud Sleuth是一個分布式的調用鏈跟蹤工具:
一、快速開始
1.1 準備工作
在我們之前的章節(jié)中窜司,我們有了以下的服務組件:
- Eureka注冊中心:eureka-server
- 服務消費者1個server-consumer
- 服務提供者2個server-provider
1.2 如何開始
?我們在服務消費者server-consumer沛善、服務提供者server-provider和eureka-server引入sleuth依賴,并啟動注冊中心塞祈、服務提供者和服務消費者:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
?服務消費者server-consumer控制器金刁,helloApi是Feign編寫的接口,注入調用:
@RestController
@RequestMapping("/hystrix")
public class HystrixController {
private final Logger logger = LoggerFactory.getLogger(HystrixController.class);
@Autowired
HelloApi helloApi;
@RequestMapping("/sayHello")
@HystrixCommand(fallbackMethod = "sayError")
public String sayHello(String name) {
return helloApi.sayHello(name);
}
@RequestMapping("/sayHello")
@HystrixCommand(fallbackMethod = "sayError")
public String sayHello(String name) {
logger.info("server-consumer :{}"+name);
return helloApi.sayHello(name);
}
?服務提供者server-provider控制器:
@RestController
public class RibbonController {
private final Logger logger = LoggerFactory.getLogger(RibbonController.class);
@Value("${server.port}")
private String port;
@RequestMapping("/sayHello")
public String sayHello(String name) {
logger.info("server-provider :{}"+name);
return "from:" + port + ",hello!," + name;
}
?啟動程序后议薪,然后通過HTTP方式調用接口 http://localhost:5168/hystrix/sayHello?name=name尤蛮,接口正確返回結果,同時我們可以看到后臺日志:
?服務消費者日志:
2020-01-30 22:34:30.118 INFO [server-consumer,ef944d0faefb97cd,c72e13f0bd0a4398,false] 10904 --- [rixController-1] c.m.consumer.test.HystrixController : server-consumer :{}name
?服務提供者日志:
2020-01-30 22:34:30.366 INFO [server-provider,ef944d0faefb97cd,aef54537badf8ea0,false] 22664 --- [nio-9001-exec-1] c.m.provider.RibbonController : server-provider :{}name
?可以看到日志信息多出了很多信息如: [server-consumer,ef944d0faefb97cd,c72e13f0bd0a4398,false]斯议,
- server-consumer:應用名稱
- ef944d0faefb97cd:一個TraceId产捞,這里的服務提供者和服務調用者的TraceID是一樣的
- c72e13f0bd0a4398:一個SpanId
二、Spring Cloud Sleuth 介紹
?在引入spring-cloud-starter-sleuth依賴后哼御,客戶端的每一次請求坯临,都會生成這樣的日志,Spring Cloud Sleuth借用了Dapper的術語:
Span:最小的工作單元恋昼,發(fā)送一個RPC請求或者響應一個RPC請求也是一個新的Span尿扯,SpringCloud Sleuth會為其生成一個64位的全局唯一的ID,包括了時間焰雕、標簽衷笋、SpanID,進程ID(IP)。
Trace:理解為一個完整的調用鏈請求
-
Annotation :用來及時記錄時間的存在辟宗,用一些重要的注解定義請求的開始和結束
? 1 爵赵、cs Client-Request 客戶端發(fā)送請求,描述一個Span的開始
? 2 泊脐、sr Server Recoived 服務端接受請求空幻,并開始處理
? 3 、ss Server Sent 表示請完成
? 4 容客、cr Client- Received 表示Span的結束
?可以用圖的形式表示一次調用鏈的實例:
從圖中我們可以看到秕铛,一次完整的用戶請求,TraceID是不變的缩挑,不管中間經過了多少的服務但两,TraceID是唯一確定的。而SpanId的變化是發(fā)生了RPC請求供置。這樣我們就可以更具這些信息谨湘,如果讓生為了故障,我們就可以追蹤具體的服務組件了芥丧。
三紧阔、總結
?本章我們簡單介紹了在分布式環(huán)境下,我們該用什么樣的方法快速的定位服務的故障续担,了解了Spring Cloud Sleuth的簡單概念擅耽,以及如何在項目中應用,當然僅僅收集這些日志信息是不夠的物遇,我們需要的把它給收集起來秫筏,通常Spring Cloud Sleuth會打印日志聚集值Zipkin中,有Zipkin收集挎挖、存儲、提供查詢等航夺。接下來我們會介紹如何在Spring Cloud生態(tài)下集成Zipkin蕉朵。
----END----
以就是本期的分享,你還可以關注公眾號: 程序員笑笑生阳掐,關注更多精彩內容始衅!
SpringCloud基礎教程(一)-微服務與SpringCloud
SpringCloud基礎教程(二)-服務發(fā)現 Eureka
SpringCloud基礎教程(五)-配置中心熱生效和高可用
SpringCloud 基礎教程(六)-負載均衡Ribbon
SpringCloud 基礎教程(七)-Feign聲明式服務調用
SpringCloud 基礎教程(八)-Hystrix熔斷器(上)
SpringCloud 基礎教程(九)-Hystrix服務監(jiān)控(下)
SpringCloud 基礎教程(十一)- Sleuth 調用鏈追蹤簡介
更多精彩內容,請期待...
本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布缭保!