首页 > 其他分享 >微服务集成Spring Cloud Zipkin实现链路追踪并集成Dubbo

微服务集成Spring Cloud Zipkin实现链路追踪并集成Dubbo

时间:2024-04-07 21:23:18浏览次数:13  
标签:集成 Dubbo COMMENT trace zipkin -- Zipkin dubbo id

1、什么是ZipKin

Zipkin 是一个根据 Google 发表的论文“ Dapper” 进行开源实现的分布式跟踪系统。 Dapper是Google 公司内部的分布式追踪系统,用于生产环境中的系统分布式跟踪。 Google在其论文中对此进行了解释,他们“构建了Dapper,以向Google开发人员提供有关复杂分布式系统行为的更多信息。”从不同角度观察系统对于故障排除至关重要,在系统复杂且分布式的情况下更是如此。Zipkin可帮助您准确确定对应用程序的请求在哪里花费了更多时间。无论是代码内部的调用,还是对另一服务的内部或外部API调用,您都可以对系统进行检测以共享上下文。微服务通常通过将请求与唯一ID相关联来共享上下文。此外,在系统太复杂的情况下,可以选择仅使用样本追踪 (sample trace ,一种占用资源比例更低的追踪方式) 来减少系统开销。

官网地址: https://zipkin.io/

Github地址:https://github.com/openzipkin/zipkin

2、安装Zipkin

在 SpringBoot 2.x 版本后就不推荐自定义 zipkin server 了,推荐使用官网下载的 jar 包方式也就是说我们不需要编写一个zipkin服务了,而改成直接启动jar包即可。

老版本jar下载地址:

https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec

老版本查看其他版本信息下载
https://central.sonatype.com/artifact/io.zipkin.java/zipkin-server/versions

最新版本的服务jar下载地址:

https://search.maven.org/remote_content?g=io.zipkin&a=zipkin-server&v=LATEST&c=exec

最新版本查看其他版本信息下载
https://central.sonatype.com/artifact/io.zipkin/zipkin-server/versions

下载快速启动脚本:

https://zipkin.io/quickstart.sh

这里使用ZipKin老版本:zipkin-server-2.12.9-exec.jar

运行:

java -jar zipkin-server-2.12.9-exec.jar

# 或集成RabbitMQ

java -jar zipkin-server-2.12.9-exec.jar --zipkin.collector.rabbitmq.addresses=127.0.0.1

3、信息持久化启动

链路信息默认是存在内存中,下一次ZipKin重启后信息就会消失,所以需要信息持久化。官方提供了Elasticsearch方式与Mysql两种存储方式。本篇使用Mysql进行持久化,在正式环境推荐使用Elasticsearch进行持久化。首先创建一个zipkin数据库,然后下载数据库脚本: https://github.com/openzipkin/zipkin/blob/2.12.9/zipkin-storage/mysql-v1/src/main/resources/mysql.sql 或者复制以下sql语句在zipkin数据库中执行。

CREATE TABLE IF NOT EXISTS zipkin_spans (
  `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
  `trace_id` BIGINT NOT NULL,
  `id` BIGINT NOT NULL,
  `name` VARCHAR(255) NOT NULL,
  `parent_id` BIGINT,
  `debug` BIT(1),
  `start_ts` BIGINT COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL',
  `duration` BIGINT COMMENT 'Span.duration(): micros used for minDuration and maxDuration query',
  PRIMARY KEY (`trace_id_high`, `trace_id`, `id`)
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;

ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTracesByIds';
ALTER TABLE zipkin_spans ADD INDEX(`name`) COMMENT 'for getTraces and getSpanNames';
ALTER TABLE zipkin_spans ADD INDEX(`start_ts`) COMMENT 'for getTraces ordering and range';

CREATE TABLE IF NOT EXISTS zipkin_annotations (
  `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
  `trace_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.trace_id',
  `span_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.id',
  `a_key` VARCHAR(255) NOT NULL COMMENT 'BinaryAnnotation.key or Annotation.value if type == -1',
  `a_value` BLOB COMMENT 'BinaryAnnotation.value(), which must be smaller than 64KB',
  `a_type` INT NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if Annotation',
  `a_timestamp` BIGINT COMMENT 'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp',
  `endpoint_ipv4` INT COMMENT 'Null when Binary/Annotation.endpoint is null',
  `endpoint_ipv6` BINARY(16) COMMENT 'Null when Binary/Annotation.endpoint is null, or no IPv6 address',
  `endpoint_port` SMALLINT COMMENT 'Null when Binary/Annotation.endpoint is null',
  `endpoint_service_name` VARCHAR(255) COMMENT 'Null when Binary/Annotation.endpoint is null'
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;

ALTER TABLE zipkin_annotations ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `span_id`, `a_key`, `a_timestamp`) COMMENT 'Ignore insert on duplicate';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`, `span_id`) COMMENT 'for joining with zipkin_spans';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTraces/ByIds';
ALTER TABLE zipkin_annotations ADD INDEX(`endpoint_service_name`) COMMENT 'for getTraces and getServiceNames';
ALTER TABLE zipkin_annotations ADD INDEX(`a_type`) COMMENT 'for getTraces and autocomplete values';
ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces and autocomplete values';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id`, `span_id`, `a_key`) COMMENT 'for dependencies job';

CREATE TABLE IF NOT EXISTS zipkin_dependencies (
  `day` DATE NOT NULL,
  `parent` VARCHAR(255) NOT NULL,
  `child` VARCHAR(255) NOT NULL,
  `call_count` BIGINT,
  `error_count` BIGINT,
  PRIMARY KEY (`day`, `parent`, `child`)
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;

启动命令

java -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSQL_DB=zipkin --MYSQL_USER=root --MYSQL_PASS=1234qwer

启动成功访问服务:http://127.0.0.1:9411/zipkin/

4、微服务集成Zipkin

4.1、 引入Maven依赖
        <!--依赖包含了sleuth,所以不需要再单独引入sleuth-->
        <!-- sleuth :链路追踪器  zipkin :链路分析器-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
        </dependency>
        <!--如果上面依赖飘红引不进来,那么原因可能是你使用的cloud版本已经移除了spring-cloud-starter-zipkin 则需要引入以下依赖-->
<!--        <dependency>-->
<!--            <groupId>org.springframework.cloud</groupId>-->
<!--            <artifactId>spring-cloud-starter-sleuth</artifactId>-->
<!--        </dependency>-->
<!--        <dependency>-->
<!--            <groupId>org.springframework.cloud</groupId>-->
<!--            <artifactId>spring-cloud-sleuth-zipkin</artifactId>-->
<!--        </dependency>-->
4.2、 配置ZipKin信息

用户模块配置:

spring:
  profiles:
    active: dev
  application:
    # 服务名称
    name: user-service-model
  zipkin:
    enabled: true #是否启用
    #zipkin服务所在地址
    base-url: http://127.0.0.1:9411/
    sender:
      type: web #使用http的方式传输数据到, Zipkin请求量比较大,可以通过消息中间件来发送,比如 RabbitMQ
    #配置采样百分比
    sleuth:
      sampler:
        probability: 1 # 将采样比例设置为 1.0,也就是全部都需要。默认是0.1也就是10%,一般情况下,10%就够用了

订单模块配置:

spring:
  profiles:
    active: dev
  application:
    # 服务名称
    name: order-service-model
  zipkin:
    enabled: true
    #zipkin服务所在地址
    base-url: http://localhost:9411/
    sender:
      type: web #使用http的方式传输数据到, Zipkin请求量比较大,可以通过消息中间件来发送,比如 RabbitMQ
    #配置采样百分比
    sleuth:
      sampler:
        probability: 1 # 将采样比例设置为 1.0,也就是全部都需要。默认是0.1也就是10%,一般情况下,10%就够用了

配置成功后,启动gateway-module、user-module、order-module模块相关服务。启动成功访问后台服务接口,可以看到在zipkin中已经加载了相关请求信息。

然后我们可以在看看数据库,检查下zipkin在数据库中信息是否持久化成功。查看下图可以发现数据也已经持久化成功了,这样不管zipkin重启多少次都不影响数据的展示。

5、ZipKin集成Dubbo

由于项目使用的是dubbo做为各服务模块之间的通信调用,要想zipkin采集到各服务模块的调用信息,所以需要自己去集成。操作也很方便zipkin为我们提供了集成dubbo相关依赖。首先在dubbo提供者和消费者模块中引入maven依赖:

		<!--适用于 Dubbo 2.7.X 版本-->
        <dependency>
            <groupId>io.zipkin.brave</groupId>
            <artifactId>brave-instrumentation-dubbo</artifactId>
        </dependency>
		<!--适用于 Dubbo 2.6.x-->
        <dependency>
            <groupId>io.zipkin.brave</groupId>
            <artifactId>brave-instrumentation-dubbo-rpc</artifactId>
        </dependency>

然后在dubbo配置中添加filter属性设置tracing参数,调用方:

dubbo:
  application:
    name: order-service-model-consumer
  consumer:
    group: DEFAULT_GROUP
    version: 2.0
    check: false
    filter: tracing  #tracingfilter过滤器对dubbo进行追踪
  provider:
    filter: tracing  #tracingfilter过滤器对dubbo进行追踪

提供方:

dubbo:
  application:
    name: user-service-model-provider
  protocol:
    name: dubbo
    port: -1
  consumer:
    check: false
    filter: tracing #tracingfilter过滤器对dubbo进行追踪
  provider:
    filter: tracing #tracingfilter过滤器对dubbo进行追踪
    group: DEFAULT_GROUP
    version: 2.0

配置成功后,重新启动项目服务接口可以看出zipkin实现了对dubbo的链路追踪。查看下图可以发现该接口调用了订单和用户两个服务模块。

点击user-service-model可以查看出采集信息详情。

在zipkin导航菜单中,点击依赖可以查看每个服务模块的依赖信息。

标签:集成,Dubbo,COMMENT,trace,zipkin,--,Zipkin,dubbo,id
From: https://www.cnblogs.com/sowler/p/18119872

相关文章

  • SpringBoot集成mqtt启动就不断报已断开连接问题
    踩坑记录,实在是天坑!!!原因一:clientId相同,即clientId重复导致(不过我不是这个问题)我的问题是:项目启动成功后,控制台不停地反复输出:已断开连接,,,加了重连机制后,则不停地输出:重连失败,已连接客户机,,,尼玛,,关键点还在于我能接收到订阅的消息(不影响消息处理),这又是什么情况,明明没断连,确一直......
  • 软考-系统集成项目管理中级-项目管理一般知识
    本章历年考题分值统计本章重点常考知识点汇总清单(学握部分可直接理解记忆)项目型组织的优点体现在如下方面:本章历年考题及答案解析2019年上半年第29题(此题为常规重点考题,建议举一反三)在(29)组织结构中,项目拥有独立的项目团队,项目经理在调用与项目相关的资源时,......
  • vue websocket电脑端前端集成
    后端数据用websocket推送数据,前端在大屏左上角模块页面接收,用bus发送到其他模块(总共6个模块页面,从左上模块页面发送到其他5个模块页面)页面,数据用于大屏上显示,废话不多说,直接上代码。eventBus.js文件,放到根目录src->assets->js文件夹下,eventBus.js文件内容如下:importVuefr......
  • TalkingData——Unity应用开发中集成统计分析工具
    第一步:帐号注册官方网站:TalkingData-移动.数据.价值第二步:创建应用查看appid可以进入网站注册,注册好以后就可以创建应用 创建好应用后,点击 应用管理-》基本信息就可以查看自己的AppID第三步:申请对应平台的sdk 接下来就是申请sdk这里是申请sdk的网站:SDK定制填写......
  • SpringBoot集成微信支付(JAVA)
    微信支付(Java)目录微信支付(Java)简介:登录微信公众平台(JSAPI支付):注意事项:添加依赖:application.yaml:WeixinPayController:PaymentService:PaymentServiceImpl:实体类PaymentJSAPI:简介:        Springboot项目集成微信支付(JSAPI),用于微信公众号对接支付功......
  • SpringBoot集成微信支付(JAVA)
    微信支付(Java)目录微信支付(Java)简介:登录微信公众平台(JSAPI支付):注意事项:添加依赖:application.yaml:WeixinPayController:PaymentService:PaymentServiceImpl:实体类PaymentJSAPI:简介:        Springboot项目集成微信支付(JSAPI),用于微信公众号对接支付功能......
  • Spring Boot 集成 RabbitMQ(一)
    1、RabbitMQ和SpringBoot的基础概念RabbitMQ 是一个开源的MQ(MessageQueue,消息队列)客户端服务器实现,遵循AMQP(AdvancedMessageQueuingProtocol)协议。它允许应用发送消息并不直接传递到目标对象,而是通过交换器,队列,绑定的方式进行处理和转发,从而实现应用的解耦,异步......
  • FFmpeg开发笔记(十二)Linux环境给FFmpeg集成libopus和libvpx
    ​MP4是最常见的视频封装格式,在《FFmpeg开发实战:从零基础到短视频上线》一书的“1.2.3 自行编译与安装FFmpeg”介绍了如何给FFmpeg集成x264和x265两个库,从而支持H.264和H.265两种标准的编解码。视频的封装格式除了古老的MP4和ASF之外,还有较新的WebM格式,该格式的音频编码主要采......
  • 中间件 ZK分布式专题与Dubbo微服务入门 8-2 dubbo 入门简介
    0课程地址https://coding.imooc.com/lesson/201.html#mid=12740 1重点关注1.1本节内容dubbo环境搭建版本及入门简介 1.2环境版本要求dubbo2.5.3及其以上jdk6及其以上maven3及其以上 1.3为什么要用dubbo......
  • 190页大型制造企业IT信息化应用集成及数字化平台建设方案(PPT)
    原文《大型制造企业IT信息化应用集成及数字化平台建设方案》PPT格式,共190页​制造企业信息化系统应用集成>总体框架总体框架制造企业信息化目标与规划>总览图移动、知识、协同、集成、智能、安全总览图制造企业信息化>集成平台整体规划lIT资源一体化l避免信息孤......