分布式鏈路追蹤、配置中心

一、分布式鏈路追蹤

1、為什么需要Spring Cloud Sleuth

微服務(wù)架構(gòu)是一個(gè)分布式架構(gòu),它按業(yè)務(wù)劃分服務(wù)單元,一個(gè)分布式系統(tǒng)往往有很多個(gè)服務(wù)單元。由于服務(wù)單元數(shù)量眾多,業(yè)務(wù)的復(fù)雜性,如果出現(xiàn)了錯(cuò)誤和異常,很難去定位。主要體現(xiàn)在,一個(gè)請(qǐng)求可能需要調(diào)用很多個(gè)服務(wù),而內(nèi)部服務(wù)的調(diào)用復(fù)雜性,決定了問(wèn)題難以定位。所以微服務(wù)架構(gòu)中,必須實(shí)現(xiàn)分布式鏈路追蹤,去跟進(jìn)一個(gè)請(qǐng)求到底有哪些服務(wù)參與,參與的順序又是怎樣的,從而達(dá)到每個(gè)請(qǐng)求的步驟清晰可見(jiàn),出了問(wèn)題,很快定位。
舉個(gè)例子,在微服務(wù)系統(tǒng)中,一個(gè)來(lái)自用戶的請(qǐng)求,請(qǐng)求先達(dá)到前端A(如前端界面),然后通過(guò)遠(yuǎn)程調(diào)用,達(dá)到系統(tǒng)的中間件B、C(如負(fù)載均衡、網(wǎng)關(guān)等),最后達(dá)到后端服務(wù)D、E,后端經(jīng)過(guò)一系列的業(yè)務(wù)邏輯計(jì)算最后將數(shù)據(jù)返回給用戶。對(duì)于這樣一個(gè)請(qǐng)求,經(jīng)歷了這么多個(gè)服務(wù),怎么樣將它的請(qǐng)求過(guò)程的數(shù)據(jù)記錄下來(lái)呢?這就需要用到服務(wù)鏈路追蹤。

2、Spring Cloud Sleuth基本術(shù)語(yǔ)

Spring Cloud Sleuth采用的是Google的開(kāi)源項(xiàng)目Dapper的專業(yè)術(shù)語(yǔ)。

  • 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ù)據(jù)信息,比如摘要、時(shí)間戳事件、Span的ID、以及進(jìn)度ID。
  • Trace:一系列Span組成的一個(gè)樹(shù)狀結(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:用來(lái)及時(shí)記錄一個(gè)事件的,一些核心注解用來(lái)定義一個(gè)請(qǐng)求的開(kāi)始和結(jié)束 。這些注解包括以下:
    (1)cs - Client Sent -客戶端發(fā)送一個(gè)請(qǐng)求,這個(gè)注解描述了這個(gè)Span的開(kāi)始
    (2) sr - Server Received -服務(wù)端獲得請(qǐng)求并準(zhǔn)備開(kāi)始處理它,如果將其sr減去cs時(shí)間戳便可得到網(wǎng)絡(luò)傳輸?shù)臅r(shí)間。
    (3)ss - Server Sent (服務(wù)端發(fā)送響應(yīng))–該注解表明請(qǐng)求處理的完成(當(dāng)請(qǐng)求返回客戶端),如果ss的時(shí)間戳減去sr時(shí)間戳,就可以得到服務(wù)器請(qǐng)求的時(shí)間。
    (4)cr - Client Received (客戶端接收響應(yīng))-此時(shí)Span的結(jié)束,如果cr的時(shí)間戳減去cs時(shí)間戳便可以得到整個(gè)請(qǐng)求所消耗的時(shí)間。

3、實(shí)戰(zhàn)Spring Cloud Sleuth

基于之前使用到的組件包括:Eureka、Feign、Zuul,包括以下四個(gè)項(xiàng)目:
(1)Eureka-server: 8761 注冊(cè)中心
(2)product-server :8771 商品微服務(wù)
(3)order-server : 8781 訂單微服務(wù)
(4)zuul-gateway : 9000 Zuul網(wǎng)關(guān)
我們分別在product-server和order-server上加上Sleuth依賴

    <dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-sleuth</artifactId>
     </dependency>

由于默認(rèn)是日志級(jí)別是INFO,所以訪問(wèn)url看不到日志,就看不到效果
所以我們手動(dòng)在兩個(gè)微服務(wù)中都加入代碼打印日志信息 如下

@Service
public class ProductServiceImpl implements ProductService {
    private final Logger logger=LoggerFactory.getLogger(getClass());
    @Override
    public Product findById(int id) {
        logger.info("service product find");
        return dtoMap.get(id);
    }
}

訪問(wèn)URL可以分別看到如下

eg:[order-service,dc1da5e886b48dcf,acea4312e3a6fca4,false]
1、第一個(gè)值,spring.application.name的值
2、第二個(gè)值,dc1da5e886b48dcf ,sleuth生成的一個(gè)ID,叫Trace ID,用來(lái)標(biāo)識(shí)一條請(qǐng)求鏈路,一條請(qǐng)求鏈路中包含一個(gè)Trace ID,多個(gè)Span ID
3、第三個(gè)值,acea4312e3a6fca4、Span ID 基本的工作單元,獲取元數(shù)據(jù),如發(fā)送一個(gè)http
4、第四個(gè)值:false,是否要將該信息輸出到zipkin服務(wù)中來(lái)收集和展示。

由此我們可以看到第二個(gè)值是相同的,鏈路追蹤的也是通過(guò)同一個(gè)Trace ID串聯(lián)起來(lái)進(jìn)行追蹤的

4、鏈路追蹤組件Zipkin+Spring Cloud Sleuth

zipkin:大規(guī)模分布式系統(tǒng)的APM工具(Application Performance Management),基于Google Dapper的基礎(chǔ)實(shí)現(xiàn),和sleuth結(jié)合可以提供可視化web界面分析調(diào)用鏈路耗時(shí)情況。
官網(wǎng)資料:
https://github.com/openzipkin/zipkin
https://zipkin.io/pages/quickstart.html
http://cloud.spring.io/spring-cloud-static/Finchley.SR1/single/spring-cloud.html#_sleuth_with_zipkin_via_http
原理:sleuth收集跟蹤信息通過(guò)http請(qǐng)求發(fā)送給zipkin server,zipkinserver進(jìn)行跟蹤信息的存儲(chǔ)以及提供Rest API即可,Zipkin UI調(diào)用其API接口進(jìn)行數(shù)據(jù)展示。

  • 安裝Zipkin
    我是在用docker安裝的步驟如下
//安裝docker
$ sudo yum update
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
$ sudo systemctl start docker
//通過(guò)docker安裝Zipkin
$ docker run -d -p 9411:9411 openzipkin/zipkin
  • 安裝完成后可訪問(wèn)Zipkin地址:ip+端口


    zipkin界面
  • 加入依賴(此依賴中已經(jīng)包含了sleuth)
    <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
    </dependency>
  • 配置zipkin.base-url 、配置采樣百分閉spring.sleuth.sampler
spring:
  application:
    name: product-service
  zipkin:
    base-url: http://192.168.216.128:9411/
#配置采樣百分比 測(cè)試環(huán)境配置成1方便測(cè)試 生產(chǎn)環(huán)境最好還是按默認(rèn)值0.1來(lái)
  sleuth:
    sampler:
      probability: 1
  • 測(cè)試 訪問(wèn)幾次接口后 刷新zipkin界面 可看到調(diào)用記錄 點(diǎn)進(jìn)去可以看到詳細(xì)的信息



二、配置中心

1、微服務(wù)配置中心是什么

集中式配置是將應(yīng)用系統(tǒng)中對(duì)配置信息的管理作為一個(gè)新的應(yīng)用功能模塊,區(qū)別與傳統(tǒng)的配置信息分散到系統(tǒng)各個(gè)角落方式,進(jìn)行集中統(tǒng)一管理,并且提供額外功能。尤其是在微服務(wù)架構(gòu)中,是不可或缺組件之一。

2、為什么需要微服務(wù)配置中心

在微服務(wù)體系中,服務(wù)的數(shù)量以及配置信息的日益增多,比如各種服務(wù)器參數(shù)配置、各種數(shù)據(jù)庫(kù)訪問(wèn)參數(shù)配置、各種環(huán)境下配置信息的不同、配置信息修改之后實(shí)時(shí)生效等等,傳統(tǒng)的配置文件方式或者將配置信息存放于數(shù)據(jù)庫(kù)中的方式已無(wú)法滿足開(kāi)發(fā)人員對(duì)配置管理的要求,如:

  • 安全性:配置跟隨源代碼保存在代碼庫(kù)中,容易造成配置泄漏
  • 時(shí)效性:修改配置,需要重啟服務(wù)才能生效
  • 局限性:無(wú)法支持動(dòng)態(tài)調(diào)整:例如日志開(kāi)關(guān)、功能開(kāi)關(guān)

3、spring cloud config基礎(chǔ)流程

spring cloud config基礎(chǔ)流程

4、搭建配置中心

  • 新建項(xiàng)目config-server 加入依賴
           <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
  • 啟動(dòng)類加入注解@EnableConfigServer
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }

}
  • 默認(rèn)使用git存儲(chǔ)配置中心
    本次使用github(git/gitlab服務(wù)器,開(kāi)源中國(guó)git、阿里云git等都可以)
    在github上添加項(xiàng)目,并創(chuàng)建文件如下:(文件內(nèi)容寫(xiě)入服務(wù)對(duì)應(yīng)配置)


  • config-server配置文件添加配置(注意url要去掉.git)
server:
  port: 9100

#服務(wù)的名稱
spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/yuanyuanqq/springcloud-config
          username: yuanyuanqq
          password: xxxxx
          timeout: 5
          default-label: master

#指定注冊(cè)中心地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

name 服務(wù)器名稱
profile 環(huán)境名稱,開(kāi)發(fā)、測(cè)試、生產(chǎn)
lable 倉(cāng)庫(kù)分支、默認(rèn)master分支

5、配置中心客戶端使用

官方文檔:http://cloud.spring.io/spring-cloud-config/single/spring-cloud-config.html#_spring_cloud_config_client

  • 加入依賴
<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-config-client</artifactId>
</dependency>
  • 修改對(duì)應(yīng)服務(wù)的配置文件,把a(bǔ)pplication.yml 改為 bootstrap.yml
    (因?yàn)閎ootstrap.yml 先于 application.yml 加載)
  • 配置bootstrap.yml
#服務(wù)的名稱
spring:
  application:
    name: product-service
#指定從哪個(gè)配置中心讀取
  cloud:
    config:
      discovery:
        service-id: config-server
        enabled: true
      profile: dev
      label: master

#指定注冊(cè)中心地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

注意點(diǎn):
1.配置文件要用bootstrap.yml
2.默認(rèn)讀取文件名是 服務(wù)名稱

  • 啟動(dòng)項(xiàng)目進(jìn)行測(cè)試
    github中文件product-service-dev.yml配置了端口號(hào)9200



    如上 可以發(fā)現(xiàn)product-service服務(wù)啟動(dòng)端口為9200 是用了配置中心的文件

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容