首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

分布式集群环境下调用链路追踪(3)Java 下 Trace 介绍以及实践

分布式集群环境下调用链路追踪(3)Java 下 Trace 介绍以及实践

Java 下 Trace 介绍以及实践工具介绍分布式追踪系统一般主要由两方面构成:即基于 Annotation 的标注和追踪系统框架。对应 Java 中主要有下面两个工具:
  • Brave:用来装备 Java 程序的类库,提供了面向 Standard Servlet、Spring MVC、HTTP Client、JAX          RS、Jersey、Resteasy 和 MySQL 等接口的装备能力,可以通过编写简单的配置和代码,让基于这些框架构建的应用可以向 Zipkin 报告数据。同时 Brave          也提供了非常简单且标准化的接口,在以上封装无法满足要求的时候可以方便扩展与定制。
  • Zipkin:是一款开源的分布式实时数据追踪系统(Distributed Tracking System),基于 Google Dapper 的论文设计而来,由 Twitter          公司开发贡献。其主要功能是聚集来自各个异构系统的实时监控数据,用来追踪微服务架构下的系统延时问题。
两种工具在追踪系统中的用途如下:
图 5. 分布式追踪系统图
由上图可见,一次请求过程中,请求先通过 HTTP 到达前端,然后通过 HTTP 调用后台系统,同时后台系统通过 RPC 调用 Greeting 模块,每一个 Span 对应的        Annotation 信息都会实时的回传至 Zipkin Server,通过这样的链路可以准确的分析出网络、系统性能等问题。
工具选择鉴于目前微服务框架大多都选择 Spring Cloud 来实现,本文主要使用 Spring Cloud Sleuth 和 Zipkin 来进行介绍:
  • Sleuth:是 Spring Cloud 在分布式系统中提供链路追踪解决方案。
  • Zipkin:是一套基于 Google Dapper 的分布式链路调用的监控系统。
搭建 Zipkin Server
  • 新建一个基于 Spring Boot 的 Gradle 项目,项目名称为:zipkin-server。
  • 项目 build.gradle 配置如下: 清单 1. zipkin-server Gradle              脚本
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    repositories {
    }

    dependencies {
        compile('org.springframework.boot:spring-boot-starter')
        compile('org.springframework.boot:spring-boot-starter-jdbc')
        compile('io.zipkin.java:zipkin-server')
        runtime('io.zipkin.java:zipkin-autoconfigure-ui')
        compile('io.zipkin.java:zipkin-autoconfigure-storage-mysql')
        compile('mysql:mysql-connector-java')
    }




  • 项目 application.yml 配置如下: 清单 2. application.yml            配置
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    server:
      port: 9411

    docs:
      service:
        name: docs-zipkin

    # Spring Profiles
    spring:
      application:
        name: docs-zipkin-server
      # Http Encoding
      http:
        encoding.charset: UTF-8
        encoding.enable: true
        encoding.force: true
      datasource:
        schema: classpath:/mysql.sql
        url: jdbc:mysql://127.0.0.1:3306/zipkin
        username: root
        password: password
        # Switch this on to create the schema on startup:
        initialize: true
        continueOnError: true
         
    zipkin:
      storage:
        type: mysql
         
    spring.profiles.active: dev




  • Spring Boot 启动类参照项目代码: 。
  • zipkin-server 配置完成,将其启动之后,访问 http://localhost:9411 将看到如下 Zipkin 管理界面:
图 6. Zipkin 管理界面图
创建        demoe-web 工程
  • 新建一个基于 Spring Boot Web 的 Gradle 项目,项目名称为:demo-web。
  • 项目 build.gradle 配置如下: 清单 3. demo-web Gradle            脚本
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    repositories {
    }

    dependencies {
        compile project(':demo-model')
        compile project(':demo-util')

        compile('org.springframework.boot:spring-boot-starter-web')
        compile('org.springframework.cloud:spring-cloud-starter-sleuth')
        compile('org.springframework.cloud:spring-cloud-sleuth-zipkin')
    }




  • 项目 application.yml 配置如下,由于是 demo 环境,所以采样率设置为 100%。 清单 4. application.yml            配置
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    spring:
      application:
        name: demo-web
      profiles:
        active: dev
      sleuth:
        sampler:
          percentage: 1
      #   Percentage of logs export to zipkin server
      zipkin:
        # For enabling Zipkin Client for this Microservice
        enabled: true
        # Server Url
        baseUrl: http://localhost:9411

    # Server Information
    server:
      port: 8080




  • Spring Boot 启动类如清单 5 中所示,通过配置            HttpResponseInjectingTraceFilter、CustomHttpServletResponseSpanInjector            类(具体参考 ),将 Trace ID 和 Web 模块的 Span ID 保存在 header 中返回给用户端,通过这种方式也可以显示在 Web 界面。            清单 5. demo-web            启动类
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    @SpringBootApplication(scanBasePackages = { "com.ibm.demo" })
    public class DemoWebApplication {

           public static void main(String[] args) {
                   SpringApplication.run(DemoWebApplication.class, args);
           }

           @Bean
           public RestTemplate restTemplate() {
                  return new RestTemplate();
           }

           @Bean
           public SpanInjector<HttpServletResponse>
    customHttpServletResponseSpanInjector() {
                   return new CustomHttpServletResponseSpanInjector();
           }

           @Bean
           public HttpResponseInjectingTraceFilter responseInjectingTraceFilter(Tracer
    tracer) {
                   return new HttpResponseInjectingTraceFilter(tracer,
    customHttpServletResponseSpanInjector());
           }
         
        @Bean
        public Sampler defaultSampler() {
             return new AlwaysSampler();
        }

    }




  • Web Controller 类中包含以下 4 个接口:
  • /demo/web/:demo-web 直接返回。
  • /demo/web/call:demo-web 通过 HTTP 调用 demo-service 接口。
  • /demo/web/callkafka:demo-web 通过 Kafka 发消息给 demo-service。
  • /demo/web/callredis:demo-web 通过 Redis 发消息给 demo-service。
返回列表