隨着業務越來越復雜,系統也隨之進行各種拆分,特別是隨着微服務架構的興起,看似一個簡單的應用,后台可能很多服務在支撐;一個請求可能需要多個服務的調用;當請求遲緩或不可用時,無法得知是哪個微服務引起的,這時就需要解決如何快速定位服務故障點,Zipkin 分布式跟蹤系統就能很好的解決這樣的問題。
那么到底怎么使用呢?接下來完成一個具體的實例來體會一把微服務鏈路追蹤:
本文使用的 Spring Cloud Finchley
版本,和其他版本會有不同
我們使用user-service
,order-service
作為兩個微服務,zuul-gateway
作為服務網關
zuul-gateway -> order-service -> user-service
, 形成服務調用鏈路,完成一次請求。
注意:Zipkin 不再推薦我們來自定義 Server 端,在最新版本的 Spring Cloud 依賴管理里已經找不到 Zipkin-server 了 ,根本就不需要自己新建一個 Zipkin-server 服務,網上的各種教程都數互相抄的,請無視
##一,環境安裝
- 本人使用 centos 7 ,java-10
- 安裝 Zipkin:聚合各個業務系統之間的調用延遲數據
- 安裝 RabbitMQ:系統調用數據傳輸
- 安裝 Elasticsearch:系統調用數據持久化
- 安裝Elasticsearch-head:Elasticsearch 可視化
二,創建微服務
- user-service
- 以下是pom依賴文件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<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-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</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>
<!--數據傳輸-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
- 新建@RestController 接口 UserOrderController,代碼如下:
@RestController
public class UserOrderController {
@Autowired
private UserOrderService orderService;
@RequestMapping(value = "/getUserOrder", method = RequestMethod.GET)
public String getUserOrder() {
return orderService.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: 9100
zipkin 參數說明:
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網關
- 以下是pom依賴文件
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</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>
<!--數據傳輸-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
```
2. application.yml 配置文件如下:
```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` 路由配置自己找資料參考啊,這里不做說明
以上我們微服務全部完成,然后全部啟動
三,啟動各系統和組件
前面說不推薦用戶自己創建 Zipkin
服務,那怎么把數據傳輸到 Zipkin服務器呢?就是利用Zipkin的環境變量,通過環境變量讓 Zipkin 從 RabbitMQ 中讀取信息
1,啟動Zipkin
服務,並指定 RabbitMQ
做數據傳輸,Elasticsearch
持久化數據,啟動命令如下:
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 做數據傳輸
--STORAGE_TYPE=elasticsearch --ES_HOSTS=http//:localhost:9200 --ES_HTTP_LOGGING=BASIC
指定用 Eelasticsearch 做數據傳輸
可配置的環境變量,請參考:https://www.rabbitmq.com/uri-spec.html
當然你覺得 搭建Elasticsearch
太麻煩了,也可以用MYSQL 生成環境推薦使用 Elasticsearch,或者你只想自己試一下,那你可以不用存儲,數據就在內存中。
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
網關,請求你自己定義的接口,這個有錯自己解決
查看RabbitMQ可視化界面,就能看到 數據傳輸信息。如下圖:
查看Zipkin可視化界面,就能看到服務調用鏈路信息。如下圖:
查看Elasticsearch-head可視化界面,就能看到 Elasticsearch 存儲的數據信息。如下圖:
以上一個完成的分布式服務鏈路追蹤系統完成。
###詳細代碼: [https://github.com/jarvisqi/spring-cloud-microservice](https://github.com/jarvisqi/spring-cloud-microservice)
參考: