springboot新版本(2.1.0)、springcloud新版本(Greenwich.M1)实现链路追踪的一些坑

51次阅读

共计 3490 个字符,预计需要花费 9 分钟才能阅读完成。

主要问题
     由于 springboot 新版本 (2.1.0)、springcloud 新版本(Greenwich.M1) 实现链路追踪 sleuth+zipkin 的一些“新特性”,使得我在实现 sleuth+zipkin 的过程上踩了不少坑。
     在 springboot1.X 版本的时候,实现链路追踪服务需要用户自己实现 client 以及 server,通常在 server 服务端需要引入各种各样的包(spring-cloud-sleuth-stream,以及支持 zipkin 的一些相关依赖包等等);
     但在 spring cloud 新版本实现链路追踪 sleuth+zipkin 的方式上已经不再需要自己再去实现一个 server 服务端(集成 sleuth+zipkin),而是由 zinkin 官方提供了一个现成的 zipkin-server.jar,或者是一个 docker 镜像,用户可以下载并通过命令进行启动它,用户可以通一些配置来确定 sleuth 收集到信息后传输到 zipkin 之间采用 http, 还是通过 rabbit/kafka 的方式。在新的版本下,用户只需要关注 slenth-client 选用何种传输方式(http 或 mq(rabbit/kafka),如果选择 http, 则在配置中指明 base-url;如果选择 mq, 则在配置指明相关消息中间件的相关信息 host/port/username/password…),至于 zipkin 的信息 storage 问题, 则由 zipkin-server 要负责,可以通过 zipkin-server.jar 配置一些具体的参数来启动。(下面会细讲)
ps: 这不是教程贴,这主要是解决一些问题的一些方法,不会有详细的实现过程,但为了简明我会贴上部分代码。
背景
     最近开始实习了,老大让我自学一下 sc(spring cloud),学就学嘛,也不是难事。看完 spring cloud 的全家桶, 老大说让我重点了解一下它的链路追踪服务,后期会有这方面的任务安排给我做,所以呢我就重点关注这一方面,打算自己做个 demo 练练手,看了网上的教程,膨胀的我选择了个最新的版本,结果发现就这么掉坑里了。。。
版本
按照惯例,先说下 springboot 跟 spring cloud 的版本 springboot:2.1.0springcloud:Greenwich.M1 个人建议新手不要过分追求新版本,旧版本的还是够用的, 比 springboot 2.6.0 搭配 sringcloud Finchley SR2 还是挺稳的,如果真的要探索新版本你会发现这里面的坑实在是踩不完,基本要花个一两天才能让自己从坑里跳出去,这样频繁踩坑会让新手很容易放弃~~~ps:不要问我为什么知道。。。
主要问题
闲话扯完了,可以进入正题了一共四个服务 eureka-serverzipkin-server:新版本的 zipkin 服务端,负责接受 sleuth 发送过来的数据,完成处理、存储、建立索引,并且提供了一个可视化的 ui 数据分析界面。需要的同学话可以直接在 github 上下载 https://github.com/openzipkin…

嗯就是这两个家伙下面两个是两个服务

eureka-server 服务注册中心,这个实现我就不讲了,网上搜一大把,各个版本实现基本都是一致的,并不存在版本更新跨度极大的情况。而且这里我把它是打包成一个 jar 包, 在需要的时候直接用 java -jar XXX.jar 直接启动
至于 product 跟 order(也即实际场景下各种种样的服务 A、B、C…)
order 服务只有一个接口 /test,去调用 product 的接口
这里的 productclient 就是使用 feignf 去调用 order 的 /product/list 接口
product 只有一个接口 /product/list,查找所有商品的列表
简单的来说,这里的场景就是 order 服务 –(去调用)–>product 服务
说完场景后,贴一下这两个服务的相关配置信息(order 跟 producet 的配置基本上是相同的)application.yml
spring:
application:
#服务名
name: product
#由于业务逻辑需要操作数据库,所以这里配置了 mysql 的一些信息
datasource:
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 123456
url: jdbc:mysql://127.0.0.1:3306/sc_sell?characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
jpa:
show-sql: true
#重点
zipkin:
#base-url: 当你设置 sleuth-cli 收集信息后通过 http 传输到 zinkin-server 时,需要在这里配置
base-url: http://localhost:9411
enabled: true
sleuth:
sampler:
#收集追踪信息的比率,如果是 0.1 则表示只记录 10% 的追踪数据,如果要全部追踪,设置为 1(实际场景不推荐,因为会造成不小的性能消耗)
probability: 1
eureka:
client:
service-url:
#注册中心地址
defaultZone: http://localhost:8999/eureka/
logging:
level:
#这个是设置 feign 的一个日志级别,key-val 的形式设置
org.springframework.cloud.openfeign: debug

说完配置信息,就该讲一下依赖了,很简单,client 实现链路追踪只需要添加一个依赖 spring-cloud-starter-zipkin。就是这个
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
其实这些都是基础操作,是吧,那么来点进阶的。

在 sleuth-cli 跟 zipkin-server 之间插入一个消息中间件 rabbitmq/kafka,这里我举例中只使用 rabbitmq 来实现
将链路追踪的数据存储到 DB 上,目前 zipkin 暂时只支持 mysql/elasticsearch, 这里我使用 mysql

如果你是刚开始学习 sc,给你去实现的话,你肯定会开始打开浏览器开始搜索教程。结果你会发现,大部分博客上都是以前版本的实现方式,一些较旧会让你自己实现一个 zipkin-server(我怀疑他们的版本是 1.x), 你会发现很郁闷,因为这跟你想象的不太一样啊。继续找,终于在茫茫帖子中,找到了一篇是关于 springboot2.0.X 版本的实现链路追踪的教程,这时候你会兴奋,终于找到靠谱一点的啊,喜出望外有木有啊,但是,事情还没完,它会让你在客户端依赖下面这个依赖包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin-stream</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-stream</artifactId>
</dependency>
结果你会发现,你在依赖它的时候,其实是依赖不了,为什么?因为版本的问题,什么?你跟我说你的 pom 文件没报错啊,但是,你打开 idea 右边的 maven 插件看一下
这真的是一个巨坑,我一直不明白是怎么回事,直到有一次,我打开了这个页面,花了我一天的时间去摸索是什么原因造成的集成 rabbitmq 失败,真的是被安排得明明白白
最后,豪无头绪的我,继续在网上查找一些 springboot2.x 版本的一些链路追踪的教程,在搜索了一个下午,我突然想起,诶不对,我应该直接去官网看它的官方教程的啊。。。虽然都英文,大不了我用 chrome 自带的翻译工具翻译一下咯。结果就立马打开 spring 的官网,选择了最新的版本,进去找了一下,还真的让我找到了!!!不得不说官方文档的重要性!https://cloud.spring.io/sprin…

正文完
 0