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

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

相关推荐
未来的JAVA高级开发工程师9 小时前
网关登录校验
java·微服务
ChinaRainbowSea1 天前
4. Spring Cloud Ribbon 实现“负载均衡”的详细配置说明
java·spring boot·后端·spring·spring cloud·ribbon·负载均衡
杨荧1 天前
【JAVA毕业设计】基于Vue和SpringBoot的宠物咖啡馆平台
java·开发语言·jvm·vue.js·spring boot·spring cloud·开源
抱走江江2 天前
SpringCloud框架学习(第二部分:Consul、LoadBalancer和openFeign)
学习·spring·spring cloud
不会编程的懒洋洋2 天前
Spring Cloud Eureka 服务注册与发现
java·笔记·后端·学习·spring·spring cloud·eureka
RainbowSea2 天前
3. Spring Cloud Eureka 服务注册与发现(超详细说明及使用)
java·后端·spring cloud
RainbowSea2 天前
4. Spring Cloud Ribbon 实现“负载均衡”的详细配置说明
java·spring·spring cloud
荆州克莱2 天前
Big Data for AI实践:面向AI大模型开发和应用的大规模数据处理套件
spring boot·spring·spring cloud·css3·技术
Smile丶凉轩2 天前
微服务即时通讯系统的实现(客户端)----(1)
微服务·云原生·架构
r0ad2 天前
SpringCloud2023实战之接口服务测试工具SpringBootTest
spring boot·后端·spring cloud