你好,这里是专栏"SpringCloud2023实战"。
跟踪问题并非新事物。应用程序开发人员长期以来一直在创造追踪其应用程序状态的方法。在大部分时间里,开发人员不得不自己创建必要的追踪框架。
2016年,Spring Cloud团队创建了一个追踪库,可以帮助许多开发人员。它被称为Spring Cloud Sleuth。Spring团队意识到追踪可以从Spring Cloud中分离出来,并创建了Micrometer Tracing项目,这实质上是Spring Cloud Sleuth的与Spring无关的副本。Micrometer Tracing在2022年11月发布了1.0.0 GA版本,自那以后一直在稳步改进。Micrometer Tracing为最流行的跟踪器库提供了一个简单的门面,让可以在不受供应商限制的情况下为基于JVM的应用程序代码进行仪表化。它旨在几乎不增加跟踪收集活动的开销,同时最大限度地提高跟踪工作的可移植性。Micrometer Tracing 在SpringBoot中充当了类似日志领域内 slf4j 门面的角色。
也就是说Sleuth将会停止维护,Sleuth最新版本也只支持springboot2。作为替代可以使用Micrometer Tracing在微服务中作为服务追踪的工具。
下文将基于Micrometer Tracing门面和zipkin追踪实现来说明springcloud2023的服务追踪。
Micrometer Tracing集成之Zipkin控制台(Dashboard)
Zipkin 提供了一个可视化的服务追踪查看界面,以收集、存储和展示跨多个服务的请求链路数据。
以下是Zipkin的一些主要特点和功能:
- 分布式追踪:Zipkin可以跟踪多个微服务之间的请求和响应,并将它们组合成一个完整的请求链路。通过追踪每个请求经过的服务和调用时间,可以了解到请求在系统中的流向和性能瓶颈。
- 可视化界面:Zipkin提供了一个直观的可视化界面,用于展示请求链路和相关的统计信息。可以通过该界面查看请求的执行时间、调用关系和依赖服务的性能指标。
- 故障排查:当系统中某个服务出现故障或延迟时,Zipkin可以帮助快速定位问题的根本原因。通过分析请求链路数据,可以识别负责引起问题的服务,并深入了解其性能状况。
- 集成支持:Zipkin可以与多种编程语言和框架集成,包括Java、Python、Ruby等。它提供了一些客户端库和插件,用于在应用程序中记录和发送跟踪数据到Zipkin服务。
- 可扩展性:Zipkin支持水平扩展,可以根据需要增加更多的收集器、存储节点和查询节点,以处理大规模的请求链路数据。
Zipkin安装
- zipkin提供了一个docker镜像,使用如下命令可以快速启动。
shell
docker run -d -p 9411:9411 openzipkin/zipkin
- 通过java运行控制台。从zipkin release 页面下载最新版本的控制台 jar 包。
- 启动控制台。zipkin控制台是一个标准的 Spring Boot 应用,以 Spring Boot 的方式运行 jar 包即可。
shell
java -jar zipkin.jar
访问zipkin
- 默认的端口是
http://127.0.0.1:9411/
,输入地址访问即可。 - 通过
serviceName=banana-client5-tracing
可以查询对应服务的服务追踪记录。
Micrometer Tracing集成之客户端
引入pom.xml
-
引入Micrometer Tracing主要是引入
io.micrometer
相关的包和zipkin
相关的包。 -
引入micrometer的版本控制包。
xml
<properties>
<micrometer-tracing.version>1.1.6</micrometer-tracing.version>
</properties>
<!--导入micrometer-tracing的bom-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing-bom</artifactId>
<version>${micrometer-tracing.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
- 引入相关的服务依赖lib。
xml
<dependencies>
<!-- 微服务追踪门面 -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing</artifactId>
</dependency>
<!-- 微服务追踪-实现由于Micrometer Tracing是一个门面工具自身并没有实现完整的链路追踪系统,具体的链路追踪另外需要引入的是第三方链路追踪系统的依赖,下面就以Zipkin 链路追踪系统为例:-->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing-bridge-brave</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.reporter2</groupId>
<artifactId>zipkin-reporter-brave</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.reporter2</groupId>
<artifactId>zipkin-sender-urlconnection</artifactId>
</dependency>
</dependencies>
修改配置
- 新增配置文件
application.yml
,配置主要是management
下面的配置,这个配置主要是因为spring-boot-starter-actuator
集成了相关的自动配置。
yaml
spring.application.name: banana-client5-tracing
spring:
cloud:
zookeeper:
connect-string: localhost:2181
server:
port: 10115
servlet:
context-path: /app
## 设置zipkin和brave配置和tracing的日志信息
logging.pattern.level: "%5p [${spring.application.name:},%X{traceId:-},%X{spanId:-}]"
management:
zipkin:
tracing:
endpoint: http://localhost:9411/api/v2/spans
tracing:
sampling:
# 采样率的概率,100%采样
probability: 1.0
修改启动类
- 启动类不需要特殊修改。
java
package io.rainforest.banana.client1;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
接口demo
- 通过访问
http://localhost:10115/app/swagger-ui.html
,输入账号密码 yulin/123yl. 就可以访问到最新的接口文档,验证服务追踪是否开启成功。
java
package io.rainforest.banana.app.web.demo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
@RestController
@Slf4j
public class HelloWorld {
@GetMapping("/")
public String hello(String hello){
log.info("this is a test");
return hello+" world";
}
@GetMapping("/hello2")
@ResponseBody
public List<String> hello2(String hello){
List<String> res = new ArrayList<>();
res.add("test1");
res.add("test2");
res.add(hello);
return res;
}
}
- 访问日志说明:
shell
2023-11-14T15:19:55.801+08:00 INFO [banana-client5-tracing,65531f9bcb2bd1d503084d7cfb690fc1,03084d7cfb690fc1] 31496 --- [ XNIO-1 task-4] i.r.banana.app.web.demo.HelloWorld : this is a test
## [banana-client5-tracing,65531f9bcb2bd1d503084d7cfb690fc1,03084d7cfb690fc1] 其中第一个为应用名称,第二个为traceId,第三个参数为spanId。
- 在控制面板
http://127.0.0.1:9411/zipkin/
查看访问记录:
输出文档如下:
json
[
{
"traceId": "655317933197d6e7680e579112306826",
"id": "680e579112306826",
"kind": "SERVER",
"name": "http get /",
"timestamp": 1699944339735395,
"duration": 62339,
"localEndpoint": {
"serviceName": "banana-client5-tracing",
"ipv4": "192.168.31.173"
},
"tags": {
"exception": "none",
"http.url": "/app/",
"method": "GET",
"outcome": "SUCCESS",
"status": "200",
"uri": "/"
}
}
]
关于作者
来自全栈程序员nine的探索与实践,持续迭代中。