Spring Cloud(8):Sleuth和Zipkin的使用

場景:html

某大型電商網站基於微服務架構,服務模塊有幾十個。前端

某天,測試人員報告該網站響應速度過慢。排除了網絡問題以後,發現很難進一步去排除故障。java

那麼:如何對微服務的鏈路進行監控呢?linux

 

Sleuth:spring

通常的,一個分佈式服務跟蹤系統,主要有三部分:數據收集、數據存儲和數據展現。docker

根據系統大小不一樣,每一部分的結構又有必定變化。centos

譬如,對於大規模分佈式系統,數據存儲可分爲實時數據和全量數據兩部分.性能優化

實時數據用於故障排查(troubleshooting):全量數據用於系統優化網絡

數據收集除了支持平臺無關和開發語言無關係統的數據收集,還包括異步數據收集(須要跟蹤隊列中的消息,保證調用的連貫性)架構

以及確保更小的侵入性;數據展現又涉及到數據挖掘和分析。

雖然每一部分均可能變得很複雜,但基本原理都相似。

服務追蹤的追蹤單元是從客戶發起請求(request)抵達被追蹤系統的邊界開始

到被追蹤系統向客戶返回響應(response)爲止的過程,稱爲一個「trace」。

每一個 trace 中會調用若干個服務,爲了記錄調用了哪些服務,以及每次調用的消耗時間等信息,在每次調用服務時,埋入一個調用記錄,稱爲一個「span」。

這樣,若干個有序的 span 就組成了一個 trace。

在系統向外界提供服務的過程當中,會不斷地有請求和響應發生,也就會不斷生成 trace。

把這些帶有span 的 trace 記錄下來,就能夠描繪出一幅系統的服務拓撲圖。

附帶上 span 中的響應時間,以及請求成功與否等信息,就能夠在發生問題的時候,找到異常的服務。

根據歷史數據,還能夠從系統總體層面分析出哪裏性能差,定位性能優化的目標。

Spring Cloud Sleuth爲服務之間調用提供鏈路追蹤。

經過Sleuth能夠很清楚的瞭解到一個服務請求通過了哪些服務,每一個服務處理花費了多長。

從而讓咱們能夠很方便的理清各微服務間的調用關係。

此外Sleuth能夠幫助咱們:

  • 耗時分析: 經過Sleuth能夠很方便的瞭解到每一個採樣請求的耗時,從而分析出哪些服務調用比較耗時;
  • 可視化錯誤: 對於程序未捕捉的異常,能夠經過集成Zipkin服務界面上看到;
  • 鏈路優化: 對於調用比較頻繁的服務,能夠針對這些服務實施一些優化措施。

spring cloud sleuth能夠結合zipkin,將信息發送到zipkin,利用zipkin的存儲來存儲信息,利用zipkin ui來展現數據。

 

這是Spring Cloud Sleuth的概念圖:

Sleuth的簡單使用:

加入依賴

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

啓動項目,發現會打印下面這些信息:

[order-service,86028f5d0762bee1,d08375022720d818,false]

第一個參數:項目的名稱,服務模塊的名稱:spring.application.name

第二個參數:TraceID:用來標識請求的一整條鏈路,一條鏈路只有一個TraceID

第三個參數:SpanID:基本的工做元,獲取元數據

第四個參數:是否要把該信息輸出到Zipkin服務中來收集和展現

 

ZipKin

Zipkin 是一個開放源代碼分佈式的跟蹤系統,由Twitter公司開源。

它致力於收集服務的定時數據,以解決微服務架構中的延遲問題,包括數據的收集、存儲、查找和展示。

每一個服務向zipkin報告計時數據,zipkin會根據調用關係經過Zipkin UI生成依賴關係圖。

顯示了多少跟蹤請求經過每一個服務,該系統讓開發者可經過一個 Web 前端輕鬆的收集和分析數據

例如用戶每次請求服務的處理時間等,可方便的監測系統中存在的瓶頸。

Zipkin提供了可插拔數據存儲方式:In-Memory、MySql、Cassandra以及Elasticsearch。接下來的測試爲方便直接採用In-Memory方式進行存儲,生產推薦Elasticsearch。

快速上手

建立zipkin-server項目

項目依賴

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
    <dependency>
        <groupId>io.zipkin.java</groupId>
        <artifactId>zipkin-server</artifactId>
    </dependency>
    <dependency>
        <groupId>io.zipkin.java</groupId>
        <artifactId>zipkin-autoconfigure-ui</artifactId>
    </dependency>
</dependencies>

啓動類

@SpringBootApplication
@EnableEurekaClient
@EnableZipkinServer
public class ZipkinApplication {

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

}

使用了@EnableZipkinServer註解,啓用Zipkin服務。

配置文件

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 9000
spring:
  application:
    name: zipkin-server

配置完成後依次啓動示例項目:spring-cloud-eurekazipkin-server項目。剛問地址:http://localhost:9000/zipkin/能夠看到Zipkin後臺頁面

 

我採用了更方便快捷的方式:Docker

一、Docker 要求 CentOS 系統的內核版本高於 3.10 ,查看本頁面的前提條件來驗證你的CentOS 版本是否支持 Docker 。

經過 uname -r 命令查看你當前的內核版本

 $ uname -r

二、使用 root 權限登陸 Centos。確保 yum 包更新到最新。

$ sudo yum update

三、卸載舊版本(若是安裝過舊版本的話)

$ sudo yum remove docker  docker-common docker-selinux docker-engine

四、安裝須要的軟件包, yum-util 提供yum-config-manager功能,另外兩個是devicemapper驅動依賴的

$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2

五、設置yum源

$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

 

六、能夠查看全部倉庫中全部docker版本,並選擇特定版本安裝

$ yum list docker-ce --showduplicates | sort -r

七、安裝docker

$ sudo yum install docker-ce  #因爲repo中默認只開啓stable倉庫,故這裏安裝的是最新穩定版17.12.0
$ sudo yum install <FQPN>  # 例如:sudo yum install docker-ce-17.12.0.ce

 

八、啓動並加入開機啓動

$ sudo systemctl start docker
$ sudo systemctl enable docker

九、驗證安裝是否成功(有client和service兩部分表示docker安裝啓動都成功了)

$ docker version

 

Zipkin安裝

執行命令:

docker run -d -p 9411:9411 openzipkin/zipkin

 

而後訪問http://[Docker機器的IP]:9411進入Zipkin可視Web界面

 

整合:

加入依賴

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

另外,Zipkin依賴包括了Sleuth依賴,能夠刪除上邊引入的Sleuth依賴

 

配置Zipkin Server和該服務採樣百分比(1爲最大,生產環境不建議設置爲1):

spring.zipkin.base-url=http://[0.0.0.0]:9411/
spring.sleuth.sampler.probability=1

 

訪問Zipkin Server,刷新幾回就會出現以前配置過的服務:

訪問幾回服務的接口,而後就能夠針對某個服務進行鏈路分析

具體Zipkin界面的使用,很少作介紹了,中文界面操做不難

 

對請求鏈路進行追蹤,就能夠肯定服務的哪個模塊更耗時,進而能夠進行優化或者排BUG

所以,在開發環境中,部署Sleuth和Zipkin是比較重要的

 

以上部份內容參考博客:

http://www.cnblogs.com/jianliang-Wu/p/8945890.html

http://www.javashuo.com/article/p-aptrhsrk-dp.html

相關文章
相關標籤/搜索