演示项目源码下载:(访问密码: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

评论区域

评论功能已关闭. 提示:评论功能虽已关闭,关闭之前的评论仍然会展示。