SpringCloud 基礎教程(十一)- Sleuth 調用鏈追蹤簡介

 個人博客:程序員笑笑生,歡迎瀏覽博客!java

 上一章 SpringCloud 基礎教程(十)-Zuul 服務網關當中,咱們瞭解了Zuul在微服架構中擔任着重要的網關角色,並實現了一個簡單的Token過濾。本章咱們將介紹另外一個服務組件Spring Cloud Sleuth。程序員

前言

 在微服務系統中,業務的調用多數不是在一個進程中實現的,能夠知道,隨着服務的拆分,微服務組件是愈來愈多,每一個模塊都是不一樣的人維護,一個請求會涉及多個服務協調的處理,那麼當出現故障時,如何快速的定位線上的故障呢?spring

 比較成熟的方案是經過調用鏈的方式,把一個用戶的請求串聯起來。Sping Cloud Sleuth是一個分佈式的調用鏈跟蹤工具:架構

1、快速開始

1.1 準備工做

在咱們以前的章節中,咱們有了如下的服務組件:app

  • 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控制器: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,接口正確返回結果,同時咱們能夠看到後臺日誌:微服務

 服務消費者日誌:工具

file

2020-01-30 22:34:30.118  INFO [server-consumer,ef944d0faefb97cd,c72e13f0bd0a4398,false] 10904 --- [rixController-1] c.m.consumer.test.HystrixController      : server-consumer :{}name

 服務提供者日誌:

file

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

2、Spring Cloud Sleuth 介紹

 在引入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的結束

 能夠用圖的形式表示一次調用鏈的實例:

file

從圖中咱們能夠看到,一次完整的用戶請求,TraceID是不變的,無論中間通過了多少的服務,TraceID是惟一肯定的。而SpanId的變化是發生了RPC請求。這樣咱們就能夠更具這些信息,若是讓生爲了故障,咱們就能夠追蹤具體的服務組件了。

3、總結

 本章咱們簡單介紹了在分佈式環境下,咱們該用什麼樣的方法快速的定位服務的故障,瞭解了Spring Cloud Sleuth的簡單概念,以及如何在項目中應用,固然僅僅收集這些日誌信息是不夠的,咱們須要的把它給收集起來,一般Spring Cloud Sleuth會打印日誌彙集值Zipkin中,有Zipkin收集、存儲、提供查詢等。接下來咱們會介紹如何在Spring Cloud生態下集成Zipkin。

----END---- 以就是本期的分享,你還能夠關注公衆號: 程序員笑笑生,關注更多精彩內容!

file

file

SpringCloud基礎教程(一)-微服務與SpringCloud

SpringCloud基礎教程(二)-服務發現 Eureka

SpringCloud基礎教程(三)-Eureka進階

SpringCloud 基礎教程(四)-配置中心入門

SpringCloud基礎教程(五)-配置中心熱生效和高可用

SpringCloud 基礎教程(六)-負載均衡Ribbon

SpringCloud 基礎教程(七)-Feign聲明式服務調用

SpringCloud 基礎教程(八)-Hystrix熔斷器(上)

SpringCloud 基礎教程(九)-Hystrix服務監控(下)

SpringCloud 基礎教程(十)-Zull服務網關

SpringCloud 基礎教程(十一)- Sleuth 調用鏈追蹤簡介

更多精彩內容,請期待...

本文由博客一文多發平臺 OpenWrite 發佈!

個人博客地址蘭陵笑笑生,歡迎瀏覽!

相關文章
相關標籤/搜索