spring-cloud-sleuth+zipkin追踪服务实现(一)
1.簡(jiǎn)述
最近在學(xué)習(xí)spring cloud構(gòu)建微服務(wù),研究追蹤微服務(wù)rest服務(wù)調(diào)用鏈路的問(wèn)題,接觸到zipkin,而spring cloud也提供了spring-cloud-sleuth來(lái)方便集成zipkin實(shí)現(xiàn)。
我們準(zhǔn)備了三個(gè)必要的程序來(lái)做測(cè)試,分別是
1、microservice-zipkin-server
負(fù)責(zé)數(shù)據(jù)收集以及信息展示功能。
2、microservice-zipkin-client-backend
負(fù)責(zé)微服務(wù)的生產(chǎn)者,對(duì)外提供 “http://127.0.0.1:11010/call/1” 的地址來(lái)完成一個(gè)簡(jiǎn)單的功能rest請(qǐng)求。
3、microservice-zipkin-client
負(fù)責(zé)微服務(wù)的調(diào)用,對(duì)外提供 "http://localhost:11009/call/1" 的rest地址,當(dāng)訪(fǎng)問(wèn)此地址時(shí),使用feign方式調(diào)用provider的rest服務(wù)地址。得到計(jì)算結(jié)果后,顯示在界面上。
2.準(zhǔn)備工作
三個(gè)程序功能非常簡(jiǎn)單,接下來(lái)我們看看每個(gè)程序的具體代碼和配置。為了方便我們對(duì)三個(gè)模塊開(kāi)發(fā),我們?cè)诟窹OM文件中添加了spring-boot和spring-cloud的依賴(lài),避免子模塊中需要寫(xiě)版本號(hào)
<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>?
接下來(lái)我們看看三個(gè)程序中的相關(guān)配置
3.具體實(shí)現(xiàn)
3.1 microservice-zipkin-server
首先,我們添加maven依賴(lài)配置
<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>?
在這里為了測(cè)試方便,我們可以將數(shù)據(jù)保存到內(nèi)存中,但是生產(chǎn)環(huán)境還是需要將數(shù)據(jù)持久化中。原生支持了很多產(chǎn)品,例如ES、數(shù)據(jù)庫(kù)等,本例中我們采用將數(shù)據(jù)保存到內(nèi)存中的方式來(lái)演示。
我們寫(xiě)一個(gè)啟動(dòng)類(lèi)ZipkinServer,代碼非常簡(jiǎn)單,如下
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);} }?
接下來(lái)我們配置application.ym配置文件
server:port: 11008 spring:application:name : microservice-zipkin-server?
啟動(dòng)后 無(wú)異常輸出,這樣我們的server程序就OK了
3.2 microservice-zipkin-client-backend 與microservice-zipkin-client
這兩個(gè)程序,與其他基礎(chǔ)代碼我們就不多講了(相信學(xué)些到這一步的童鞋,都已經(jīng)對(duì)spring cloud創(chuàng)建微服務(wù)以上手了),兩個(gè)程序在spring-cloud-sleuth相關(guān)的配置都是一樣。
首先,我們要在二者的POM文件中添加依賴(lài),引入zipkin客戶(hù)端自動(dòng)配置相關(guān)依賴(lài)
?
其次,在配置文件application中,我們加入zipkin server收集信息的地址
spring:application:name: microservice-zipkin-client-backendzipkin:base-url: http://localhost:11008?
這樣我們的兩個(gè)微服務(wù)就配置好了(注意這里我們并不會(huì)再說(shuō)明如何寫(xiě)rest接口和使用feign調(diào)用rest接口),具體參考代碼
4 測(cè)試
先后啟動(dòng)我們的三個(gè)程序
先啟動(dòng)microservice-zipkin-server 然后訪(fǎng)問(wèn)在瀏覽器中訪(fǎng)問(wèn)UI界面地址http://127.0.0.1:11008,
可以看到如下效果
image.png其中Span Name選項(xiàng)為灰色不可選,說(shuō)明目前沒(méi)有數(shù)據(jù),我們查看數(shù)據(jù)庫(kù)也可以看到?jīng)]有任何數(shù)據(jù)信息。
接下來(lái)我們?cè)L問(wèn)consumer提供的訪(fǎng)問(wèn)地址 http://localhost:11009/call/1
刷新幾次之后,我們?cè)俅嗡⑿挛覀兊膠ipkin界面,可以看到Span Name已經(jīng)可以選擇了。
image.png點(diǎn)擊Find Traces按鈕,我們可以看到調(diào)用的鏈路和耗時(shí)情況,點(diǎn)擊Dependencies,我們可以看到provider和consumer的調(diào)用圖
image.pngOK,我們的簡(jiǎn)單實(shí)用spring-cloud-sleuth+zipkin的例子就完成了。
5.拓展
在測(cè)試的過(guò)程中我們會(huì)發(fā)現(xiàn),有時(shí)候,程序剛剛啟動(dòng)后,刷新幾次,并不能看到任何數(shù)據(jù),原因就是我們的spring-cloud-sleuth收集信息是有一定的比率的,默認(rèn)的采樣率是0.1,配置此值的方式在配置文件中增加spring.sleuth.sampler.percentage參數(shù)配置(如果不配置默認(rèn)0.1),如果我們調(diào)大此值為1,可以看到信息收集就更及時(shí)。但是當(dāng)這樣調(diào)整后,我們會(huì)發(fā)現(xiàn)我們的rest接口調(diào)用速度比0.1的情況下慢了很多,即時(shí)在0.1的采樣率下,我們多次刷新consumer的接口,會(huì)發(fā)現(xiàn)對(duì)同一個(gè)請(qǐng)求兩次耗時(shí)信息相差非常大,如果取消spring-cloud-sleuth后我們?cè)贉y(cè)試,會(huì)發(fā)現(xiàn)并沒(méi)有這種情況,可以看到這種方式追蹤服務(wù)調(diào)用鏈路會(huì)給我們業(yè)務(wù)程序性能帶來(lái)一定的影響。
其實(shí),我們仔細(xì)想想也可以總結(jié)出這種方式的幾種缺陷
缺陷1:zipkin客戶(hù)端向zipkin-server程序發(fā)送數(shù)據(jù)使用的是http的方式通信,每次發(fā)送的時(shí)候涉及到連接和發(fā)送過(guò)程。
缺陷2:當(dāng)我們的zipkin-server程序關(guān)閉或者重啟過(guò)程中,因?yàn)榭蛻?hù)端收集信息的發(fā)送采用http的方式會(huì)被丟失。
針對(duì)以上兩個(gè)明顯的缺陷,改進(jìn)的辦法是
1、通信采用socket或者其他效率更高的通信方式。
2、客戶(hù)端數(shù)據(jù)的發(fā)送盡量減少業(yè)務(wù)線(xiàn)程的時(shí)間消耗,采用異步等方式發(fā)送收集信息。
3、客戶(hù)端與zipkin-server之間增加緩存類(lèi)的中間件,例如redis、MQ等,在zipkin-server程序掛掉或重啟過(guò)程中,客戶(hù)端依舊可以正常的發(fā)送自己收集的信息。
相信采用以上三種方式會(huì)很大的提高我們的效率和可靠性。其實(shí)spring-cloud以及為我們提供采用MQ或redis等其他的采用socket方式通信,利用消息中間件或數(shù)據(jù)庫(kù)緩存的實(shí)現(xiàn)方式。下一次我們?cè)賮?lái)測(cè)試spring-cloud-sleuth-zipkin-stream方式的實(shí)現(xiàn)。
6.項(xiàng)目源碼:
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
第三方:https://yq.aliyun.com/articles/78128?utm_campaign=wenzhang&utm_medium=article&utm_source=QQ-qun&201758&utm_content=m_19862
?
轉(zhuǎn)載于:https://www.cnblogs.com/powerwu/articles/9851557.html
總結(jié)
以上是生活随笔為你收集整理的spring-cloud-sleuth+zipkin追踪服务实现(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Codeforces Round #51
- 下一篇: 基于openFrameworks 三维重