簡介
在微服務架構下存在多個服務之間的相互調用,當某個請求變慢或不可用時,我們如何快速定位服務故障點呢?鏈路追蹤的實現就是為了解決這一問題,本文采用Sleuth+Zipkin+RabbitMQ+ES+Kibana實現。
Spring Cloud Sleuth
Trace:從客戶端請求到系統邊界,再到系統邊界返回客戶端響應。
Span:每一次調用埋入一個調用記錄,即為 “Span”,一系列有序的Span構成一個Trace。
Zipkin
Zipkin 是由Twitter公司開源的一個分布式追蹤系統,用於收集服務的定時數據,實現數據的收集、存儲、查找和展現。提供了可插拔的數據存儲方式:In-Memory、MySql、Cassandra以及Elasticsearch。
RabbitMQ
RabbitMQ是一個開源的AMQP實現,服務器端用Erlang語言編寫,支持多種客戶端,用於在分布式系統中存儲轉發消息,在易用性、擴展性、高可用性等方面表現不俗。
Elasticsearch
Elasticsearch(ES)是一個基於Lucene構建的開源、分布式、RESTful接口的全文搜索引擎。Elasticsearch還是一個分布式文檔數據庫,其中每個字段均可被索引,而且每個字段的數據均可被搜索,ES能夠橫向擴展至數以百計的服務器存儲以及處理PB級的數據。可以在極短的時間內存儲、搜索和分析大量的數據。
Kibana
Kibana可以為 Logstash 和 ElasticSearch 提供友好的日志分析 Web 界面,可以實現匯總、分析和搜索重要數據日志。
實現
1、Zipkin服務端
創建zipkin-server項目(也可到官方網站:https://zipkin.io/下載jar包直接使用)
依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>io.zipkin.java</groupId> <artifactId>zipkin-server</artifactId> <version>2.11.8</version> </dependency> <dependency> <groupId>io.zipkin.java</groupId> <artifactId>zipkin-autoconfigure-ui</artifactId> <version>2.11.8</version> </dependency> <dependency> <groupId>io.zipkin.java</groupId> <artifactId>zipkin-autoconfigure-collector-rabbitmq</artifactId> <version>2.11.8</version> </dependency> <dependency> <groupId>io.zipkin.java</groupId> <artifactId>zipkin-autoconfigure-storage-elasticsearch-http</artifactId> <version>2.8.4</version> </dependency>
配置
spring: application: name: zipkin-server server: port: 8033 eureka: client: serviceUrl: defaultZone: http://localhost:8088/eureka/ instance: prefer-ip-address: true management: metrics: web: server: auto-time-requests: false zipkin: collector: rabbitmq: addresses: 192.168.233.128 port: 5672 username: zipkin password: zipkin virtual-host: vh1 queue: zipkin storage: StorageComponent: elasticsearch type: elasticsearch elasticsearch: hosts: 192.168.233.171:9200 cluster: elasticsearch index: zipkin index-shards: 5 index-replicas: 1
啟動類
@SpringBootApplication @EnableEurekaClient @EnableZipkinServer public class ZipkinServerApplication { public static void main(String[] args) { SpringApplication.run(ZipkinServerApplication.class, args); } }
訪問 http://localhost:8033/zipkin/
2、Zipkin客戶端
依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> </dependency>
配置
spring: sleuth: sampler: probability: 1.0 zipkin: sender: type: RABBIT rabbitmq: addresses: 192.168.233.128 port: 5672 username: zipkin password: zipkin virtual-host: vh1
3、測試:
訪問zipkin客戶端服務,如我本地user-server http://localhost:8061/user/findAll
點“Find Traces”,看一下zipkin服務端
訪問 http://192.168.233.171:5601 ,看一下Kibana,配置一個index pattern
修改默認時間格式
看一下效果
注:之前的圖片不清楚,后來重新更新了圖片,因此,圖片上的時間會晚於文章時間。