隨著業(yè)務越來越復雜萧诫,系統(tǒng)也隨之進行各種拆分斥难,特別是隨著微服務架構的興起,看似一個簡單的應用财搁,后臺可能很多服務在支撐蘸炸;一個請求可能需要多個服務的調用;當請求遲緩或不可用時尖奔,無法得知是哪個微服務引起的搭儒,這時就需要解決如何快速定位服務故障點,Zipkin 分布式跟蹤系統(tǒng)就能很好的解決這樣的問題提茁。
如果想學習Java工程化淹禾、高性能及分布式、深入淺出茴扁。微服務铃岔、Spring,MyBatis,Netty源碼分析的朋友可以加我的Java高級交流:854630135毁习,群里有阿里大牛直播講解技術智嚷,以及Java大型互聯(lián)網(wǎng)技術的視頻免費分享給大家。
那么到底怎么使用呢纺且?接下來完成一個具體的實例來體會一把微服務鏈路追蹤:
本文使用的 Spring Cloud Finchley 版本盏道,和其他版本會有不同
我們使用user-service,order-service 作為兩個微服務,zuul-gateway 作為服務網(wǎng)關
zuul-gateway -> order-service -> user-service载碌, 形成服務調用鏈路猜嘱,完成一次請求。
注意:Zipkin 不再推薦我們來自定義 Server 端嫁艇,在最新版本的 Spring Cloud 依賴管理里已經(jīng)找不到 Zipkin-server 了 朗伶,根本就不需要自己新建一個 Zipkin-server 服務,網(wǎng)上的各種教程都數(shù)互相抄的步咪,請無視
一论皆,環(huán)境安裝
本人使用 centos 7 ,java-10
安裝 Zipkin:聚合各個業(yè)務系統(tǒng)之間的調用延遲數(shù)據(jù)
安裝 RabbitMQ:系統(tǒng)調用數(shù)據(jù)傳輸
安裝 Elasticsearch:系統(tǒng)調用數(shù)據(jù)持久化
安裝Elasticsearch-head:Elasticsearch 可視化
二歧斟,創(chuàng)建微服務
user-service
以下是pom依賴文件
org.springframework.bootspring-boot-starter-weborg.springframework.cloudspring-cloud-starter-netflix-eureka-clientorg.springframework.bootspring-boot-starter-actuatororg.springframework.cloudspring-cloud-starter-openfeign<!--服務鏈路追蹤-->org.springframework.cloudspring-cloud-starter-sleuthorg.springframework.cloudspring-cloud-starter-zipkin<!--數(shù)據(jù)傳輸-->org.springframework.cloudspring-cloud-stream-binder-rabbit
新建@RestController 接口 UserOrderController纯丸,代碼如下:
@RestControllerpublicclassUserOrderController{@AutowiredprivateUserOrderService orderService;@RequestMapping(value ="/getUserOrder", method = RequestMethod.GET)publicString getUserOrder() {returnorderService.getOrder(); } } 說明:在 user-service 使用 FeignClient 調用 order-service 的 getOrder 服務
application.yml 配置文件如下:
spring: application: name:user-service sleuth: web: client: enabled:true sampler: probability:1.0 zipkin: base-url:http://192.168.10.100:9411/ enabled:true sender: type:RABBIT rabbitmq: addresses:192.168.10.100 port:15672 username:admin password:12345 virtual-host:sleuth server: port:9100zipkin參數(shù)說明: probability:1.0#將采樣比例設置為 1.0,也就是全部都需要静袖。默認是 0.1 base-url:http://192.168.10.100:9411/#Zipkin 服務器的地址
order-service
pom依賴文件和user-service相同
新建@RestController 接口 OrderController觉鼻,代碼如下:
@RestController public class OrderController {? @Value("${server.port}") private String port;@RequestMapping(value ="/getOrder", method = RequestMethod.GET) public String getOrder() { return"Success, Order-Service, Port :"+ port;} } 說明:getOrder接口就是給 user-service 調用的
application.yml 配置文件和user-service相同
zuul-gateway網(wǎng)關
以下是pom依賴文件
org.springframework.cloudspring-cloud-starter-netflix-zuulorg.springframework.cloudspring-cloud-starter-netflix-eureka-client<!--服務鏈路追蹤-->org.springframework.cloudspring-cloud-starter-sleuthorg.springframework.cloudspring-cloud-starter-zipkin<!--數(shù)據(jù)傳輸-->org.springframework.cloudspring-cloud-stream-binder-rabbit
application.yml 配置文件如下:
spring: application: name:zuul-gateway sleuth: web: client: enabled:true sampler: probability:1.0 zipkin: base-url:http://192.168.10.100:9411/ enabled:true sender: type:RABBIT rabbitmq: addresses:192.168.10.100 port:15672 username:admin password:12345 virtual-host:sleuth server: port:9310 eureka: client: service-url: defaultZone:http://localhost:8080/eureka/ zuul: prefix:/v1 routes:# http://localhost:9310/v1/user/# user Api user-api: path:/user/** serviceId:user-service# order Api order-api: path:/order/** serviceId:order-service
zipkin配置和user-service相同
zuul 路由配置自己找資料參考啊,這里不做說明
以上我們微服務全部完成队橙,然后全部啟動
三坠陈,啟動各系統(tǒng)和組件
前面說不推薦用戶自己創(chuàng)建 Zipkin服務,那怎么把數(shù)據(jù)傳輸?shù)?Zipkin服務器呢捐康?就是利用Zipkin的環(huán)境變量仇矾,通過環(huán)境變量讓 Zipkin 從 RabbitMQ 中讀取信息
1,啟動Zipkin服務解总,并指定 RabbitMQ做數(shù)據(jù)傳輸贮匕,Elasticsearch持久化數(shù)據(jù),啟動命令如下:
java -jar zipkin.jar--RABBIT_URI=amqp://admin:12345@localhost:5672/sleuth--STORAGE_TYPE=elasticsearch--ES_HOSTS=http//:localhost:9200--ES_HTTP_LOGGING=BASIC
說明:
--RABBIT_URI=amqp://admin:12345@localhost:5672/sleuth 指定用 RabbitMQ 做數(shù)據(jù)傳輸
--STORAGE_TYPE=elasticsearch --ES_HOSTS=http//:localhost:9200 --ES_HTTP_LOGGING=BASIC 指定用 Eelasticsearch 做數(shù)據(jù)傳輸
可配置的環(huán)境變量花枫,請參考:https://www.rabbitmq.com/uri-spec.html
當然你覺得 搭建Elasticsearch太麻煩了刻盐,也可以用MYSQL 生成環(huán)境推薦使用 Elasticsearch,或者你只想自己試一下劳翰,那你可以不用存儲敦锌,數(shù)據(jù)就在內(nèi)存中。
2佳簸,啟動RabbitMQ服務 http://192.168.10.100:15672/ 查看啟動生個乙墙,推薦自己新建個用戶,然后登錄 查看。
3听想,啟動Elasticsearch服務,http://192.168.10.100:9200/ 查看ES啟動腥刹,注意Elasticsearch 不能用root用戶啟動,具體怎么操作請百度教程哗魂。
4肛走,啟動Elasticsearch-head,http://192.168.10.100:9100/ 可以看到界面录别,注意 集群健康值,要是未連接就是有問題邻吞,自己解決组题。
5,啟動user-service抱冷,order-service,zuul-gateway 網(wǎng)關崔列,請求你自己定義的接口,這個有錯自己解決
查看RabbitMQ可視化界面旺遮,就能看到 數(shù)據(jù)傳輸信息赵讯。如下圖:
查看Zipkin可視化界面,就能看到服務調用鏈路信息耿眉。如下圖:
查看Elasticsearch-head可視化界面边翼,就能看到 Elasticsearch 存儲的數(shù)據(jù)信息。如下圖:
以上一個完成的分布式服務鏈路追蹤系統(tǒng)完成鸣剪。