zoukankan      html  css  js  c++  java
  • Spring Cloud 分布式链路跟踪 Sleuth + Zipkin + Elasticsearch【Finchley 版】

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

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

    本文使用的 Spring Cloud Finchley 版本,和其他版本会有不同

    我们使用user-service,order-service 作为两个微服务,zuul-gateway 作为服务网关

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

    注意: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相同

    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>
          ```
    
       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-headhttp://192.168.10.100:9100/ 可以看到界面,注意 集群健康值,要是未连接就是有问题,自己解决。
    5,启动user-serviceorder-service,zuul-gateway 网关,请求你自己定义的接口,这个有错自己解决

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

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

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


    以上一个完成的分布式服务链路追踪系统完成。
    ###详细代码: [https://github.com/jarvisqi/spring-cloud-microservice](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/
  • 相关阅读:
    找出数组中重复的值
    算法-二分法查询
    MySQL连接数据库url的参数characterEncoding=UTF-8
    String 与 list 相互转换
    php配置debug
    ideal+php
    命令行编译tomcat项目
    jsp+layui导出excel
    jsp+ssm+tomcat+ueditor上传定时处理无用文件
    jsp后台获取项目路劲
  • 原文地址:https://www.cnblogs.com/softmax/p/9336692.html
Copyright © 2011-2022 走看看