zipkin学习–03–Springboot 集成 Zipkin–通过io.zipkin.brave包
一、总体信息
二、搭建service8081
2.1、pom.xml依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>service8081</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>service8081</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<zipkin.version>3.9.0</zipkin.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
</dependency>
<!-- zipkin相关 -->
<dependency>
<groupId>io.zipkin.brave</groupId>
<artifactId>brave-core</artifactId>
<version>${zipkin.version}</version>
</dependency>
<dependency>
<groupId>io.zipkin.brave</groupId>
<artifactId>brave-spancollector-http</artifactId>
<version>${zipkin.version}</version>
</dependency>
<dependency>
<groupId>io.zipkin.brave</groupId>
<artifactId>brave-web-servlet-filter</artifactId>
<version>${zipkin.version}</version>
</dependency>
<dependency>
<groupId>io.zipkin.brave</groupId>
<artifactId>brave-apache-http-interceptors</artifactId>
<version>${zipkin.version}</version>
</dependency>
<dependency>
<groupId>io.zipkin.brave</groupId>
<artifactId>brave-okhttp</artifactId>
<version>${zipkin.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.2、application.properties
# 发给zipkin的服务器名称
zipkin.serviceName=service8081
# zipkin的url地址
zipkin.url=http://localhost:9411
# 连接超时时间
zipkin.connectTimeout=6000
# 读取超时时间
zipkin.readTimeout=6000
# 上传 span 的间隔时间
zipkin.flushInterval=1
# 是否启动压缩
zipkin.compressionEnabled=true
# 采样率,默认为0.1,值越大收集越及时,但性能影响也越大
zipkin.samplerRate=1
server.port=8081
server.servlet.context-path=/
spring.application.name=service8081
2.3、Span收集器配置
package com.example.service8081.business.config;
import com.github.kristofa.brave.Brave;
import com.github.kristofa.brave.Brave.Builder;
import com.github.kristofa.brave.EmptySpanCollectorMetricsHandler;
import com.github.kristofa.brave.Sampler;
import com.github.kristofa.brave.SpanCollector;
import com.github.kristofa.brave.http.DefaultSpanNameProvider;
import com.github.kristofa.brave.http.HttpSpanCollector;
import com.github.kristofa.brave.http.HttpSpanCollector.Config;
import com.github.kristofa.brave.okhttp.BraveOkHttpRequestResponseInterceptor;
import com.github.kristofa.brave.servlet.BraveServletFilter;
import okhttp3.OkHttpClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
*
* 配置Span收集器 设置收集器的详细参数,包含超时时间、上传span间隔、以及配置采集率等,进而对收集器进行初始化。
*
*/
@Configuration
public class SpanCollectorConfig {
// zipkin的url地址
@Value("${zipkin.url}")
private String url;
// 发给zipkin的服务器名称
@Value("${zipkin.serviceName}")
private String serviceName;
// 连接超时时间
@Value("${zipkin.connectTimeout}")
private int connecTimeout;
// 是否启动压缩
@Value("${zipkin.compressionEnabled}")
private boolean compressionEnabled;
// 上传 span 的间隔时间
@Value("${zipkin.flushInterval}")
private int flushInterval;
// 读取超时时间
@Value("${zipkin.readTimeout}")
private int readTimeout;
// 采样率,默认为0.1,值越大收集越及时,但性能影响也越大
@Value("${zipkin.samplerRate}")
private float samplerRate;
/**
* 配置 span 收集器
*
* @return
*/
@Bean
public SpanCollector spanCollector() {
Config config = Config.builder()
//连接超时时间
.connectTimeout(connecTimeout)
//是否启动压缩
.compressionEnabled(compressionEnabled)
//上传 span 的间隔时间
.flushInterval(flushInterval)
//读取超时时间
.readTimeout(readTimeout).build();
//url:zipkin的url地址
return HttpSpanCollector.create(url, config, new EmptySpanCollectorMetricsHandler());
}
/**
* 配置采集率
* 作为各调用链路,只需要负责将指定格式的数据发送给zipkin
* @param spanCollector
* @return
*/
@Bean
public Brave brave(SpanCollector spanCollector) {
//被采集的服务名称
Builder builder = new Builder(serviceName);
//采集器
builder.spanCollector(spanCollector)
//采样率,默认为0.1,值越大收集越及时,但性能影响也越大
.traceSampler(Sampler.create(samplerRate)).build();
return builder.build();
}
/**
* @Description: 设置server的(服务端收到请求和服务端完成处理,并将结果发送给客户端)过滤器
* @Param:
* @return: 过滤器
*/
@Bean
public BraveServletFilter braveServletFilter(Brave brave) {
BraveServletFilter filter = new BraveServletFilter(brave.serverRequestInterceptor(),
brave.serverResponseInterceptor(), new DefaultSpanNameProvider());
return filter;
}
/**
* @Description: 设置client的 rs(表示服务端收到请求)和cs(表示客户端发起请求)的拦截器
* @Param:
* @return: OkHttpClient 返回请求实例
*/
@Bean
public OkHttpClient okHttpClient(Brave brave) {
OkHttpClient httpClient = new OkHttpClient.Builder()
.addInterceptor(new BraveOkHttpRequestResponseInterceptor(brave.clientRequestInterceptor(),
brave.clientResponseInterceptor(), new DefaultSpanNameProvider()))
.build();
return httpClient;
}
}
2.4、HelloController
package com.example.service8081.business.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
/**
* 描述该类
*
* @class: HelloController
* @see
*/
@RestController
@RequestMapping("zipkin")
public class HelloController {
public static final String url = "http://localhost:8082/zipkin/service2";
@Autowired
OkHttpClient client;
@GetMapping("/service1")
public String service() throws IOException {
System.out.println("-----调用service1-----");
Request request = new Request.Builder().url(url).build();
Response response = client.newCall(request).execute();
return "service1," + response.body().string();
}
}
三、 service8082到service8085的配置:
3.1、application.properties 修改
zipkin.serviceName= 改为自己的服务名称
server.port=改为自己的端口
spring.application.name=改为自己的服务名称
3.2、HelloController 修改
3.2.1、service8081
@RestController
@RequestMapping("zipkin")
public class HelloController {
public static final String url = "http://localhost:8082/zipkin/service2";
@Autowired
OkHttpClient client;
@GetMapping("/service1")
public String service() throws IOException {
System.out.println("-----调用service1-----");
Request request = new Request.Builder().url(url).build();
Response response = client.newCall(request).execute();
return "service1," + response.body().string();
}
}
3.2.2、service8082
@RestController
@RequestMapping("zipkin")
public class HelloController {
public static final String url = "http://localhost:8083/zipkin/service3";
public static final String url2 = "http://localhost:8084/zipkin/service4";
@Autowired
OkHttpClient client;
@GetMapping("/service2")
public String service() throws Exception {
System.out.println("-----调用service2-----");
Request request1 = new Request.Builder().url(url).build();
Request request2 = new Request.Builder().url(url2).build();
Response response1 = client.newCall(request1).execute();
Response response2 = client.newCall(request2).execute();
return "service2【来自service3的信息:" + response1.body().string() +
",来自service4的信息:"+ response2.body().string() + "】";
}
}
3.2.3、service8083
@RestController
@RequestMapping("zipkin")
public class HelloController {
public static final String url = "http://localhost:8084/zipkin/service4";
@Autowired
OkHttpClient client;
@GetMapping("/service3")
public String service() throws Exception {
System.out.println("-----调用service3-----");
Request request = new Request.Builder().url(url).build();
Response response = client.newCall(request).execute();
return "service3," + response.body().string();
}
}
3.2.4、service8084
@RestController
@RequestMapping("zipkin")
public class HelloController {
public static final String url = "http://localhost:8086/zipkin/service5";
@Autowired
OkHttpClient client;
@GetMapping("/service4")
public String service() throws Exception {
System.out.println("-----调用service4-----");
Request request = new Request.Builder().url(url).build();
Response response = client.newCall(request).execute();
return "service4," + response.body().string();
}
}
3.2.5、service8086
@RestController
@RequestMapping("zipkin")
public class HelloController {
@GetMapping("/service5")
public String service() throws Exception {
System.out.println("-----调用service5-----");
return "service5";
}
}
四、测试和分析
http://127.0.0.1:8081/zipkin/service1
http://localhost:9411
4.1、发送请求
4.2、分析
spans分析
参数说明
调用测试
json样例数据
[
{
"traceId": "2ce03196265e9729",
"parentId": "ce0b83f6e721e97d",
"id": "f470b5a720074acd",
"kind": "CLIENT",
"name": "get",
"timestamp": 1630251666804000,
"duration": 1701000,
"localEndpoint": {
"serviceName": "service8082",
"ipv4": "192.168.207.1"
},
"tags": {
"http.url": "http://localhost:8083/zipkin/service3"
}
},
{
"traceId": "2ce03196265e9729",
"parentId": "074e4cb45a59a76c",
"id": "96fde753cf354c3e",
"kind": "CLIENT",
"name": "get",
"timestamp": 1630251667658000,
"duration": 747000,
"localEndpoint": {
"serviceName": "service8084",
"ipv4": "192.168.207.1"
},
"tags": {
"http.url": "http://localhost:8086/zipkin/service5"
}
},
{
"traceId": "2ce03196265e9729",
"parentId": "f470b5a720074acd",
"id": "074e4cb45a59a76c",
"kind": "SERVER",
"name": "get",
"timestamp": 1630251667451000,
"duration": 988000,
"localEndpoint": {
"serviceName": "service8084",
"ipv4": "192.168.207.1"
},
"tags": {
"http.status_code": "200",
"http.url": "/zipkin/service4"
}
},
{
"traceId": "2ce03196265e9729",
"parentId": "074e4cb45a59a76c",
"id": "96fde753cf354c3e",
"kind": "SERVER",
"name": "get",
"timestamp": 1630251668029000,
"duration": 374000,
"localEndpoint": {
"serviceName": "service8086",
"ipv4": "192.168.207.1"
},
"tags": {
"http.status_code": "200",
"http.url": "/zipkin/service5"
}
},
{
"traceId": "2ce03196265e9729",
"parentId": "3e2b6810b608afc7",
"id": "8803d668b0b3d243",
"kind": "SERVER",
"name": "get",
"timestamp": 1630251668847000,
"duration": 3000,
"localEndpoint": {
"serviceName": "service8086",
"ipv4": "192.168.207.1"
},
"tags": {
"http.status_code": "200",
"http.url": "/zipkin/service5"
}
},
{
"traceId": "2ce03196265e9729",
"parentId": "f470b5a720074acd",
"id": "074e4cb45a59a76c",
"kind": "CLIENT",
"name": "get",
"timestamp": 1630251667196000,
"duration": 1247000,
"localEndpoint": {
"serviceName": "service8083",
"ipv4": "192.168.207.1"
},
"tags": {
"http.url": "http://localhost:8084/zipkin/service4"
}
},
{
"traceId": "2ce03196265e9729",
"parentId": "ce0b83f6e721e97d",
"id": "f470b5a720074acd",
"kind": "SERVER",
"name": "get",
"timestamp": 1630251667042000,
"duration": 1459000,
"localEndpoint": {
"serviceName": "service8083",
"ipv4": "192.168.207.1"
},
"tags": {
"http.status_code": "200",
"http.url": "/zipkin/service3"
}
},
{
"traceId": "2ce03196265e9729",
"parentId": "2ce03196265e9729",
"id": "ce0b83f6e721e97d",
"kind": "CLIENT",
"name": "get",
"timestamp": 1630251666391000,
"duration": 2511000,
"localEndpoint": {
"serviceName": "service8081",
"ipv4": "192.168.207.1"
},
"tags": {
"http.url": "http://localhost:8082/zipkin/service2"
}
},
{
"traceId": "2ce03196265e9729",
"id": "2ce03196265e9729",
"kind": "SERVER",
"name": "get",
"timestamp": 1630251666347000,
"duration": 2562000,
"localEndpoint": {
"serviceName": "service8081",
"ipv4": "192.168.207.1"
},
"tags": {
"http.status_code": "200",
"http.url": "/zipkin/service1"
}
},
{
"traceId": "2ce03196265e9729",
"parentId": "ce0b83f6e721e97d",
"id": "3e2b6810b608afc7",
"kind": "CLIENT",
"name": "get",
"timestamp": 1630251668505000,
"duration": 347000,
"localEndpoint": {
"serviceName": "service8082",
"ipv4": "192.168.207.1"
},
"tags": {
"http.url": "http://localhost:8084/zipkin/service4"
}
},
{
"traceId": "2ce03196265e9729",
"parentId": "2ce03196265e9729",
"id": "ce0b83f6e721e97d",
"kind": "SERVER",
"name": "get",
"timestamp": 1630251666651000,
"duration": 2243000,
"localEndpoint": {
"serviceName": "service8082",
"ipv4": "192.168.207.1"
},
"tags": {
"http.status_code": "200",
"http.url": "/zipkin/service2"
}
},
{
"traceId": "2ce03196265e9729",
"parentId": "3e2b6810b608afc7",
"id": "8803d668b0b3d243",
"kind": "CLIENT",
"name": "get",
"timestamp": 1630251668511000,
"duration": 339000,
"localEndpoint": {
"serviceName": "service8084",
"ipv4": "192.168.207.1"
},
"tags": {
"http.url": "http://localhost:8086/zipkin/service5"
}
},
{
"traceId": "2ce03196265e9729",
"parentId": "ce0b83f6e721e97d",
"id": "3e2b6810b608afc7",
"kind": "SERVER",
"name": "get",
"timestamp": 1630251668510000,
"duration": 342000,
"localEndpoint": {
"serviceName": "service8084",
"ipv4": "192.168.207.1"
},
"tags": {
"http.status_code": "200",
"http.url": "/zipkin/service4"
}
}
]