你好,这里是专栏“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的服务追踪。
Zipkin 提供了一个可视化的服务追踪查看界面,以收集、存储和展示跨多个服务的请求链路数据。
以下是Zipkin的一些主要特点和功能:
docker run -d -p 9411:9411 openzipkin/zipkin
java -jar zipkin.jar
http://127.0.0.1:9411/
,输入地址访问即可。serviceName=banana-client5-tracing
可以查询对应服务的服务追踪记录。io.micrometer
相关的包和 zipkin
相关的包。<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>
<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
集成了相关的自动配置。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
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);
}
}
http://localhost:10115/app/swagger-ui.html
,输入账号密码 yulin/123yl. 就可以访问到最新的接口文档,验证服务追踪是否开启成功。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;
}
}
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/
查看访问记录:输出文档如下:
[
{
"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的探索与实践,持续迭代中。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。