個人博客:程序員笑笑生,歡迎瀏覽博客!java
上一章 SpringCloud 基礎教程(十)-Zuul 服務網關當中,咱們瞭解了Zuul在微服架構中擔任着重要的網關角色,並實現了一個簡單的Token過濾。本章咱們將介紹另外一個服務組件Spring Cloud Sleuth。程序員
在微服務系統中,業務的調用多數不是在一個進程中實現的,能夠知道,隨着服務的拆分,微服務組件是愈來愈多,每一個模塊都是不一樣的人維護,一個請求會涉及多個服務協調的處理,那麼當出現故障時,如何快速的定位線上的故障呢?spring
比較成熟的方案是經過調用鏈的方式,把一個用戶的請求串聯起來。Sping Cloud Sleuth是一個分佈式的調用鏈跟蹤工具:架構
在咱們以前的章節中,咱們有了如下的服務組件:app
咱們在服務消費者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控制器:ide
@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],
在引入spring-cloud-starter-sleuth依賴後,客戶端的每一次請求,都會生成這樣的日誌,Spring Cloud Sleuth借用了Dapper的術語:
Span:最小的工做單元,發送一個RPC請求或者響應一個RPC請求也是一個新的Span,SpringCloud Sleuth會爲其生成一個64位的全局惟一的ID,包括了時間、標籤、SpanID,進程ID(IP)。
Trace:理解爲一個完整的調用鏈請求
Annotation :用來及時記錄時間的存在,用一些重要的註解定義請求的開始和結束
1 、cs Client-Request 客戶端發送請求,描述一個Span的開始
2 、sr Server Recoived 服務端接受請求,並開始處理
3 、ss Server Sent 表示請完成
4 、cr Client- Received 表示Span的結束
能夠用圖的形式表示一次調用鏈的實例:
從圖中咱們能夠看到,一次完整的用戶請求,TraceID是不變的,無論中間通過了多少的服務,TraceID是惟一肯定的。而SpanId的變化是發生了RPC請求。這樣咱們就能夠更具這些信息,若是讓生爲了故障,咱們就能夠追蹤具體的服務組件了。
本章咱們簡單介紹了在分佈式環境下,咱們該用什麼樣的方法快速的定位服務的故障,瞭解了Spring Cloud Sleuth的簡單概念,以及如何在項目中應用,固然僅僅收集這些日誌信息是不夠的,咱們須要的把它給收集起來,一般Spring Cloud Sleuth會打印日誌彙集值Zipkin中,有Zipkin收集、存儲、提供查詢等。接下來咱們會介紹如何在Spring Cloud生態下集成Zipkin。
----END---- 以就是本期的分享,你還能夠關注公衆號: 程序員笑笑生,關注更多精彩內容!
SpringCloud基礎教程(一)-微服務與SpringCloud
SpringCloud基礎教程(二)-服務發現 Eureka
SpringCloud基礎教程(五)-配置中心熱生效和高可用
SpringCloud 基礎教程(六)-負載均衡Ribbon
SpringCloud 基礎教程(七)-Feign聲明式服務調用
SpringCloud 基礎教程(八)-Hystrix熔斷器(上)
SpringCloud 基礎教程(九)-Hystrix服務監控(下)
SpringCloud 基礎教程(十一)- Sleuth 調用鏈追蹤簡介
更多精彩內容,請期待...
本文由博客一文多發平臺 OpenWrite 發佈!
個人博客地址蘭陵笑笑生,歡迎瀏覽!