1.簡述
最近在學習spring cloud構建微服務,研究追蹤微服務rest服務調用鏈路的問題,接觸到zipkin,而spring cloud也提供了spring-cloud-sleuth來方便集成zipkin實現。
我們准備了三個必要的程序來做測試,分別是
1、microservice-zipkin-server
負責數據收集以及信息展示功能。
2、microservice-zipkin-client-backend
負責微服務的生產者,對外提供 “http://127.0.0.1:11010/call/1” 的地址來完成一個簡單的功能rest請求。
3、microservice-zipkin-client
負責微服務的調用,對外提供 "http://localhost:11009/call/1" 的rest地址,當訪問此地址時,使用feign方式調用provider的rest服務地址。得到計算結果后,顯示在界面上。
2.准備工作
三個程序功能非常簡單,接下來我們看看每個程序的具體代碼和配置。為了方便我們對三個模塊開發,我們在父POM文件中添加了spring-boot和spring-cloud的依賴,避免子模塊中需要寫版本號
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
接下來我們看看三個程序中的相關配置
3.具體實現
3.1 microservice-zipkin-server
首先,我們添加maven依賴配置
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
在這里為了測試方便,我們可以將數據保存到內存中,但是生產環境還是需要將數據持久化中。原生支持了很多產品,例如ES、數據庫等,本例中我們采用將數據保存到內存中的方式來演示。
我們寫一個啟動類ZipkinServer,代碼非常簡單,如下
package com.yangyang.cloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import zipkin.server.EnableZipkinServer;
/**
* Created by chenshunyang on 2017/5/24.
*/
@EnableZipkinServer
@SpringBootApplication
public class ZipkinServerApplication {
public static void main(String[] args) {
SpringApplication.run(ZipkinServerApplication.class,args);
}
}
接下來我們配置application.ym配置文件
server:
port: 11008
spring:
application:
name : microservice-zipkin-server
啟動后 無異常輸出,這樣我們的server程序就OK了
3.2 microservice-zipkin-client-backend 與microservice-zipkin-client
這兩個程序,與其他基礎代碼我們就不多講了(相信學些到這一步的童鞋,都已經對spring cloud創建微服務以上手了),兩個程序在spring-cloud-sleuth相關的配置都是一樣。
首先,我們要在二者的POM文件中添加依賴,引入zipkin客戶端自動配置相關依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
其次,在配置文件application中,我們加入zipkin server收集信息的地址
spring:
application:
name: microservice-zipkin-client-backend
zipkin:
base-url: http://localhost:11008
這樣我們的兩個微服務就配置好了(注意這里我們並不會再說明如何寫rest接口和使用feign調用rest接口),具體參考代碼
4 測試
先后啟動我們的三個程序
先啟動microservice-zipkin-server 然后訪問在瀏覽器中訪問UI界面地址http://127.0.0.1:11008,
可以看到如下效果
其中Span Name選項為灰色不可選,說明目前沒有數據,我們查看數據庫也可以看到沒有任何數據信息。
接下來我們訪問consumer提供的訪問地址 http://localhost:11009/call/1
刷新幾次之后,我們再次刷新我們的zipkin界面,可以看到Span Name已經可以選擇了。
點擊Find Traces按鈕,我們可以看到調用的鏈路和耗時情況,點擊Dependencies,我們可以看到provider和consumer的調用圖
OK,我們的簡單實用spring-cloud-sleuth+zipkin的例子就完成了。
5.拓展
在測試的過程中我們會發現,有時候,程序剛剛啟動后,刷新幾次,並不能看到任何數據,原因就是我們的spring-cloud-sleuth收集信息是有一定的比率的,默認的采樣率是0.1,配置此值的方式在配置文件中增加spring.sleuth.sampler.percentage參數配置(如果不配置默認0.1),如果我們調大此值為1,可以看到信息收集就更及時。但是當這樣調整后,我們會發現我們的rest接口調用速度比0.1的情況下慢了很多,即時在0.1的采樣率下,我們多次刷新consumer的接口,會發現對同一個請求兩次耗時信息相差非常大,如果取消spring-cloud-sleuth后我們再測試,會發現並沒有這種情況,可以看到這種方式追蹤服務調用鏈路會給我們業務程序性能帶來一定的影響。
其實,我們仔細想想也可以總結出這種方式的幾種缺陷
缺陷1:zipkin客戶端向zipkin-server程序發送數據使用的是http的方式通信,每次發送的時候涉及到連接和發送過程。
缺陷2:當我們的zipkin-server程序關閉或者重啟過程中,因為客戶端收集信息的發送采用http的方式會被丟失。
針對以上兩個明顯的缺陷,改進的辦法是
1、通信采用socket或者其他效率更高的通信方式。
2、客戶端數據的發送盡量減少業務線程的時間消耗,采用異步等方式發送收集信息。
3、客戶端與zipkin-server之間增加緩存類的中間件,例如redis、MQ等,在zipkin-server程序掛掉或重啟過程中,客戶端依舊可以正常的發送自己收集的信息。
相信采用以上三種方式會很大的提高我們的效率和可靠性。其實spring-cloud以及為我們提供采用MQ或redis等其他的采用socket方式通信,利用消息中間件或數據庫緩存的實現方式。下一次我們再來測試spring-cloud-sleuth-zipkin-stream方式的實現。
6.項目源碼:
https://git.oschina.net/shunyang/spring-cloud-microservice-study.git
https://github.com/shunyang/spring-cloud-microservice-study.git
7.參考文檔:
spring cloud 官方文檔:https://github.com/spring-cloud/spring-cloud-sleuth