前言

微服务治理方案中,链路追踪是必修课,SpringCloud的组件其实使用很简单,生产环境中真正令人头疼的往往是软件维护,接口在微服务间的调用究竟哪个环节出现了问题,哪个环节耗时较长,这都是项目上线后一定会遇到的问题,为了解决这些问题链路追踪便应运而生了。

主流方案

1)、SkyWalking:这应该是目前最主流的方案了,我所在公司今年的新项目就开始使用这个,效果确实很显著,功能强大,最重要还是国产的,后面不用看了我们支持国产吧!开个玩笑哈哈,其实这个框架也有缺点,就是稍微有点重,比较适合稍大一点的项目,但可预见后面几年都是最受欢迎的方案;

2)、Zipkin:这个是老牌链路追踪方案,已经被非常多项目验证过实用性,相比较于SkyWalking,我个人更喜欢这个框架,因为更轻量级,安装也非常简单,是中小规模的微服务项目首选方案。

用法

1、zipkin环境搭建

官方提供了docker版本,十分简单。也可以下载编译好的zipkin.jar来运行,是springboot项目。

官网: Quickstart · OpenZipkin

1)、启动

默认端口号启动zipkin服务,默认端口9411.

java -jar zipkin.jar

2)、指定端口号

java -jar zipkin.jar --server.port=8080

3)、指定访问RabbitMQ

java -jar zipkin.jar --zipkin.collector.rabbitmq.addresses=127.0.0.1

4)、启动效果

2、SpringCloud整合zipkin

springcloud其它基础依赖包引入这里省略,直接模拟场景。

会员服务:zipkin_member

订单服务:zipkin_order

消息服务:zipkin_msg

过程:会员服务调用订单服务,订单服务调用消息服务。

1)、引入依赖

<!-- zipkin -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

2)、application.yml配置

注意事项:

a)、加上服务名,RestTemplate调用时会用到;

b)、加上zipkin服务端地址;

c)、加上probability采集率设置,默认0.1,测试环境改为1.0保证每次都采集,生产环境适当抽样即可。(因为10000个请求抽样1000个也能发现问题了,没必要全部都采集)

3)、引入RestTemplate

这里restTemplate主要用来进行接口调用查看链路追踪是否生效

@Component
public class RestTemplateConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}
}

4)、controller调用

会员调用订单

订单调用消息

消息处理具体业务

5)、查看效果

启动Zipkin服务端,访问: http://127.0.0.1:9411

执行controller接口

查看链路追踪,可以看到,接口调用的链路已经在zipkin显现了。

3、zipkin整合RabbitMQ异步采集

springboot2.0之后,官方不再推荐使用自建的zipkin server,而是直接使用编译好的zipkin.jar来给我们使用。

zipkin.jar中的yml配置可以参考: https://github.com/openzipkin/zipkin/blob/master/zipkin-server/src/main/resources/zipkin-server-shared.yml

1)、指定RabbitMQ为服务器

启动zipkin服务时指定rabbitmq为服务器即可,得先启动rabbitmq服务器。

java -jar zipkin.jar --zipkin.collector.rabbitmq.addresses=192.168.239.132

启动之后,可以发现rabbitmq中会自动新增一个zipkin队列,表示绑定成功。

2)、引入中间依赖

给每个微服务引入stream和rabbitmq的中间件依赖

<!-- 引入和rabbitmq的中间依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>

3)、yml配置

修改每个微服务的application.yml,加上rabbitmq的配置。

rabbitmq: host: 192.168.239.132port: 5672username: guestpassword: guest

4)、启动和调用

启动微服务,执行调用。

5)、MQ是否收到消息

看rabbitmq是否有收消息,队列有反应说明rabbitmq收到消息了。

6)、Zipkin是否采集信息

看zipkin是否采集了链路信息

7)、验证积压消息

关掉zipkin服务,看消息是否会积压在rabbitmq,再启动zipkin服务,看消息是否会被消费并且获取到链路信息。

获取消息查看,发现获取到的就是traceId相关的json数据,证明整个过程都是正常的。

重新再启动zipkin服务,发现rabbitmq积压的消息就被消费了。

并且也能获取到链路信息

4、zipkin使用MySQL存储

zipkin.jar中的yml配置可以参考,里面有关于mysql的配置或者其他如elasticsearch的配置:

zipkin/zipkin-server-shared.yml at master · openzipkin/zipkin · GitHub

这节我们在上一节MQ的基础上增加MySQL的启动配置项

1)、指定MySQL

命令看着很长,其实仔细看发现很简单,都是见名知义,不必死记硬背。

java -jar zipkin.jar

--zipkin.collector.rabbitmq.addresses=192.168.239.132

--zipkin.storage.type=mysql

--zipkin.storage.mysql.host=127.0.0.1

--zipkin.storage.mysql.port=3306

--zipkin.storage.mysql.username=root

--zipkin.storage.mysql.password=123456

--zipkin.storage.mysql.db=zipkin

2)、创建zipkin数据库

根据1中命令配置的信息,创建zipkin数据库,并执行语句创建zipkin采集记录的三张表。

参考官网: zipkin/mysql.sql at master · openzipkin/zipkin · GitHub

这里我也贴出来 zipkin-mysql.sql

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,`remote_service_name` VARCHAR(255),`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(`remote_service_name`) COMMENT 'for getTraces and getRemoteServiceNames';
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;

3)、效果

启动微服务,执行controller请求,看是否成功。

RabbitMQ

zipkin

MySQL

至此,springcloud sleuth + zipkin + rabbitmq + mysql 就全部整合成功了!

总结

微服务的治理方案有很多,学习方向根据个人喜好决定,我的经验就是不必盲目跟从这种用于辅助的方案,比如现在有SkyWalking,以后可能还有SkyFlying、SkySwimming。

走向高级软件工程师都要有一个意识,就是在层出不穷的开源框架如雨后春笋般出现的时候,你得有信心用到哪个花点时间就能自己搭建起来,这才是提升自己的最有效方法。

一个项目使用什么治理方案最重要的绝不是跟风,而是哪款最适合就用哪款,就像你找女朋友一样,不单单是找漂亮的,而是找最能一起过日子的,否则就是貌合神离。

微服务链路追踪之zipkin搭建相关推荐

  1. 「Java分享客栈」随时用随时翻:微服务链路追踪之zipkin搭建

    前言 微服务治理方案中,链路追踪是必修课,SpringCloud的组件其实使用很简单,生产环境中真正令人头疼的往往是软件维护,接口在微服务间的调用究竟哪个环节出现了问题,哪个环节耗时较长,这都是项目上 ...

  2. 微服务链路追踪SkyWalking

    微服务链路追踪SkyWalking 链路追踪介绍 skywalking是什么 SkyWalking环境搭建部署 SkyWalking跨多个微服务跟踪 SkyWalking UI介绍 SkyWalkin ...

  3. 微服务链路追踪-SkyWalking

    微服务链路追踪-SkyWalking SkyWalking官网地址:https://skywalking.apache.org/ SkyWalking官方文档:https://skywalking.a ...

  4. SkyWalking 微服务链路追踪

    目录 8. SkyWalking 微服务链路追踪 8.1 介绍 SkyWalking 8.2 Skywalking---服务搭建 8.3 SkyWalking---接入服务 8.3.1 windows ...

  5. SpringCloud Sleuth + zipkin 实现微服务链路追踪功能

    一.微服务架构下的问题 在大型的微服务架构系统中,存在很多不同的微服务应用,不同的微服务有依赖着其他微服务,以及不同微服务有可能由不同的团队维护.那么在这种复杂的系统架构中,将会存在一些问题,比如: ...

  6. 微服务.链路追踪概述和方案 (Cat Zipkin Skywaking,Sluth等组件对比选型)

    概述 为什么追踪链路 1. 单体应用 过渡 到微服务 2. 微服务 必须导致 调用熵增加 3. 单体应用中两个问题显现出来:根据日志查询问题:调用链路和调用的性能. 4. 日志问题在以后的日志方案中研 ...

  7. 微服务链路追踪SkyWalking第一课 SkyWalking简介

    开篇词:从剖析 SkyWalking 源码到吃透 APM 核心知识 你好,我是你的 SkyWalking 老师徐郡明,网名吴小胖,你也可以叫我胖哥.进入互联网行业工作多年,主要从事基础组件开发相关的工 ...

  8. 07-搭建微服务-链路追踪Sleuth

    1.为什么使用链路追踪? 在微服务中,随着服务越来越多,对调用链的分析越来越复杂. 出现问题: 1.微服务之间的调用错综复杂,用户发送的请求经历哪些服务,调用链不清楚,没有一个自动化的工具类来维护调用 ...

  9. 阿里P7架构师详解微服务链路追踪原理

    背景介绍 在微服务横行的时代,服务化思维逐渐成为了程序员的基本思维模式,但是,由于绝大部分项目只是一味地增加服务,并没有对其妥善管理,当接口出现问题时,很难从错综复杂的服务调用网络中找到问题根源,从而 ...

最新文章

  1. 53.C#--多线程
  2. Android,使用Json发送数据中,使用的Java转义字符 KanKan原创
  3. 基于Java Socket的文件UpLoad代码(完美版)-用递归解决java的目录树遍历
  4. 运算方法和运算部件一
  5. 十大教养,让你气度非凡!
  6. Fashion-MNIST下载地址
  7. CentOS 7 利用Docker搭建Showdoc文档管理系统
  8. 长沙 · 中国1024程序员节盛况空前,500 万程序员线上线下引爆星城
  9. Cookie/Session机制详解 转
  10. 2018年AI和ML(NLP,计算机视觉,强化学习)技术概述和2019年趋势
  11. 怎么用SQL sever打开mdf
  12. A、H股股价倒挂说明了什么
  13. 修改Windows系统注册表并使其立即生效
  14. Caused by : java.lang.NoSuchMethodError
  15. Kademlia详解
  16. osg绳索_绳索:理论与实践
  17. iOS中开发者账号分类
  18. 上市公司融资约束SA测算以及结果(2000-2019)
  19. PCL:交互点选点云
  20. 《支付宝对接之-当面付》

热门文章

  1. 折线图播放器组件 - elementui - ehcart
  2. 开关电源环路学习笔记(3)-系统框图
  3. Python 实现个人博客系统
  4. python图像音频处理-通过图像傅里叶变换判断相位和幅度的重要性
  5. 把笔记本改造成无线路由器 —— 手机抓包牛刀小试
  6. 【电脑使用】硬盘无法引导进入系统,无法退出BIOS
  7. mysql进阶(十九)SQL语句如何精准查找某一时间段的数据
  8. log4j配置详解(非常详细转载)
  9. 腾讯收购Foxmail的意图
  10. 新知实验室 TRTC实时音视频