Spring Cloud 分布式链路跟踪 Sleuth + Zipkin + Elasticsearch【Finchley 版】

随着业务愈来愈复杂,系统也随之进行各类拆分,特别是随着微服务架构的兴起,看似一个简单的应用,后台可能不少服务在支撑;一个请求可能须要多个服务的调用;当请求迟缓或不可用时,没法得知是哪一个微服务引发的,这时就须要解决如何快速定位服务故障点,Zipkin 分布式跟踪系统就能很好的解决这样的问题。html

那么到底怎么使用呢?接下来完成一个具体的实例来体会一把微服务链路追踪:java

本文使用的 Spring Cloud Finchley 版本,和其余版本会有不一样git

咱们使用user-service,order-service 做为两个微服务,zuul-gateway 做为服务网关github

zuul-gateway -> order-service -> user-service, 造成服务调用链路,完成一次请求。web

注意:Zipkin 再也不推荐咱们来自定义 Server 端,在最新版本的 Spring Cloud 依赖管理里已经找不到 Zipkin-server 了 ,根本就不须要本身新建一个 Zipkin-server 服务,网上的各类教程都数互相抄的,请无视


一,环境安装

  1. 本人使用 centos 7 ,java-10
  2. 安装 Zipkin:聚合各个业务系统之间的调用延迟数据
  3. 安装 RabbitMQ:系统调用数据传输
  4. 安装 Elasticsearch:系统调用数据持久化
  5. 安装Elasticsearch-head:Elasticsearch 可视化

二,建立微服务

  1. user-service
  2. 如下是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>
  1. 新建@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 服务
  1. 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 服务器的地址
  1. order-service
  2. pom依赖文件和user-service相同
  3. 新建@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 调用的
  1. application.yml 配置文件和user-service相同spring

  2. zuul-gateway网关
    1. 如下是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>
    1. 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 路由配置本身找资料参考啊,这里不作说明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-serviceorder-service,zuul-gateway 网关,请求你本身定义的接口,这个有错本身解决

查看RabbitMQ可视化界面,就能看到 数据传输信息。以下图:

查看Zipkin可视化界面,就能看到服务调用链路信息。以下图:

查看Elasticsearch-head可视化界面,就能看到 Elasticsearch 存储的数据信息。以下图:



以上一个完成的分布式服务链路追踪系统完成。


详细代码: https://github.com/jarvisqi/spring-cloud-microservice





参考:

  1. https://github.com/openzipkin/zipkin
  2. http://www.rabbitmq.com/documentation.html
  3. https://www.elastic.co/products/elasticsearch
  4. https://windmt.com/2018/04/24/spring-cloud-12-sleuth-zipkin/
相关文章
相关标签/搜索