Spring Cloud Sleuth 实践与集成 zipkin 的实现

举报
李路的路 发表于 2021/07/03 13:51:03 2021/07/03
【摘要】 Spring Cloud Sleuth独立实现当Spring Cloud Sleuth单独使用时,通过日志关联的方式将请求的链路串联起来,分别启动之前准备的三个服务,并访问地址http://localhost:9002/api/service-b,服务A调用了服务B,成功返回响应后,我们看一下控制台的sleuth相关日志:服务A:2018-04-11 01:03:25.696 INFO [...

Spring Cloud Sleuth独立实现

当Spring Cloud Sleuth单独使用时,通过日志关联的方式将请求的链路串联起来,
分别启动之前准备的三个服务,并访问地址http://localhost:9002/api/service-b,服务A调用了服务B,成功返回响应后,我们看一下控制台的sleuth相关日志:

服务A:
2018-04-11 01:03:25.696 INFO [service-a,7feec0479597d1b9,578bef9ed3901d9b,false]
服务B:
2018-04-11 01:03:25.905 DEBUG [service-b,7feec0479597d1b9,578bef9ed3901d9b,false]

日志中输出的四部分信息分比为:

  • appname:service-a/b,是设置的应用名称;
  • traceId:7feec0479597d1b9,Spring Cloud Sleuth生成的TraceId,一次请求的唯一标识;
  • spanId:578bef9ed3901d9b,Spring Cloud Sleuth生成的SpanId,标识一个基本的工作单元,此处是feign进行的http调用;
  • exportable:false,是否将数据导出,如果只是想要在Span中封装一些操作并将其写日志时,此时就不需要将Span导出。

从上面的日志及输出信息的解释可以看出,发出的http到达A后,A向B发起调用,这是一次完整的调用过程,TraceId 在服务A和B中是相同的。Spring Cloud Sleuth在一次请求中,生成了如上四部分信息,TraceId唯一,可以有多个SpanId。

当然数据是可以导出进行分析的,如将日志信息导出到Elasticsearch,使用日志分析工具如Kibana、Splunk或者其他工具,比较常用的组合是ELK:Elasticsearch + Logstash + Kibana。

然而即便这样,还是需要我们自行对一些维度的数据进行分析,其实这些监控的数据维度基本比较确定,在业界也有提供的优秀组件,如zipkin、pinpoint等,利用这些工具将会避免不必要的分析工作。

集成Zipkin

Zipkin 是一个分布式的链路追踪系统。在定位微服务架构中的问题时,Zipkin有助于收集所需的时序数据,Zipkin负责收集和查找这些数据。Zipkin主要涉及几个组件:collector收集agent的数据,storage存储,Web UI图形化界面,查询Storage中存储的数据,提供简单的JSON API获取数据。

Collector收集agent的数据有两种方式:http调用和MQ消息中间件通信。Zipkin 客户端服务默认是通过http方式发送链路追踪信息到Zipkin Collector,http方式是进行同步调用,对原有请求会产生一些影响;MQ通信,则是异步方式进行收集链路调用信息,虽有一定的延时,但是总体性能较高。

zipkin.png

用HTTP通信

zipkin Server

首先,需要添加zipkin相关的依赖:

    <dependencies>
        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-autoconfigure-ui</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-server</artifactId>
        </dependency>
    </dependencies>

上面引入了zipkin UI和zipkin-server,zipkin UI提供了图形化展示链路调用情况以及服务之间的依赖。

然后,配置文件中指定zipkin服务器的端口号和应用名:

server:
  port: 9411

spring:
  application:
      name: microservice-zipkin-server

最后,应用程序的入口类实现:

@SpringBootApplication
@EnableZipkinServer
public class ZipkinServerApplication {
	public static void main(String[] args) {
		SpringApplication.run(ZipkinServerApplication.class, args);
	}
}

@EnableZipkinServer注解开启zipkin Server服务。

如上完成了zipkin Server的实现,为了示例简单,zipkin Server采用的是默认的内存数据库。

zipkin Client改造

首先,需要在依赖中加入sleuth的zipkin包。

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-sleuth-zipkin</artifactId>
    </dependency>

其次,配置文件中,增加zipkin Server的配置信息:

spring:
  sleuth:
    sampler:
      percentage: ${ZIPKIN_RATE:1}
  zipkin:
    base-url: http://localhost:9411

配置中设置了请求的采集率。当使用Zipkin时,通过设置spring.sleuth.sampler.probability配置导出Span的概率(默认值:0.1,即10%)。 默认值可能会让你觉得Sleuth不工作,因为它省略了一些Span;另外设置通过http方式发送到zipkin的地址。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。