Spring Cloud –使用Zipkin跟踪服務
1.概述
在本文中,我們將Zipkin
添加到我們的Spring Cloud項目中。 Zipkin
是一個開源項目,提供了發送,接收,存儲和可視化跟踪的機制。這使我們能夠關聯服務器之間的活動,並更清楚地了解我們服務中正在發生的事情。
本文不是分佈式跟踪或Spring Cloud的介紹性文章。如果您想了解有關分佈式跟踪的更多信息,請閱讀我們的Spring Sleuth簡介。
2. Zipkin服務
我們的Zipkin
服務將充當我們所有跨度的商店。每個跨度都發送到此服務,並收集到跟踪中以供將來標識。
2.1。設定
創建一個新的Spring Boot項目並將這些依賴項添加到pom.xml:
<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>
供參考:您可以在Maven Central
上找到最新版本( zipkin-server , zipkin-autoconfigure-ui )。依賴的版本繼承自spring-boot-starter-parent 。
2.2。啟用Zipkin服務器
要啟用Zipkin
服務器,我們必須在主應用程序類中添加一些註釋:
@SpringBootApplication
@EnableZipkinServer
public class ZipkinApplication {...}
新的註釋@EnableZipkinServer
將設置此服務器以偵聽傳入的跨度並充當我們的查詢UI。
2.3。配置
首先,讓我們在src/main/resources
創建一個名為bootstrap.properties
的文件。請記住,需要此文件才能從配置服務器中獲取我們的配置。
讓我們添加以下屬性:
spring.cloud.config.name=zipkin
spring.cloud.config.discovery.service-id=config
spring.cloud.config.discovery.enabled=true
spring.cloud.config.username=configUser
spring.cloud.config.password=configPassword
eureka.client.serviceUrl.defaultZone=
http://discUser:[email protected]:8082/eureka/
現在,我們將配置文件添加到我們的配置庫中,該文件位於Windows上的c:\Users\{username}\
或* nix上的/home/{username}/
。
在此目錄中,我們添加一個名為zipkin.properties
的文件並添加以下內容:
spring.application.name=zipkin
server.port=9411
eureka.client.region=default
eureka.client.registryFetchIntervalSeconds=5
logging.level.org.springframework.web=debug
切記在此目錄中提交更改,以便config服務將檢測到更改並加載文件。
2.4。運行
現在,運行我們的應用程序並導航到http:// localhost:9411。我們應該會看到Zipkin's
主頁:
大!現在,我們準備向我們要跟踪的服務中添加一些依賴關係和配置。
3.服務配置
資源服務器的設置幾乎相同。在以下各節中,我們將詳細介紹如何設置book-service.
接下來,我們將解釋將這些更新應用到rating-service
和gateway-service **.**
所需的修改**gateway-service .**
3.1。設定
為了開始向我們的Zipkin
服務器發送跨度,我們將這個依賴項添加到我們的pom.xml
文件中:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
供參考:您可以在Maven Central
上找到最新版本( spring-cloud-starter-zipkin )。
3.2。Spring Config
我們需要添加一些配置,以便預訂服務將使用Eureka
查找我們的Zipkin
服務。打開BookServiceApplication.java
並將以下代碼添加到文件中:
@Autowired
private EurekaClient eurekaClient;
@Autowired
private SpanMetricReporter spanMetricReporter;
@Autowired
private ZipkinProperties zipkinProperties;
@Value("${spring.sleuth.web.skipPattern}")
private String skipPattern;
// ... the main method goes here
@Bean
public ZipkinSpanReporter makeZipkinSpanReporter() {
return new ZipkinSpanReporter() {
private HttpZipkinSpanReporter delegate;
private String baseUrl;
@Override
public void report(Span span) {
InstanceInfo instance = eurekaClient
.getNextServerFromEureka("zipkin", false);
if (!(baseUrl != null &&
instance.getHomePageUrl().equals(baseUrl))) {
baseUrl = instance.getHomePageUrl();
delegate = new HttpZipkinSpanReporter(new RestTemplate(),
baseUrl, zipkinProperties.getFlushInterval(), spanMetricReporter);
if (!span.name.matches(skipPattern)) delegate.report(span);
}
}
};
}
上面的配置註冊了一個自定義ZipkinSpanReporter
,該URL從ZipkinSpanReporter
獲取。此代碼還跟踪現有URL,並且僅在URL更改時才更新HttpZipkinSpanReporter
。這樣,無論我們將Zipkin服務器部署到何處,我們都將能夠找到它而無需重新啟動服務。
我們還將導入Spring Boot加載的默認Zipkin屬性,並使用它們來管理我們的自定義報告器。
3.3。配置
現在,讓我們在配置存儲庫中的book-service.properties
文件中添加一些配置:
spring.sleuth.sampler.percentage=1.0
spring.sleuth.web.skipPattern=(^cleanup.*)
Zipkin
通過採樣服務器上的操作來工作。通過將spring.sleuth.sampler.percentage
設置為1.0,我們將採樣率設置為100%。跳過模式只是用於排除名稱匹配的跨度的正則表達式。
跳過模式將阻止報告以單詞“ cleanup”開頭的所有跨度。這是為了停止源自spring會話代碼庫的跨度。
3.4。評級服務
請遵循上述“ book-service
部分中的相同步驟,將更改應用於等價文件以進行rating-service.
3.5。網關服務
遵循相同的步驟book-service 。但是,當將配置添加到網關*.properties時,請*添加以下內容:
spring.sleuth.sampler.percentage=1.0
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
這將配置網關服務,使其不發送有關favicon或spring會話的跨度。
3.6 運行
如果尚未進行配置,請啟動config , Discovery , gateway , book , rating和zipkin服務。
導航到http:// localhost:8080 / book-service / books。
打開一個新選項卡,然後瀏覽至http:// localhost:9411。選擇圖書服務,然後按“查找痕跡”按鈕。您應該看到一條痕跡出現在搜索結果中。單擊打開它的痕跡:
在跟踪頁面上,我們可以按服務細分請求。前兩個範圍由gateway
創建,最後一個範圍由book-service.
創建book-service.
這向我們顯示了請求在book-service,
上花費的時間為18.379毫秒,而在gateway,
上為87.961毫秒。
4。結論
我們已經看到將Zipkin
集成到我們的雲應用程序是多麼容易。
這使我們對通信如何通過我們的應用程序傳播有了一些急需的見解。隨著我們應用程序複雜性的增加,Zipkin可以為我們提供急需的信息,以了解請求在何處花費時間。這可以幫助我們確定出現問題的地方,並指出需要改進應用程序的哪些方面。
與往常一樣,您可以在Github上找到源代碼。