Spring Cloud Sleuth 实践与集成 zipkin 的实现
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通信,则是异步方式进行收集链路调用信息,虽有一定的延时,但是总体性能较高。
用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的地址。
- 点赞
- 收藏
- 关注作者
评论(0)