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

主要问题

     由于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.0
springcloud:Greenwich.M1
个人建议新手不要过分追求新版本,旧版本的还是够用的,比springboot 2.6.0搭配sringcloud Finchley SR2还是挺稳的,如果真的要探索新版本你会发现这里面的坑实在是踩不完,基本要花个一两天才能让自己从坑里跳出去,这样频繁踩坑会让新手很容易放弃~~~
ps:不要问我为什么知道。。。

主要问题

闲话扯完了,可以进入正题了
一共四个服务
eureka-server
zipkin-server:新版本的zipkin服务端,负责接受sleuth发送过来的数据,完成处理、存储、建立索引,并且提供了一个可视化的ui数据分析界面。
需要的同学话可以直接在github上下载https://github.com/openzipkin...

clipboard.png

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

clipboard.png

eureka-server服务注册中心,这个实现我就不讲了,网上搜一大把,各个版本实现基本都是一致的,并不存在版本更新跨度极大的情况。而且这里我把它是打包成一个jar包,在需要的时候直接用java -jar XXX.jar 直接启动

至于product跟order(也即实际场景下各种种样的服务A、B、C...)

order服务只有一个接口/test,去调用product的接口
clipboard.png

这里的productclient就是使用feignf去调用order的/product/list接口

product只有一个接口/product/list,查找所有商品的列表
clipboard.png

简单的来说,这里的场景就是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>

其实这些都是基础操作,是吧,那么来点进阶的。

  1. 在sleuth-cli跟zipkin-server之间插入一个消息中间件rabbitmq/kafka,这里我举例中只使用rabbitmq来实现
  2. 将链路追踪的数据存储到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插件看一下
clipboard.png

这真的是一个巨坑,我一直不明白是怎么回事,直到有一次,我打开了这个页面,花了我一天的时间去摸索是什么原因造成的集成rabbitmq失败,真的是被安排得明明白白
clipboard.png

最后,豪无头绪的我,继续在网上查找一些springboot2.x版本的一些链路追踪的教程,在搜索了一个下午,我突然想起,诶不对,我应该直接去官网看它的官方教程的啊。。。虽然都英文,大不了我用chrome自带的翻译工具翻译一下咯。结果就立马打开spring的官网,选择了最新的版本,进去找了一下,还真的让我找到了!!!
不得不说官方文档的重要性!
https://cloud.spring.io/sprin...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章