【SpringCloud】Spring Cloud Sleuth + Zipkin 服务调用链路追踪(二十五)

摘要:
    常见的业界开源解决方案1、Dapper(谷歌)2、Zikpin,与SpringCloudSleuth结合的比较好3、Eagleeye(阿里)4、pinpoint5、skywalking本文主要讲述如何在SpringCloudSleuth中集成Zipkin。在SpringCloudSleuth中集成Zipkin非常的简单,只需要引入相应的依赖和做相关的配置即可。SpringCloudSleuth简介SpringCloudSleuth为SpringCloud实现了分布式跟踪解决方案。官网:https://cloud.spring.io/spring-cloud-static/spring-cloud-sleuth/2.2.2.RELEASE/reference/html/#introduction术语Span:基本工作单元。同样,发生了ClientSent事件。下图显示了spans的父子关系:Zipkin简介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批注:

【SpringCloud】Spring Cloud Sleuth + Zipkin 服务调用链路追踪(二十五)第1张

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

    Trace Id = X
    Span Id = D
    Client Sent

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

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

【SpringCloud】Spring Cloud Sleuth + Zipkin 服务调用链路追踪(二十五)第2张

Zipkin简介

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

官网:https://zipkin.io/

链路追踪案例

架构图

【SpringCloud】Spring Cloud Sleuth + Zipkin 服务调用链路追踪(二十五)第3张

  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

【SpringCloud】Spring Cloud Sleuth + Zipkin 服务调用链路追踪(二十五)第4张

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

【SpringCloud】Spring Cloud Sleuth + Zipkin 服务调用链路追踪(二十五)第5张

  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依赖

【SpringCloud】Spring Cloud Sleuth + Zipkin 服务调用链路追踪(二十五)第6张

完整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 classPaymentMain8010 {
3     public static voidmain(String[] args) {
4         SpringApplication.run(PaymentMain8010.class, args);
5 }
6 }

5、编写Controller

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

6、测试

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

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

【SpringCloud】Spring Cloud Sleuth + Zipkin 服务调用链路追踪(二十五)第7张

  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 classOrderMain7995 {
3     public static voidmain(String[] args) {
4         SpringApplication.run(OrderMain7995.class, args);
5 }
6 }

5、编写配置类

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

6、编写controller,调用服务

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

7、测试

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

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

【SpringCloud】Spring Cloud Sleuth + Zipkin 服务调用链路追踪(二十五)第8张

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

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

【SpringCloud】Spring Cloud Sleuth + Zipkin 服务调用链路追踪(二十五)第9张

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

【SpringCloud】Spring Cloud Sleuth + Zipkin 服务调用链路追踪(二十五)第10张

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

【SpringCloud】Spring Cloud Sleuth + Zipkin 服务调用链路追踪(二十五)第11张

免责声明:文章转载自《【SpringCloud】Spring Cloud Sleuth + Zipkin 服务调用链路追踪(二十五)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇linux /etc/fstab 文件详细说明(整理版)SQL性能调优下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ORACLE 数据、表误删恢复(转)

今天主要以oracle数据库为例,介绍关于表中数据删除的解决办法。(不考虑全库备份和利用归档日志)删除表中数据有三种方法:·delete(删除一条记录)·drop或truncate删除表格中数据 1.delete误删除的解决方法原理: 利用oracle提供的闪回方法,如果在删除数据后还没做大量的操作(只要保证被删除数据的块没被覆写),就可以利用闪回方式直接...

TCP全连接队列和半连接队列已满之后的连接建立过程抓包分析[转]

最近项目需要做单机100万长连接与高并发的服务器,我们开发完服务器以后,通过自己搭的高速压测框架压测服务端的时候,发生了奇怪的现象,就是服务端莫名其妙的少接收了连接,造成了数据包的丢失,通过网上查资料,和自己的实践,下面是我做实验,抓包分析的过程如下: 总共5个连接 其中全连接队列somaxconn参数为1表示监听队列的总长度(实际可以完成somaxcon...

logstash之input、codec学习

Logstash最强大的功能在于丰富的过滤器插件。此过滤器提供的并不单单是过滤的功能,还可以对进入过滤器的原始数据进行复杂的逻辑处理。甚至添加独特的事件到后续流程中。 1、logstash基本语法组成 logstash主要由三部分组成:input、filter、output。而filter就是过滤器插件,这个组件可以不要,但是这样子就不能体现出logtas...

Hive函数大全-完整版

Hive函数大全–完整版 现在虽然有很多SQL ON Hadoop的解决方案,像Spark SQL、Impala、Presto等等,但就目前来看,在基于Hadoop的大数据分析平台、数据仓库中,Hive仍然是不可替代的角色。尽管它的相应延迟大,尽管它启动MapReduce的时间相当长,但是它太方便、功能太强大了,做离线批量计算、ad-hoc查询甚至是实现数...

logstash 读取MySQL数据到elasticsearch 相差8小时解决办法

logstash和elasticsearch是按照UTC时间的,kibana却是按照正常你所在的时区显示的,是因为kibana中可以配置时区信息。 具体看这个: logstash 的配置文件添加 filter { ruby { code => "event.set('timestamp', event.get('@times...

SpringCloud2.0 Hystrix Feign 基于Feign实现断路器 基础教程(七)

1、启动【服务中心】集群,工程名:springcloud-eureka-server 参考 SpringCloud2.0 Eureka Server 服务中心 基础教程(二) 2、启动【服务提供者】集群,工程名:springcloud-eureka-client 参考 SpringCloud2.0 Eureka Client 服务注册 基础教程(三) 3、...