随着业务愈来愈复杂,系统也随之进行各类拆分,特别是随着微服务架构的兴起,看似一个简单的应用,后台可能不少服务在支撑;一个请求可能须要多个服务的调用;当请求迟缓或不可用时,没法得知是哪一个微服务引发的,这时就须要解决如何快速定位服务故障点,Zipkin 分布式跟踪系统就能很好的解决这样的问题。html
那么到底怎么使用呢?接下来完成一个具体的实例来体会一把微服务链路追踪:java
本文使用的 Spring Cloud Finchley
版本,和其余版本会有不一样git
咱们使用user-service
,order-service
做为两个微服务,zuul-gateway
做为服务网关github
zuul-gateway -> order-service -> user-service
, 造成服务调用链路,完成一次请求。web
<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 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 服务
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 服务器的地址
@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相同spring
<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>
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
路由配置本身找资料参考啊,这里不作说明shell
以上咱们微服务所有完成,而后所有启动centos
前面说不推荐用户本身建立 Zipkin
服务,那怎么把数据传输到 Zipkin服务器呢?就是利用Zipkin的环境变量,经过环境变量让 Zipkin 从 RabbitMQ 中读取信息
1,启动Zipkin
服务,并指定 RabbitMQ
作数据传输,Elasticsearch
持久化数据,启动命令以下:api
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 存储的数据信息。以下图:
以上一个完成的分布式服务链路追踪系统完成。
参考: