1. 程式人生 > >spring cloud zipkin 配置-1

spring cloud zipkin 配置-1

具體原理這裡不解釋,介紹配置方法和中間遇到的坑。

為了測試效果,需要三個服務:一個zipkin-service,一個web-client和一個back-client,其中web-client和一個back-client做一個介面呼叫,並將呼叫過程傳送給zipkin-service,在zipkin-service介面上可以檢視結果。

1、zipkin-service配置,新建一個springboot專案,pom新增引用:

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </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> 

寫一個啟動類ZipkinServiceApplication.class

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

import zipkin.server.EnableZipkinServer;

@SpringBootApplication
@EnableZipkinServer
public class ZipkinServiceApplication {
	
	public static void main(String[] args) {
		SpringApplication.run(ZipkinServiceApplication.class, args);
	}
	
}

配置埠號等資訊:

#==================================================
# 本服務私有配置:埠、服務名稱等
#==================================================
server.port=20000
spring.application.name=zipkin-service 

然後啟動服務即可,這時開啟介面裡面沒有資料,地址就是http://localhost:20000/

2、下面來配置2個服務,測試介面呼叫是否被zipkin記錄

  • 在pom檔案裡面加入引用:
		<dependency>
		    <groupId>org.springframework.cloud</groupId>
		    <artifactId>spring-cloud-starter-zipkin</artifactId>
		</dependency>

注意:剛開始我引用的是

<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>
後來發現官方文件有介紹:

如果只想用sleuth,上面的引用就夠了。

或者你想zipkin和sleuth一起用,那就用下面的:


其實就是一個上下引用的關係:


  • 在配置檔案中新增zipkin的地址:
#指定zipkin server的地址
spring.zipkin.base-url=http\://localhost\:20000

接下來編寫兩個restful介面,讓web-client(配置的是feign做介面呼叫)去呼叫back-client的介面,然後我們用瀏覽器去訪問web-client釋出出來的介面。

重新整理zipkin的頁面 http://localhost:20000/,我們可以看到 service-name,span等查詢選項裡面都有值了。

3、問題:

由於我專案中配置了swagger,在swagger裡面找到介面並測試時,回到zipkin的介面發現只能看到載入swagger頁面的呼叫有記錄,測試介面的呼叫沒記錄!剛開始以為是feign的呼叫沒有被記錄,是不是少了什麼配置,去配置檔案加上了

spring.sleuth.feign.enabled=true

spring.sleuth.web.enabled=true

依然不行。

後來去查了下官方文件,有下面一段註釋:


spring.sleuth.sampler.percentage配置到處百分比,預設是0.1,我把這個值改成1,測試了一下馬上出來了。

補充一點,其實從你的專案日誌裡面能看到一些關鍵資訊,如下圖:


啟用zipkin之後日誌裡面會多出一部分內容,上面中括號裡面的內容官網也有介紹,其中exportable為true表示要傳送日誌到zipkin,剛開始接收不到日誌的時候我那裡列印的是false


4、後續問題:

由於上面的這種方式對服務的效能有影響(每個請求都要額外建立http連線),並且日誌資料存在記憶體裡下次重啟就沒了,沒有實際應用價值。

所以後續要改成非同步推送,並將日誌存在資料庫裡面或者本地磁碟。

參考文件:

https://github.com/spring-cloud/spring-cloud-sleuth