分布式系统如果服务数量很多的情况下,对微服务的监控和日志查询将会是一件很困难的事情。那么springcloud提供了一个分布式的服务跟踪组件:
<!--服务跟踪组件-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
微服务在启动就回输入如下的跟踪日志:
Handling span [Trace: aa7237dd9a5ce651, Span: aa7237dd9a5ce651, Parent: null, exportable:true]
第一个:traceId表明当前请求链路的唯一识别id
第二个:spanId表明当前链路每一次请求包含一个开始spanid,一个结束spanId
spring:
application:
name: microservice-provider-user
# zipkin:
#指定zipkin客户端链接zipkin服务器的地址
# base-url: http://localhost:9411
#日志收集的比例100%
sleuth:
sampler:
percentage: 1.0
sample接口提供一个
public interface Sampler {
/**
* @return true if the span is not null and should be exported to the tracing system
*/
boolean isSampled(Span span);
}
接口是否对日志进行输出到第三方的如:ELK 日志分析组件
二:
sleuth整合LogStash.
logStash可以对日志的输入、过滤、输出。springboot默认采用logback作为日志分析。而logstash已经实现了logback的支持。所以只需要在logback-spring.xml添加对logstash对应的appender即可实现以json的格式对日志进行收集,需要添加以下依赖:
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>4.11</version>
</dependency>
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<providers>
<pattern>
<pattern>
{
"service" : "${springAppName:-}",
"trace" : "%X{X-B3-TraceId:-}",
"span" : "%X{X-B3-SpanId:-}"
}
</pattern>
</pattern>
</providers>
</encoder>
整合zipkin
ELK在日志收集对日志内容分析方面有着很好的解决办法,但是微服务在调用过程中。A----B---D---C---E
没一次调用的性能和时间则无法通过日志获取到。那么就无法对微服务进行性能优化。所以zipkin是对微服务
链路跟踪的可以查询某一个时间段请求的各个链路的请求时间。
配置如下:
1:搭建zipkin-server服务器,引入以下依赖
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
</dependency>
2:启动类添加注解如下:
@EnableZipkinServer
3:默认端口:9411
4:为zipkin客户端添加以下依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-sleuth-zipkin</artifactId> </dependency>
5:指定客户端链接的服务端的url:
spring: zipkin: #指定zipkin客户端链接zipkin服务器的地址 base-url: http://localhost:9411
测试访问:http://localhost:9411即可打开客户端查询时间段内的请求性能指标信息
这样有一个问题。就是有多少个客户端。每个客户端都要配置zipkinserver的地址信息。这样对维护产生不便。所以
就可以使用异步的方式消息中间件对日志进行收集,可以很容易将信息输出到消息中间件中。同时zipkin服务端从
消息中间件上异步的消费这些跟踪信息。
接一下通过对原有服务进行改造,实现通过消息中间件收集日志并进行跟踪信息。
1:修改客户端添加如下依赖
第一个依赖:sleuth对zipkin的扩展
第二个依赖:集成消息中间件rabbitmq
2:配置文件中就可以删除在配置zipkin-server的url配置信息,并添加mq的相关配置
3:修改zipkin-server的依赖如下:增加如下配置
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin-stream</artifactId>
</dependency>
4:测试如下: