zipkin——分布式性能追踪日志系统
Posted 落叶飞翔的蜗牛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了zipkin——分布式性能追踪日志系统相关的知识,希望对你有一定的参考价值。
zipkin架构图
包含组件
collector 收集器
storage 存储
api 查询
webUI 界面
ZipKin数据模型
Trace:一组代表一次用户请求所包含的spans,其中根span只有一个。
Span: 一组代表一次HTTP/RPC请求所包含的annotations。
annotation:包括一个值,时间戳,主机名(留痕迹)。
几个时间
cs:客户端发起请求,标志Span的开始
sr:服务端接收到请求,并开始处理内部事务,其中sr - cs则为网络延迟和时钟抖动
ss:服务端处理完请求,返回响应内容,其中ss - sr则为服务端处理请求耗时
cr:客户端接收到服务端响应内容,标志着Span的结束,其中cr - ss则为网络延迟和时钟抖动
启动zipkin
java -jar zipkin-server-2.10.1-exec.jar
Demo
service1
对外服务
@RestController
@Api("service的API接口")
@RequestMapping("/service1")
public class ZipkinController {
@Autowired
private CloseableHttpClient httpClient;
@ApiOperation("trace第一步")
@GetMapping("/test")
public String service() throws Exception {
HttpGet get = new HttpGet("http://localhost:8082/service2/test");
CloseableHttpResponse response = httpClient.execute(get);
return EntityUtils.toString(response.getEntity(), "utf-8");
}
}
配置zipkin组件
@Configuration
public class ZipkinConfig {
/**
* span信息收集器
* @return
*/
@Bean
public SpanCollector spanCollector(){
HttpSpanCollector.Config config = HttpSpanCollector.Config.builder()
//默认false,span在transport之前是否会被gzipped
.compressionEnabled(false)
.connectTimeout(5000)
.flushInterval(1)
.readTimeout(6000)
.build();
return HttpSpanCollector.create("http://localhost:9411", config, new EmptySpanCollectorMetricsHandler());
}
/**
* 作为各调用链路,只需要负责将指定格式的数据发送给zipkin
* @param spanCollector
* @return
*/
@Bean
public Brave brave(SpanCollector spanCollector){
//指定serviceName
Brave.Builder builder = new Brave.Builder("service1");
builder.spanCollector(spanCollector);
//采集率
builder.traceSampler(Sampler.create(1));
return builder.build();
}
/**
* 设置client的(发起请求和获取到服务端返回信息的)拦截器
* @param brave
* @return
*/
@Bean
public BraveServletFilter braveServletFilter(Brave brave){
BraveServletFilter filter = new BraveServletFilter(brave.serverRequestInterceptor(), brave.serverResponseInterceptor(), new DefaultSpanNameProvider());
return filter;
}
/**
* httpClient客户端,需要clientRequestInterceptor,clientResponseInterceptor分别完成cs和cr操作
* @param brave
* @return
*/
@Bean
public CloseableHttpClient httpClient(Brave brave) {
CloseableHttpClient httpClient = HttpClients.custom()
.addInterceptorFirst(new BraveHttpRequestInterceptor(brave.clientRequestInterceptor(), new DefaultSpanNameProvider()))
.addInterceptorFirst(new BraveHttpResponseInterceptor(brave.clientResponseInterceptor()))
.build();
return httpClient;
}
设置服务名和端口
spring.application.name=service1
server.port=8081
maven依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.brave</groupId>
<artifactId>brave-core</artifactId>
<version>3.9.0</version>
</dependency>
<dependency>
<groupId>io.zipkin.brave</groupId>
<artifactId>brave-spancollector-http</artifactId>
<version>3.9.0</version>
</dependency>
<dependency>
<groupId>io.zipkin.brave</groupId>
<artifactId>brave-web-servlet-filter</artifactId>
<version>3.9.0</version>
</dependency>
<dependency>
<groupId>io.zipkin.brave</groupId>
<artifactId>brave-apache-http-interceptors</artifactId>
<version>3.9.0</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
service2、service3、service4同上。
zipkin控制台
能从zipkin上直观的看出服务调用依赖关系,以及调用链上每个服务所花费的时间。这样在进行异常跟踪以及服务优化的时候,能简单快速的定位到某个具体服务。
至此zipkin功能测试正常。
以上是关于zipkin——分布式性能追踪日志系统的主要内容,如果未能解决你的问题,请参考以下文章
Spring Cloud 整合分布式链路追踪系统Sleuth和ZipKin实战,分析系统瓶颈