Spring Cloud Zipkin 和 Sleuth 使用教程

教程分享 > Java教程 > Spring Cloud > 博文分享 (3045) 2024-08-07 11:05:39

演示项目源码下载:(访问密码:9987)
spring-cloud-zipkin.zip

Zipkin是非常有效的工具分布追踪在微服务生态系统。分布式跟踪通常是分布式事务中每个组件的延迟测量,其中调用多个微服务来为单个业务用例提供服务。假设在我们的应用程序中,我们必须为一个事务调用 4 个不同的服务/组件。在启用分布式跟踪的情况下,我们可以测量哪个组件花费了多少时间。

当涉及许多底层系统并且应用程序在任何特定情况下变慢时,这在调试期间非常有用。在这种情况下,我们首先需要确定哪个底层服务实际上很慢。一旦发现服务缓慢,我们就可以努力解决该问题。分布式跟踪有助于识别生态系统中的缓慢组件。
 

Zipkin

Zipkin 最初是在 Twitter 上开发的,基于谷歌论文的一个概念,该论文描述了谷歌内部构建的分布式应用程序调试器 – dapper。它管理这些数据的收集和查找。为了使用 Zipkin,应用程序被检测到向它报告计时数据。

如果您正在排查生态系统中的延迟问题或错误,您可以根据应用程序、跟踪长度、注释或时间戳对所有跟踪进行过滤或排序。通过分析这些跟踪,您可以确定哪些组件未按预期执行,并且可以修复它们。
它内部有 4 个模块——
  1. 收集器——一旦任何组件将跟踪数据发送到 Zipkin 收集器守护进程,它就会被 Zipkin 收集器验证、存储和索引以进行查找。
  2. 存储- 该模块在后端存储和索引查找数据。支持 Cassandra、ElasticSearch和MySQL。
  3. 搜索- 该模块提供了一个简单的 JSON API,用于查找和检索存储在后端的跟踪。此 API 的主要使用者是 Web UI。
  4. Web UI – 一个非常漂亮的 UI 界面,用于查看跟踪。

如何安装 Zipkin


可以在快速入门页面找到不同操作系统的详细安装步骤,包括Docker镜像。对于 Windows 安装,只需从maven 存储库下载最新的 Zipkin 服务器并使用以下命令运行可执行 jar文件。
java -jar zipkin-server-1.30.3-exec.jar
Zipkin 启动后,我们可以在http://localhost:9411/zipkin/看到 Web UI 。
上面的命令将使用默认配置启动 Zipkin 服务器。对于高级配置,我们可以配置许多其他内容,例如存储、收集器侦听器等。

在 spring boot 应用程序中安装 Zipkin,我们需要在 spring boot 项目中添加 Zipkin starter 依赖项。
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

Sleuth


Sleuth是 Spring Cloud 家族的一个工具。它用于生成trace idspan id并将这些信息添加到 headers 和 MDC 中的服务调用中,以便 Zipkin 和ELK等工具使用它来存储、索引和处理日志文件。由于它来自 spring cloud 家族,一旦添加到CLASSPATH,它会自动集成到常用的通信通道中,例如 –
  • 使用RestTemplate等发出的请求。
  • 通过Netflix Zuul微代理的请求
  • 在Spring MVC控制器接收到的 HTTP 标头
  • 通过消息传递技术(如 Apache Kafka 或 RabbitMQ 等)发出请求。
使用 Sleuth 非常简单。我们只需要在 spring boot 项目中添加它的启动 pom 即可。它将在其运行时将 Sleuth 添加到项目中。
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
到目前为止,我们已经将 Zipkin 和 Sleuth 集成到微服务中并运行了 Zipkin 服务器。让我们看看如何利用这个设置。
 

Zipkin 和 Sleuth 集成示例


对于这个演示,让我们创建 4 个基于 Spring Boot 的微服务。它们都将同时具有 Zipkin 和 Sleuth 启动器依赖项。在每个微服务中,我们将公开一个端点,并从第一个服务调用第二个服务,从第二个服务调用第三个,以此类推,使用 rest 模板。

正如我们已经提到的,Sleuth 自动与 rest 模板一起工作,因此它会将这个检测的服务调用信息发送到附加的 Zipkin 服务器。然后 Zipkin 将开始记录延迟计算以及其他一些统计数据,例如服务调用详细信息。

微服务相互调用
 

创建微服务

所有四个服务都将具有相同的配置,唯一的区别是端点更改的服务调用详细信息。让我们使用WebRest RepositoryZipkinSleuth依赖项创建 Spring 启动应用程序。

我将这些服务打包在一个父项目中,以便可以将这四个服务一起构建以节省时间。如果您愿意,您可以继续进行个人设置。我还添加了有用的 Windows 脚本,以便使用单个命令启动/停止所有服务。
这是一个示例 rest 控制器,它公开一个端点并使用 rest 模板调用一个下游服务。
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.sleuth.sampler.AlwaysSampler;
import org.springframework.context.annotation.Bean;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpMethod;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
 
@SpringBootApplication
public class ZipkinService1Application {
 
    public static void main(String[] args) {
        SpringApplication.run(ZipkinService1Application.class, args);
    }
}
 
@RestController
class ZipkinController{
     
    @Autowired
    RestTemplate restTemplate;
 
    @Bean
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
 
    @Bean
    public AlwaysSampler alwaysSampler() {
        return new AlwaysSampler();
    }
 
    private static final Logger LOG = Logger.getLogger(ZipkinController.class.getName());
     
    @GetMapping(value="/zipkin")
    public String zipkinService1() 
    {
        LOG.info("Inside zipkinService 1..");
         
         String response = (String) restTemplate.exchange("http://localhost:8082/zipkin2", 
                        HttpMethod.GET, null, new ParameterizedTypeReference<String>() {}).getBody();
        return "Hi...";
    }
}

应用程序配置


由于所有服务都将在一台机器上运行,所以我们需要在不同的端口上运行它们。同样为了在 Zipkin 中进行识别,我们需要给出正确的名称。所以application.properties在资源文件夹下的文件中配置应用程序名称和端口信息。
server.port = 8081
spring.application.name = zipkin-server1
同样,对于其他 3 个服务,我们将使用端口808280838084并且名称也将类似于zipkin-server2zipkin-server3zipkin-server4
此外,我们有意在最后一个服务中引入了延迟,以便我们可以在 Zipkin 中查看。
 

演示

使用mvn clean install微服务中的命令进行最后的 maven 构建,启动所有 4 个应用程序以及 zipkin 服务器。

要快速启动和停止,请使用 bat 文件Start-all.batStop-all.bat.

现在从浏览器测试第一个服务端点几次 – http://localhost:8081/zipkin。请注意,上述 4 项服务中的一项存在故意延迟。所以会有延迟是预期的最终响应,只是不要放弃。

API调用成功后,我们可以在zipkin UI http://localhost:9411/zipkin/看到延迟统计。在第一个下拉列表中选择第一个服务,然后单击Find Traces按钮。
zipkin主屏幕
您应该会看到这种类型的 UI,您可以在其中通过查看跟踪数据来进行性能分析。
查找用户监控界面
特定交易
统计信息

总结

在本教程中,我们学习了使用 Zipkin 来分析服务调用中的延迟。我们还了解了 Sleuth 如何帮助我们创建元数据并将其传递给 Zipkin。

演示项目源码下载:(访问密码:9987)
spring-cloud-zipkin.zip


相关文章
演示项目源码下载:(访问密码:9987)spring-cloud-zipkin.zipZipkin是非常有效的工具分布追踪在微服务生态系统
随着Spring Cloud 的越来越流行,国内很多公司也在开始使用该框架了
在spring cloud项目中配置配置服务的地址spring.cloud.config.uri不生效的解决办法,spring cloud
项目源码下载:(访问密码:9987)Spring-Cloud-Circuit-Breaker.zip学习在调用底层微服务的同时利用调用的Spring Cloud Netflix堆栈组件之一Hys...
环境说明spring cloud 2021.04 spring cloud alibaba 2021.0.4 spring boot 2.6.13 nacos 2.2.3 问题排查...
1. 什么是 spring cloud?spring cloud 是一系列框架的有序集合
环境说明 之前spring cloud 用的基于spring boot 2.2.x版本,sleuth版本同步为2.x 现在升级了spring cloud 版本,基于了spring b...
演示项目源码下载:(访问密码:9987)Spring-Cloud-discovery-server.zip 了解如何创建微服务的基础上,Spring Cloud,对Netflix的Eureka注...
演示项目源码下载:(访问密码:9987)spring-cloud-config-server-git.zip微服务方法现在已经成为任何新 API 开发的行业标准,几乎所有组织都在推广它
在这个 Spring cloud 教程中,学习在 spring boot/cloud 项目中使用 Netflix Ribbon 使用客户端负载平衡
演示项目源码下载:(访问密码:9987)Spring-Cloud-Consoul.zip了解如何创建微服务的基础上Spring cloud,对登记HashiCorp Consul注册服务器,以及...
Spring Cloud FeignClient fallbackFactory配置详解一般FeignClient需要指定一个fallbackFactory或者fallback,一个一个接口的实...
项目源码下载:(访问密码:9987)spring-cloud-apigateway_zuul.zip学习使用Netflix Zuul及其与Spring Cloud 的牢固结合来创建负载均衡器
错误信息 spring cloud 启动报错 No spring.config.import property has been defined 环境说明 spring ...
Java编程之Spring Cloud Hystrix Circuit熔断/断路