zoukankan      html  css  js  c++  java
  • 【SpringCloud】Spring Cloud Sleuth + Zipkin 服务调用链路追踪(二十五)

    服务调用链路追踪

      微服务架构是一个分布式架构,它按业务划分服务单元,一个分布式系统往往有很多个服务单元。由于服务单元数量众多,业务的复杂性,如果出现了错误和异常,很难去定位。主要体现在,一个请求可能需要调用很多个服务,而内部服务的调用复杂性,决定了问题难以定位。所以微服务架构中,必须实现分布式链路追踪,去跟进一个请求到底有哪些服务参与,参与的顺序又是怎样的,从而达到每个请求的步骤清晰可见,出了问题,很快定位。

      举个例子,在微服务系统中,一个来自用户的请求,请求先达到前端A(如前端界面),然后通过远程调用,达到系统的中间件B、C(如负载均衡、网关等),最后达到后端服务D、E,后端经过一系列的业务逻辑计算最后将数据返回给用户。对于这样一个请求,经历了这么多个服务,怎么样将它的请求过程的数据记录下来呢?这就需要用到服务链路追踪。

      Google开源的 Dapper链路追踪组件,并在2010年发表了论文《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》,这篇文章是业内实现链路追踪的标杆和理论基础,具有非常大的参考价值。  

      常见的业界开源解决方案

      1、Dapper(谷歌)

      2、Zikpin,与Spring Cloud Sleuth结合的比较好

      3、Eagleeye(阿里)

      4、pinpoint

      5、skywalking

      本文主要讲述如何在Spring Cloud Sleuth中集成Zipkin。在Spring Cloud Sleuth中集成Zipkin非常的简单,只需要引入相应的依赖和做相关的配置即可。

    Spring Cloud Sleuth简介

      Spring Cloud Sleuth为Spring Cloud实现了分布式跟踪解决方案

      官网:https://cloud.spring.io/spring-cloud-static/spring-cloud-sleuth/2.2.2.RELEASE/reference/html/#introduction

      术语

      Span:基本工作单元。例如,发送RPC是一个新的跨度,就像发送响应到RPC一样。跨度由跨度的唯一64位ID和跨度所属的跟踪的另一个64位ID标识。跨区还具有其他数据,例如描述,带有时间戳的事件,键值注释(标签),引起跨度的跨区ID和进程ID(通常为IP地址)。

      跨度可以启动和停止,并且可以跟踪其时序信息。创建跨度后,您必须在将来的某个时间点将其停止。

      Trace:一组spans,形成树状结构。例如,如果您运行分布式大数据存储,则跟踪可能由PUT请求形成。

      Annotation:用来及时记录一个事件的,一些核心注解用来定义一个请求的开始和结束 。这些注解包括以下:

      • cs:客户端已发送。客户提出了要求。此注释指示跨度的开始。
      • sr:接收到服务器:服务器端收到了请求并开始处理它。从此时间戳中减去cs时间戳可显示网络延迟。
      • ss:服务器已发送。在请求处理完成时进行注释(当响应被发送回客户端时)。从此时间戳中减去sr时间戳将显示服务器端处理请求所需的时间。
      • cr:收到客户。表示跨度结束。客户端已成功收到服务器端的响应。从此时间戳中减去cs时间戳将显示客户端从服务器接收响应所需的整个时间。

      图显示了SpanTrace在系统中的外观以及Zipkin批注:

       

        音符的每种颜色都表示一个跨度(从AG共有七个spans- )。请考虑以下注意事项:

        Trace Id = X
        Span Id = D
        Client Sent

        该说明指出,当前跨距跟踪编号设定为XSpan标识设置为d同样,发生了Client Sent事件。

        下图显示了spans的父子关系:

        

    Zipkin简介

      Zipkin是一个分布式跟踪系统。它有助于收集解决服务体系结构中的延迟问题所需的时序数据。功能包括该数据的收集和查找。

      官网:https://zipkin.io/

    链路追踪案例

      架构图

      

      Zipkin服务端搭建

        1、下载Zipkin服务端jar包,可以去网关下载,也可以去地址:https://dl.bintray.com/openzipkin/maven/io/zipkin/java/zipkin-server/

        2、使用命令启动Zipkin服务端,命令:java -jar zipkin-server-2.12.9-exec.jar

          

        3、使用浏览器访问地址:http://127.0.0.1:9411,9411是Zipkin的默认端口

          

      Sleuth服务提供者项目搭建

        Eureka注册中心搭建参考:【SpringCloud】快速入门(一)

        1、新建一个模块(springcloud-provider-sleuth-payment8010)作为Sleuth服务提供者

        2、修改pom文件,引入依赖zipkin + sleuth,以及eureka

     1 <!-- zipkin + sleuth -->
     2 <dependency>
     3     <groupId>org.springframework.cloud</groupId>
     4     <artifactId>spring-cloud-starter-zipkin</artifactId>
     5 </dependency>
     6 
     7 <!-- eureka client -->
     8 <dependency>
     9     <groupId>org.springframework.cloud</groupId>
    10     <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    11 </dependency>

        查看spring-cloud-starter-zipkin依赖,可以看到它包含了spring-cloud-starter-sleuth以及spring-cloud-starter-sleuth-zipkin依赖

        

        完整pom文件如下:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <project xmlns="http://maven.apache.org/POM/4.0.0"
     3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     5     <parent>
     6         <artifactId>test-springcloud</artifactId>
     7         <groupId>com.test</groupId>
     8         <version>1.0-SNAPSHOT</version>
     9     </parent>
    10     <modelVersion>4.0.0</modelVersion>
    11 
    12     <artifactId>springcloud-provider-sleuth-payment8010</artifactId>
    13 
    14     <dependencies>
    15 
    16         <!-- zipkin + sleuth -->
    17         <dependency>
    18             <groupId>org.springframework.cloud</groupId>
    19             <artifactId>spring-cloud-starter-zipkin</artifactId>
    20         </dependency>
    21 
    22         <!-- eureka client -->
    23         <dependency>
    24             <groupId>org.springframework.cloud</groupId>
    25             <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    26         </dependency>
    27 
    28         <!-- spring boot -->
    29         <dependency>
    30             <groupId>org.springframework.boot</groupId>
    31             <artifactId>spring-boot-starter-web</artifactId>
    32         </dependency>
    33         <dependency>
    34             <groupId>org.springframework.boot</groupId>
    35             <artifactId>spring-boot-starter-actuator</artifactId>
    36         </dependency>
    37 
    38         <dependency>
    39             <groupId>org.springframework.boot</groupId>
    40             <artifactId>spring-boot-devtools</artifactId>
    41             <scope>runtime</scope>
    42             <optional>true</optional>
    43         </dependency>
    44 
    45         <dependency>
    46             <groupId>org.projectlombok</groupId>
    47             <artifactId>lombok</artifactId>
    48             <optional>true</optional>
    49         </dependency>
    50         <dependency>
    51             <groupId>org.springframework.boot</groupId>
    52             <artifactId>spring-boot-starter-test</artifactId>
    53             <scope>test</scope>
    54         </dependency>
    55     </dependencies>
    56 
    57 </project>
    pom.xml

        3、编辑application.yml配置文件

     1 # 端口
     2 server:
     3   port: 8010
     4 
     5 spring:
     6   application:
     7     name: cloud-sleuth-provider
     8   zipkin:
     9     # zipkin url地址
    10     base-url: http://localhost:9411
    11   sleuth:
    12     sampler:
    13       # 采样率值介于 0 到 1 之间, 1 则表示全部采集
    14       # 默认值:0.1,即10%
    15       probability: 1
    16 
    17 eureka:
    18   client:
    19     service-url:
    20       defaultZone: http://localhost:8761/eureka

        4、编写启动类

    1 @SpringBootApplication
    2 public class PaymentMain8010 {
    3     public static void main(String[] args) {
    4         SpringApplication.run(PaymentMain8010.class, args);
    5     }
    6 }

        5、编写Controller

    1 @RestController
    2 public class PaymentController {
    3 
    4     @GetMapping("/payment/zipkin")
    5     public String paymentZipkin(){
    6         return "Hi, this is payment zipkin server";
    7     }
    8 }

        6、测试

          1)启动Eureka注册中心,启动Sleuth服务提供者

          2)访问地址:http://127.0.0.1:8010/payment/zipkin,正常获取内容

          

      Sleuth服务消费者项目搭建

        1、新建一个模块(springcloud-consumer-sleuth-order7995)作为Sleuth服务消费者

        2、修改pom文件,引入依赖zipkin + sleuth,以及eureka,内容同上

        3、编辑application.yml配置文件

     1 # 端口
     2 server:
     3   port: 7995
     4 
     5 spring:
     6   application:
     7     name: cloud-order
     8   zipkin:
     9     base-url: http://localhost:9411
    10   sleuth:
    11     sampler:
    12       # 采样率值介于 0 到 1 之间, 1 则表示全部采集
    13       probability: 1
    14   
    15 eureka:
    16   client:
    17     service-url:
    18       defaultZone: http://localhost:8761/eureka

        4、编写启动类

    1 @SpringBootApplication
    2 public class OrderMain7995 {
    3     public static void main(String[] args) {
    4         SpringApplication.run(OrderMain7995.class, args);
    5     }
    6 }

        5、编写配置类

     1 @Configuration
     2 public class AppConfig {
     3 
     4     /**
     5      * 注入restTemplate,请用请求rest接口
     6      * @return
     7      */
     8     @Bean
     9     // 标注此注解后,RestTemplate就具有了客户端负载均衡能力
    10     // 负载均衡技术依赖于的是Ribbon组件~
    11     // RestTemplate都塞入一个loadBalancerInterceptor 让其具备有负载均衡的能力
    12     @LoadBalanced
    13     public RestTemplate restTemplate(){
    14         return new RestTemplate();
    15     }
    16 }

        6、编写controller,调用服务

     1 @RestController
     2 public class OrderController {
     3 
     4     @Autowired
     5     private RestTemplate restTemplate;
     6 
     7     @GetMapping("/consumer/payment/zipkin")
     8     public String paymentZipkin(){
     9         String result = restTemplate.getForObject("http://CLOUD-SLEUTH-PROVIDER" + "/payment/zipkin", String.class);
    10         return result;
    11     }
    12 
    13 }

        7、测试

          1)启动Eureka注册中心,启动Sleuth服务提供者、消费者,Zipkin服务端

          2)访问地址:http://127.0.0.1:7995/consumer/payment/zipkin,正常获取内容

            

          3)查看Zipkin的Web界面,地址:http://127.0.0.1:9411/zipkin,点击查询按钮

            显示如下,可以看到里面的请求记录,包括:ROOT(微服务名,请求方式,请求路径)、TRACE ID、开始时间、持续时间

            

          4)查看最近一次请求CLOUD-ORDER的详情数据

            

          5)打开依赖页面,进行搜索,可以看打时间段内,服务之间的依赖关系

            

     

  • 相关阅读:
    根据时间类型查询
    @Autowired注解
    如何将jar包引入到本地maven仓库
    org.springframework.beans.factory.BeanDefinitionStoreException
    几个常用的 lombok 注解
    String类底层源码(随时更新)
    如何判断单链表有环
    指定java中Date日期格式化,实现字符串转Date
    vue学习记录
    小说,漫画
  • 原文地址:https://www.cnblogs.com/h--d/p/12864792.html
Copyright © 2011-2022 走看看