关键词文章采集源码(Spring陈某介绍一下CloudSleuth和zipkin这两个组件为主,后续文章介绍)

优采云 发布时间: 2022-02-04 17:15

  关键词文章采集源码(Spring陈某介绍一下CloudSleuth和zipkin这两个组件为主,后续文章介绍)

  今天的文章文章陈介绍链接跟踪相关的知识,主要是Spring Cloud Sleuth和zipkin这两个组件,后续文章再介绍一个。

  文章的目录如下:

  

  为什么需要链接跟踪?

  在大型分布式微服务系统中,一个系统被划分为N个多个模块,负责不同的功能,组合成一套系统,最终可以提供丰富的功能。在这种分布式架构中,一个请求往往需要涉及多个服务,如下图所示:

  

  服务之间的调用复杂,维护成本成倍增加。难免会出现以下问题:

  为了快速定位分布式架构中的问题,分布式链路追踪应运而生。将分布式请求还原到调用链接,执行日志记录、性能监控,并集中显示分布式请求的调用。比如每个服务节点花费的时间,请求到达哪台机器,每个服务节点的请求状态等等。

  常见的链接跟踪技术有哪些?

  市面上有很多链接跟踪项目,其中也有一些非常优秀的,如下:

  什么是 Spring Cloud Sleuth?

  Spring Cloud Sleuth 实现了分布式服务链接跟踪解决方案。通过使用 Sleuth,我们可以快速定位服务的问题。简单来说,Sleuth 相当于调用链监控工具的客户端,与各个微服务集成在一起,负责生成调用链监控数据。

  "

  Spring Cloud Sleuth 只负责生成监控数据,通过日志展示,不提供可视化的 UI 界面。

  "

  在学习 Sleuth 之前,有几个概念是必须要了解的:

  Spring Cloud 是如何集成 Sleuth 的?

  集成 Spring Cloud Sleuth 其实并不难。在此之前,您需要准备以下三项服务:

  三个服务的调用关系如下:

  

  客户端请求网关发起订单查询请求,网关路由到订单服务,订单服务获取订单明细,调用商品服务获取商品明细。

  添加依赖项

  在父模块中添加sleuth依赖如下:

  

org.springframework.cloud

spring-cloud-starter-sleuth

  以上只是Spring Cloud Sleuth的依赖,Nacos和openFeign的依赖这里不再详述。不清楚的可以用陈老师之前的文章文章和案例源码来补漏。

  调整日志级别

  由于 sleuth 没有 UI 界面,所以需要调整日志级别才能在控制台中看到更详细的链接信息。

  将以下配置添加到三个服务的配置文件中:

  ## 设置openFeign和sleuth的日志级别为debug,方便查看日志信息

logging:

level:

org.springframework.cloud.openfeign: debug

org.springframework.cloud.sleuth: debug

  完善的演示界面

  下面的界面只是为了演示创建的数据,并没有集成DB。

  sleuth-order9033 查询订单详情的接口,如下图:

  

  sleuth-product9032产品详情查询界面如下:

  

  gateway-sleuth9031网关路由配置如下:

  

  测试

  启动以上三个服务,浏览器可以直接访问::9031/order/get/12

  观察控制台日志输出,如下图:

  

  日志格式共有四个参数,含义如下:

  好吧,既然整合完成了,我不禁深吸一口气,直接看日志,不是瞎了眼……

  "

  案例源码已上传,公众号【码猿科技专栏】回复关键词9528获取。

  "

  什么是 ZipKin?

  Zipkin 是 Twitter 的一个开源项目。它基于 Google Dapper。它专门用于采集服务的时序数据。

  为了解决微服务架构中的延迟问题,包括数据的采集、存储、搜索和呈现。

  ZipKin 的基础架构如下:

  

  Zipkin分为4个核心组件,如下:

  zipkin 分为服务器和客户端。服务器主要用于采集跟踪数据并显示。客户端的主要功能是将其发送到服务器。微服务的应用也是客户端。一旦调用发生,*敏*感*词*器就会被触发,将 sleuth 日志数据传输到服务器。

  如何搭建zipkin服务器?

  首先需要下载服务器的jar包,地址:

  下载完成后会得到一个jar包,如下图:

  

  直接启动jar,命令如下:

  java -jar zipkin-server-2.23.4-exec.jar

  出现如下界面表示启动完成:

  

  这时候就可以访问zipkin的UI界面了,地址:9411,界面如下:

  

  以上是通过下载jar来搭建服务器。当然还有其他的安装方式,比如docker,自己试试吧,陈不再演示了。

  如何构建 zipKin 客户端?

  服务器只跟踪数据的采集和显示,而客户端是数据的生成和传输者。下面详细介绍如何构建客户端。

  或者上面例子中的三个微服务,直接添加zipkin的依赖,如下:

  

org.springframework.cloud

spring-cloud-starter-zipkin

  注意:由于spring-cloud-starter-zipkin中已经收录了Spring Cloud Sleuth依赖,所以只需要引入上述依赖之一即可。

  配置文件需要配置zipkin服务器的地址,配置如下:

  spring:

cloud:

sleuth:

sampler:

# 日志数据采样百分比,默认0.1(10%),这里为了测试设置成了100%,生产环境只需要0.1即可

probability: 1.0

zipkin:

#zipkin server的请求地址

base-url: http://127.0.0.1:9411

#让nacos把它当成一个URL,而不要当做服务名

discovery-client-enabled: false

  以上配置完成后,就可以启动服务了。此时访问::9031/order/get/12

  调用界面后,再次访问zipkin的UI界面,如下图:

  

  可以看到刚才调用的接口已经被*敏*感*词*了,点击SHOW进入详情视图,如下图:

  

  可以看到左侧显示了一个完整的链接,包括服务名称、耗时,右侧显示了服务调用的信息,包括开始、结束时间、请求url、请求方法……

  除了调用链接的信息外,还可以清晰的看到各个服务的依赖关系,如下图所示:

  

  如何切换zipKin的数据传输模式?

  zipkin默认的传输方式是HTTP,但是这里有个问题。一旦在传输过程中客户端和服务器断开连接,跟踪日志信息就会丢失。

  当然,zipkin也支持MQ传输,支持消息中间件如下:

  使用MQ传输不仅可以保证消息丢失的问题,还可以提高传输效率。生产环境中推荐使用 MQ 传输。

  那么问题来了,怎么切换呢?

  其实方法很简单。让 Chen 以 RabbitMQ 为例进行介绍。

  1、服务器连接到 RabbitMQ

  运行服务器并使用以下命令连接到 RabbitMQ:

  java -jar zipkin-server-2.23.4-exec.jar --zipkin.collector.rabbitmq.addresses=localhost --zipkin.collector.rabbitmq.username=guest --zipkin.collector.rabbitmq.password=guest

  命令分析如下:

  2、客户端添加RabbitMQ

  由于使用了MQ传输,所以必须添加相应的依赖和配置。添加RabbitMQ依赖如下:

  

org.springframework.boot

spring-boot-starter-amqp

  配置MQ的地址、用户名、密码如下:

  spring:

rabbitmq:

addresses: 127.0.0.1

username: guest

password: guest

  3、配置文件中的传输模式切换

  配置 spring.cloud.zipkin.sender.type 用于切换传输方式。rabbit的值表示使用rabbitMQ进行数据传输。

  配置如下:

  spring:

cloud:

zipkin:

sender:

## 使用rabbitMQ进行数据传输

type: rabbit

  注意:使用MQ传输时,可以去掉spring.cloud.zipkin.sender.base-url。

  完整的配置如下:

  

  4、测试

  由于使用了MQ传输,我们可以在不启动服务器的情况下成功传输。浏览器访问::9031/order/get/12

  这时候发现服务没有报异常。看到在RabbitMQ中已经传输了数据,并且存在于zipkin队列中,如下图:

  

  可以看到有消息没有被消费。点击查看消息内容为 Trace 和 Span 相关信息。

  好的,我们启动服务器,命令如下:

  java -jar zipkin-server-2.23.4-exec.jar --zipkin.collector.rabbitmq.addresses=localhost --zipkin.collector.rabbitmq.username=guest --zipkin.collector.rabbitmq.password=guest

  服务端启动后,发现zipkin队列中的消息瞬间被消费。查看zipkin的UI界面,发现已经生成了链接信息,如下图:

  

  zipkin 是如何持续存在的?

  zipkin的信息默认存储在内存中。一旦服务器重启,信息就会丢失,但 zipkin 提供了可插拔存储。

  zipkin 支持以下四种存储方式:

  今天Chen会以MySQL为例介绍zipkin是如何持久化的,Elasticsearch会放在下一篇文章中,有点长。

  1、创建数据库

  zipkin服务器上的MySQL建表SQL在源码中的zipkin-storage/mysql-v1/src/main/resources/mysql.sql中。我将把这个SQL文件放在案例源代码中。

  "

  github地址:

  "

  创建的数据库:zipkin(任意名称),导入SQL进行建表,新创建的数据库表如下:

  

  2、服务器配置 MySQL

  服务器配置很简单,运行以下命令:

  java -jar zipkin-server-2.23.4-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSQL_DB=zipkin --MYSQL_USER=root --MYSQL_PASS=Nov2014

  以上命令参数分析如下:

  陈是如何记住这些参数的?废话,记不住了,你可以随时查看源代码。这些配置在源码的配置文件/zipkin-server/src/main/resources/zipkin-server-shared.yml中,比如上面提到的MySQL配置,如下图:

  

  zipkin服务器的所有配置项都在这里,我没什么可看的。

  "

  github地址:

  "

  然后使用rabbitMQ传输方式和MySQL持久化方式,完整命令如下:

  java -jar zipkin-server-2.23.4-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSQL_DB=zipkin --MYSQL_USER=root --MYSQL_PASS=Nov2014 --zipkin.collector.rabbitmq.addresses=localhost --zipkin.collector.rabbitmq.username=guest --zipkin.collector.rabbitmq.password=guest

  持久化是服务端做的,和客户端无关,所以结束了陈就不再测试了,自己试试吧。

  总结

  前面介绍了这么多。不知道你有没有仔细读过。让我们总结一下:

  zipkin 默认以内存的形式存储。MySQL也是一种方法,但是随着数据量的增加,性能下降。因此,建议在生产环境中使用 Elasticsearch。下一篇文章会介绍。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线