首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >zipkin——分布式性能追踪日志系统

zipkin——分布式性能追踪日志系统

作者头像
黑洞代码
发布2021-01-14 16:30:41
发布2021-01-14 16:30:41
76200
代码可运行
举报
运行总次数:0
代码可运行

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

对外服务

代码语言:javascript
代码运行次数:0
运行
复制
@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组件

代码语言:javascript
代码运行次数:0
运行
复制
@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;
    }

设置服务名和端口

代码语言:javascript
代码运行次数:0
运行
复制
spring.application.name=service1
server.port=8081

maven依赖

代码语言:javascript
代码运行次数:0
运行
复制
<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功能测试正常。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-07-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 落叶飞翔的蜗牛 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档