新聞中心
簡單介紹了服務(wù)網(wǎng)關(guān),并對SpringCloud Gateway的核心架構(gòu)進(jìn)行了簡要說明,也在項目中整合了SpringCloud Gateway網(wǎng)關(guān)實現(xiàn)了通過網(wǎng)關(guān)訪問后端微服務(wù),同時,也基于SpringCloud Gateway整合Sentinel實現(xiàn)了網(wǎng)關(guān)的限流功能,詳細(xì)介紹了SpringCloud Gateway網(wǎng)關(guān)的核心技術(shù)。在鏈路追蹤章節(jié),我們開始簡單介紹了分布式鏈路追蹤技術(shù)與解決方案,隨后在項目中整合Sleuth實現(xiàn)了鏈路追蹤。

作為一家“創(chuàng)意+整合+營銷”的成都網(wǎng)站建設(shè)機(jī)構(gòu),我們在業(yè)內(nèi)良好的客戶口碑。創(chuàng)新互聯(lián)提供從前期的網(wǎng)站品牌分析策劃、網(wǎng)站設(shè)計、成都網(wǎng)站制作、成都做網(wǎng)站、創(chuàng)意表現(xiàn)、網(wǎng)頁制作、系統(tǒng)開發(fā)以及后續(xù)網(wǎng)站營銷運營等一系列服務(wù),幫助企業(yè)打造創(chuàng)新的互聯(lián)網(wǎng)品牌經(jīng)營模式與有效的網(wǎng)絡(luò)營銷方法,創(chuàng)造更大的價值。
本章總覽
本章概述
在前面整合Sleuth實現(xiàn)鏈路追蹤時,我們是通過查看日志的情況來了解系統(tǒng)調(diào)用的鏈路情況,這并不是一種很好的解決方案,如果系統(tǒng)所包含的微服務(wù)越來越多,通過查看日志的方式來分析系統(tǒng)的調(diào)用是非常復(fù)雜的,在實際項目中根本不可行。此時,我們可以將Sleuth和ZipKin進(jìn)行整合,利用ZipKin將日志進(jìn)行聚合,將鏈路日志進(jìn)行可視化展示,并支持全文檢索。
ZipKin核心架構(gòu)
Zipkin 是 Twitter 的一個開源項目,它基于Google Dapper論文實現(xiàn),可以收集微服務(wù)運行過程中的實時鏈路數(shù)據(jù),并進(jìn)行展示。
ZipKin概述
Zipkin是一種分布式鏈路跟蹤系統(tǒng),能夠收集微服務(wù)運行過程中的實時調(diào)用鏈路信息,并能夠?qū)⑦@些調(diào)用鏈路信息展示到Web界面上供開發(fā)人員分析,開發(fā)人員能夠從ZipKin中分析出調(diào)用鏈路中的性能瓶頸,識別出存在問題的應(yīng)用程序,進(jìn)而定位問題和解決問題。
ZipKin核心架構(gòu)
ZipKin的核心架構(gòu)圖如下所示。
注:圖片來源:zipkin.io/pages/architecture.html
其中,ZipKin核心組件的功能如下所示。
- Reporter:ZipKin中上報鏈路數(shù)據(jù)的模塊,主要配置在具體的微服務(wù)應(yīng)用中。
- Transport:ZipKin中傳輸鏈路數(shù)據(jù)的模塊,此模塊可以配置為Kafka,RocketMQ、RabbitMQ等。
- Collector:ZipKin中收集并消費鏈路數(shù)據(jù)的模塊,默認(rèn)是通過http協(xié)議收集,可以配置為Kafka消費。
- Storage:ZipKin中存儲鏈路數(shù)據(jù)的模塊,此模塊的具體可以配置為ElasticSearch、Cassandra或者M(jìn)ySQL,目前ZipKin支持這三種數(shù)據(jù)持久化方式。
- API:ZipKin中的API 組件,主要用來提供外部訪問接口。比如給客戶端展示跟蹤信息,或是開放給外部系統(tǒng)實現(xiàn)監(jiān)控等。
- UI:ZipKin中的UI 組件,基于API組件實現(xiàn)的上層應(yīng)用。通過UI組件用戶可以方便并且很直觀地查詢和分析跟蹤信息。
Zipkin在總體上會分為兩個端,一個是Zipkin服務(wù)端,一個是Zipkin客戶端,客戶端主要是配置在微服務(wù)應(yīng)用中,收集微服務(wù)中的調(diào)用鏈路信息,將數(shù)據(jù)發(fā)送給ZipKin服務(wù)端。
項目整合ZipKin
Zipkin總體上分為服務(wù)端和客戶端,我們需要下載并啟動ZipKin服務(wù)端的Jar包,在微服務(wù)中集成ZipKin的客戶端。
下載安裝ZipKin服務(wù)端
(1)下載ZipKin服務(wù)端Jar文件,可以直接在瀏覽器中輸入如下鏈接進(jìn)行下載。
https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec
如果大家使用的是Linux操作系統(tǒng),也可以在命令行輸入如下命令進(jìn)行下載。
wget https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec
這里,我通過瀏覽器下載的ZipKin服務(wù)端Jar文件為:zipkin-server-2.12.9-exec.jar。
(2)在命令行輸入如下命令啟動ZipKin服務(wù)端。
java -jar zipkin-server-2.12.9-exec.jar
(3)由于ZipKin服務(wù)端啟動時,默認(rèn)監(jiān)聽的端口號為9411,所以,在瀏覽器中輸入http://localhost:9411鏈接就可以打開ZipKin的界面,如下所示。
在瀏覽器中輸入http://localhost:9411鏈接能夠打開上述頁面就說明ZipKin服務(wù)端已經(jīng)準(zhǔn)備好啦。
項目整合ZipKin客戶端
(1)在每個微服務(wù)(用戶微服務(wù)shop-user,商品微服務(wù)shop-product,訂單微服務(wù)shop-order,網(wǎng)關(guān)服務(wù)shop-gateway)中添加ZipKin依賴,如下所示。
org.springframework.cloud
spring-cloud-starter-zipkin
(2)在網(wǎng)關(guān)服務(wù)shop-gateway的application.yml文件中添加如下配置。
spring:
sleuth:
sampler:
probability: 1.0
zipkin:
base-url: http://127.0.0.1:9411
discovery-client-enabled: false
其中各配置的說明如下所示。
- spring.sleuth.sampler.probability:表示Sleuth的采樣百分比。
- spring.zipkin.base-url:ZipKin服務(wù)端的地址。
- spring.zipkin.discovery-client-enabled:配置成false,使Nacos將其當(dāng)成一個URL,不要按服務(wù)名處理。
(3)分別啟動用戶微服務(wù),商品微服務(wù),訂單微服務(wù)和服務(wù)網(wǎng)關(guān),在瀏覽器中訪問鏈接http://localhost:10001/server-order/order/submit_order?userId=1001&productId=1001&count=1,如下所示。
(4)點擊Zipkin界面上的查找按鈕,如下所示。
點擊后的界面如下所示。
可以看到,點擊查找按鈕后,會出現(xiàn)一個請求鏈路,包含:網(wǎng)關(guān)服務(wù)server-gateway耗時63.190毫秒,訂單微服務(wù)server-order耗時53.101毫秒,用戶微服務(wù)server-user耗時14.640毫秒,商品微服務(wù)server-product耗時10.941毫秒。
(5)點開ZipKin界面上顯示的調(diào)用鏈路,如下所示。
點開后的界面如下所示。
可以非常清晰的看到整個調(diào)用的訪問鏈路。
我們還可以點擊具體的節(jié)點來查看具體的調(diào)用信息。
例如我們點擊網(wǎng)關(guān)微服務(wù)查看網(wǎng)關(guān)的具體鏈路,如下所示。
點開后的效果如下所示。
接下來,查看下訂單微服務(wù)的調(diào)用鏈路具體信息,如下所示。
點開后的效果如下所示。
可以看到,通過ZipKin能夠查看服務(wù)的調(diào)用鏈路,并且能夠查看具體微服務(wù)的調(diào)用情況。我們可以基于ZipKin來分析系統(tǒng)的調(diào)用鏈路情況,找出系統(tǒng)的瓶頸點,進(jìn)而進(jìn)行針對性的優(yōu)化。
另外,ZipKin中也支持下載系統(tǒng)調(diào)用鏈路的Json數(shù)據(jù),如下所示。
點擊JSON按鈕后,效果如下所示。
其中,顯示的Json數(shù)據(jù)如下所示。
[
[
{
"traceId": "9d244edbc1668d92",
"parentId": "3f01ba499fac4ce9",
"id": "5f0932b5d06fe757",
"kind": "SERVER",
"name": "get /get/{pid}",
"timestamp": 1652413758790051,
"duration": 10941,
"localEndpoint": {
"serviceName": "server-product",
"ipv4": "192.168.0.111"
},
"remoteEndpoint": {
"ipv4": "192.168.0.111",
"port": 54140
},
"tags": {
"http.method": "GET",
"http.path": "/product/get/1001",
"mvc.controller.class": "ProductController",
"mvc.controller.method": "getProduct"
},
"shared": true
},
{
"traceId": "9d244edbc1668d92",
"parentId": "3f01ba499fac4ce9",
"id": "c020c7f6e0fa1604",
"kind": "SERVER",
"name": "get /update_count/{pid}/{count}",
"timestamp": 1652413758808052,
"duration": 5614,
"localEndpoint": {
"serviceName": "server-product",
"ipv4": "192.168.0.111"
},
"remoteEndpoint": {
"ipv4": "192.168.0.111",
"port": 54140
},
"tags": {
"http.method": "GET",
"http.path": "/product/update_count/1001/1",
"mvc.controller.class": "ProductController",
"mvc.controller.method": "updateCount"
},
"shared": true
},
{
"traceId": "9d244edbc1668d92",
"parentId": "9d244edbc1668d92",
"id": "3f01ba499fac4ce9",
"kind": "CLIENT",
"name": "get",
"timestamp": 1652413758763816,
"duration": 54556,
"localEndpoint": {
"serviceName": "server-gateway",
"ipv4": "192.168.0.111"
},
"remoteEndpoint": {
"ipv4": "192.168.0.111",
"port": 8080
},
"tags": {
"http.method": "GET",
"http.path": "/order/submit_order"
}
},
{
"traceId": "9d244edbc1668d92",
"parentId": "9d244edbc1668d92",
"id": "475ff483fb0973b1",
"kind": "CLIENT",
"name": "get",
"timestamp": 1652413758759023,
"duration": 59621,
"localEndpoint": {
"serviceName": "server-gateway",
"ipv4": "192.168.0.111"
},
"tags": {
"http.method": "GET",
"http.path": "/order/submit_order"
}
},
{
"traceId": "9d244edbc1668d92",
"id": "9d244edbc1668d92",
"kind": "SERVER",
"name": "get",
"timestamp": 1652413758757034,
"duration": 63190,
"localEndpoint": {
"serviceName": "server-gateway",
"ipv4": "192.168.0.111"
},
"remoteEndpoint": {
"ipv4": "127.0.0.1",
"port": 54137
},
"tags": {
"http.method": "GET",
"http.path": "/server-order/order/submit_order"
}
},
{
"traceId": "9d244edbc1668d92",
"parentId": "3f01ba499fac4ce9",
"id": "a048eda8d5fd3dc9",
"kind": "CLIENT",
"name": "get",
"timestamp": 1652413758774201,
"duration": 12054,
"localEndpoint": {
"serviceName": "server-order",
"ipv4": "192.168.0.111"
},
"tags": {
"http.method": "GET",
"http.path": "/user/get/1001"
}
},
{
"traceId": "9d244edbc1668d92",
"parentId": "3f01ba499fac4ce9",
"id": "5f0932b5d06fe757",
"kind": "CLIENT",
"name": "get",
"timestamp": 1652413758787924,
"duration": 12557,
"localEndpoint": {
"serviceName": "server-order",
"ipv4": "192.168.0.111"
},
"tags": {
"http.method": "GET",
"http.path": "/product/get/1001"
}
},
{
"traceId": "9d244edbc1668d92",
"parentId": "3f01ba499fac4ce9",
"id": "c020c7f6e0fa1604",
"kind": "CLIENT",
"name": "get",
"timestamp": 1652413758805787,
"duration": 7031,
"localEndpoint": {
"serviceName": "server-order",
"ipv4": "192.168.0.111"
},
"tags": {
"http.method": "GET",
"http.path": "/product/update_count/1001/1"
}
},
{
"traceId": "9d244edbc1668d92",
"parentId": "9d244edbc1668d92",
"id": "3f01ba499fac4ce9",
"kind": "SERVER",
"name": "get /submit_order",
"timestamp": 1652413758765048,
"duration": 53101,
"localEndpoint": {
"serviceName": "server-order",
"ipv4": "192.168.0.111"
},
"remoteEndpoint": {
"ipv4": "127.0.0.1"
},
"tags": {
"http.method": "GET",
"http.path": "/order/submit_order",
"mvc.controller.class": "OrderController",
"mvc.controller.method": "submitOrder"
},
"shared": true
},
{
"traceId": "9d244edbc1668d92",
"parentId": "3f01ba499fac4ce9",
"id": "a048eda8d5fd3dc9",
"kind": "SERVER",
"name": "get /get/{uid}",
"timestamp": 1652413758777073,
"duration": 14640,
"localEndpoint": {
"serviceName": "server-user",
"ipv4": "192.168.0.111"
},
"remoteEndpoint": {
"ipv4": "192.168.0.111",
"port": 54139
},
"tags": {
"http.method": "GET",
"http.path": "/user/get/1001",
"mvc.controller.class": "UserController",
"mvc.controller.method": "getUser"
},
"shared": true
}
]
]
小伙伴們也可以根據(jù)Json數(shù)據(jù)分析下系統(tǒng)的調(diào)用鏈路。
ZipKin數(shù)據(jù)持久化
我們實現(xiàn)了在項目中集成ZipKin,但是此時我們集成ZipKin后,ZipKin中的數(shù)據(jù)是保存在系統(tǒng)內(nèi)存中的,如果我們重啟了ZipKin,則保存在系統(tǒng)內(nèi)存中的數(shù)據(jù)就會丟失,那我如何避免數(shù)據(jù)丟失呢?ZipKin支持將數(shù)據(jù)進(jìn)行持久化來防止數(shù)據(jù)丟失,可以將數(shù)據(jù)保存到ElasticSearch、Cassandra或者M(jìn)ySQL中。這里,我們重點介紹下如何將數(shù)據(jù)保存到MySQL和ElasticSearch中。
ZipKin數(shù)據(jù)持久化到MySQL
(1)將Zipkin數(shù)據(jù)持久化到MySQL,我們需要知道MySQL的數(shù)據(jù)表結(jié)構(gòu),好在ZipKin提供了MySQL腳本,小伙伴們可以在鏈接:https://github.com/openzipkin/zipkin/tree/master/zipkin-storage里面下載。
當(dāng)然,我將下載后的MySQL腳本放到了網(wǎng)關(guān)服務(wù)shop-gateway的resources目錄下的scripts目錄下。
(2)在MySQL數(shù)據(jù)庫中新建zipkin數(shù)據(jù)庫,如下所示。
create database if not exists zipkin;
(3)在新建的數(shù)據(jù)庫zipkin中運行mysql.sql腳本,運行腳本后的效果如下所示。
可以看到,在zipkin數(shù)據(jù)庫中新建了zipkin_annotations、zipkin_dependencies和zipkin_spans三張數(shù)據(jù)表。
(4)啟動ZipKin時指定MySQL數(shù)據(jù)源,如下所示。
java -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSQL_DB=zipkin --MYSQL_USER=root --MYSQL_PASS=root
(5)啟動ZipKin后,在瀏覽器中訪問鏈接http://localhost:10001/server-order/order/submit_order?userId=1001&productId=1001&count=1,如下所示。
(6)查看zipkin數(shù)據(jù)庫中的數(shù)據(jù),發(fā)現(xiàn)zipkin_annotations數(shù)據(jù)表與zipkin_spans數(shù)據(jù)表已經(jīng)存在系統(tǒng)的調(diào)用鏈路數(shù)據(jù)。
zipkin_annotations數(shù)據(jù)表部分?jǐn)?shù)據(jù)如下所示。
zipkin_spans數(shù)據(jù)表部分?jǐn)?shù)據(jù)如下所示。
可以看到,ZipKin已經(jīng)將數(shù)據(jù)持久化到MySQL中,重啟ZipKin后就會從MySQL中讀取數(shù)據(jù),數(shù)據(jù)也不會丟失了。
ZipKin數(shù)據(jù)持久化到ElasticSearch
(1)到ElasticSearch官網(wǎng)下載ElasticSearch,鏈接為:
https://www.elastic.co/cn/downloads/elasticsearch。
這里下載的安裝包是:elasticsearch-8.2.0-windows-x86_64.zip。
(2)解壓elasticsearch-8.2.0-windows-x86_64.zip,在解壓后的bin目錄下找到elasticsearch.bat腳本,雙擊運行ElasticSearch。
(3)啟動ZipKin服務(wù)端時,指定ElasticSearch,如下所示。
java -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPE=elasticsearch --ESHOST=localhost:9200
(4)啟動ZipKin服務(wù)端后,在瀏覽器中訪問鏈接http://localhost:10001/server-order/order/submit_order?userId=1001&productId=1001&count=1,如下所示。
ZipKin就會將請求的鏈路信息保存到ElasticSearch中進(jìn)行持久化。
本文標(biāo)題:鏈路追蹤:Sleuth整合ZipKin
本文來源:http://fisionsoft.com.cn/article/ccdipho.html


咨詢
建站咨詢
