分布式集群环境下调用链路追踪(3)Java 下 Trace 介绍以及实践
- UID
- 1066743
|
分布式集群环境下调用链路追踪(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。
|
|
|
|
|
|