经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring » 查看文章
微服务集成Spring Cloud Zipkin实现链路追踪并集成Dubbo
来源:cnblogs  作者:sowler  时间:2024/4/8 8:54:17  对本文有异议

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

运行:

  1. java -jar zipkin-server-2.12.9-exec.jar
  2. # 或集成RabbitMQ
  3. 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数据库中执行。

  1. CREATE TABLE IF NOT EXISTS zipkin_spans (
  2. `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
  3. `trace_id` BIGINT NOT NULL,
  4. `id` BIGINT NOT NULL,
  5. `name` VARCHAR(255) NOT NULL,
  6. `parent_id` BIGINT,
  7. `debug` BIT(1),
  8. `start_ts` BIGINT COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL',
  9. `duration` BIGINT COMMENT 'Span.duration(): micros used for minDuration and maxDuration query',
  10. PRIMARY KEY (`trace_id_high`, `trace_id`, `id`)
  11. ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
  12. ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTracesByIds';
  13. ALTER TABLE zipkin_spans ADD INDEX(`name`) COMMENT 'for getTraces and getSpanNames';
  14. ALTER TABLE zipkin_spans ADD INDEX(`start_ts`) COMMENT 'for getTraces ordering and range';
  15. CREATE TABLE IF NOT EXISTS zipkin_annotations (
  16. `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
  17. `trace_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.trace_id',
  18. `span_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.id',
  19. `a_key` VARCHAR(255) NOT NULL COMMENT 'BinaryAnnotation.key or Annotation.value if type == -1',
  20. `a_value` BLOB COMMENT 'BinaryAnnotation.value(), which must be smaller than 64KB',
  21. `a_type` INT NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if Annotation',
  22. `a_timestamp` BIGINT COMMENT 'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp',
  23. `endpoint_ipv4` INT COMMENT 'Null when Binary/Annotation.endpoint is null',
  24. `endpoint_ipv6` BINARY(16) COMMENT 'Null when Binary/Annotation.endpoint is null, or no IPv6 address',
  25. `endpoint_port` SMALLINT COMMENT 'Null when Binary/Annotation.endpoint is null',
  26. `endpoint_service_name` VARCHAR(255) COMMENT 'Null when Binary/Annotation.endpoint is null'
  27. ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
  28. ALTER TABLE zipkin_annotations ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `span_id`, `a_key`, `a_timestamp`) COMMENT 'Ignore insert on duplicate';
  29. ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`, `span_id`) COMMENT 'for joining with zipkin_spans';
  30. ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTraces/ByIds';
  31. ALTER TABLE zipkin_annotations ADD INDEX(`endpoint_service_name`) COMMENT 'for getTraces and getServiceNames';
  32. ALTER TABLE zipkin_annotations ADD INDEX(`a_type`) COMMENT 'for getTraces and autocomplete values';
  33. ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces and autocomplete values';
  34. ALTER TABLE zipkin_annotations ADD INDEX(`trace_id`, `span_id`, `a_key`) COMMENT 'for dependencies job';
  35. CREATE TABLE IF NOT EXISTS zipkin_dependencies (
  36. `day` DATE NOT NULL,
  37. `parent` VARCHAR(255) NOT NULL,
  38. `child` VARCHAR(255) NOT NULL,
  39. `call_count` BIGINT,
  40. `error_count` BIGINT,
  41. PRIMARY KEY (`day`, `parent`, `child`)
  42. ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;

启动命令

  1. 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依赖
  1. <!--依赖包含了sleuth,所以不需要再单独引入sleuth-->
  2. <!-- sleuth :链路追踪器 zipkin :链路分析器-->
  3. <dependency>
  4. <groupId>org.springframework.cloud</groupId>
  5. <artifactId>spring-cloud-starter-zipkin</artifactId>
  6. </dependency>
  7. <!--如果上面依赖飘红引不进来,那么原因可能是你使用的cloud版本已经移除了spring-cloud-starter-zipkin 则需要引入以下依赖-->
  8. <!-- <dependency>-->
  9. <!-- <groupId>org.springframework.cloud</groupId>-->
  10. <!-- <artifactId>spring-cloud-starter-sleuth</artifactId>-->
  11. <!-- </dependency>-->
  12. <!-- <dependency>-->
  13. <!-- <groupId>org.springframework.cloud</groupId>-->
  14. <!-- <artifactId>spring-cloud-sleuth-zipkin</artifactId>-->
  15. <!-- </dependency>-->
4.2、 配置ZipKin信息

用户模块配置:

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

订单模块配置:

  1. spring:
  2. profiles:
  3. active: dev
  4. application:
  5. # 服务名称
  6. name: order-service-model
  7. zipkin:
  8. enabled: true
  9. #zipkin服务所在地址
  10. base-url: http://localhost:9411/
  11. sender:
  12. type: web #使用http的方式传输数据到, Zipkin请求量比较大,可以通过消息中间件来发送,比如 RabbitMQ
  13. #配置采样百分比
  14. sleuth:
  15. sampler:
  16. 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依赖:

  1. <!--适用于 Dubbo 2.7.X 版本-->
  2. <dependency>
  3. <groupId>io.zipkin.brave</groupId>
  4. <artifactId>brave-instrumentation-dubbo</artifactId>
  5. </dependency>
  6. <!--适用于 Dubbo 2.6.x-->
  7. <dependency>
  8. <groupId>io.zipkin.brave</groupId>
  9. <artifactId>brave-instrumentation-dubbo-rpc</artifactId>
  10. </dependency>

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

  1. dubbo:
  2. application:
  3. name: order-service-model-consumer
  4. consumer:
  5. group: DEFAULT_GROUP
  6. version: 2.0
  7. check: false
  8. filter: tracing #tracingfilter过滤器对dubbo进行追踪
  9. provider:
  10. filter: tracing #tracingfilter过滤器对dubbo进行追踪

提供方:

  1. dubbo:
  2. application:
  3. name: user-service-model-provider
  4. protocol:
  5. name: dubbo
  6. port: -1
  7. consumer:
  8. check: false
  9. filter: tracing #tracingfilter过滤器对dubbo进行追踪
  10. provider:
  11. filter: tracing #tracingfilter过滤器对dubbo进行追踪
  12. group: DEFAULT_GROUP
  13. version: 2.0

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

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

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

原文链接:https://www.cnblogs.com/sowler/p/18119872

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号