基于MicrometerTracing门面和Zipkin实现集成springcloud2023的服务追踪

2024-10-10 15:23:53 浏览数 (4)

你好,这里是专栏“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的探索与实践,持续迭代中。

1 人点赞