从浅入深 学习 SpringCloud 微服务架构(十四)微服务链路追踪
一、微服务的链路追踪概述
1、微服务架构下的问题
在大型系统的微服务化构建中,一个系统会被拆分成许多模块。这些模块负责不同的功能,组合成系统,最终可以提供丰富的功能。在这种架构中,一次请求往往需要涉及到多个服务。互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发、可能使用不同的编程语言来实现、有可能布在了几千台服务器,横跨多个不同的数据中心,也就意味着这种架构形式也会存在一些问题。
- 如何快速发现问题 ?
- 如何判断故障影响范围 ?
- 如何梳理服务依赖以及依赖的合理性?
- 如何分析链路性能问翻“m:亦时容量规划?
2、分布式链路追踪(Distributed Tracing) :
分布式链路追踪就是将一次分布式请求还原成调用链路,进行日志记录,性能监控并将 一次分布式请求的调用情况集中展示。
比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等。
3、目前业界比较流行的链路追踪系统有:
- Twitter 的 Zipkin,
- 阿里的鹰眼,
- 美团的 Mtrace,
- 大众点评的 cat 等,
大部分都是基于 go0gle 发表的 Dapper。Dapper 阐述了分布式系统,特别是微服务架构中链路追踪的概念、数据表示,埋点、传递、收集,存储与展示等技术细节。
4、Sleuth 概述
Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案,并且兼容支持了 zipkin,你只需要在 pom 文件中引入相应的依赖即可。
5、相关概念
Spring Cloud Sleuth 为 Spring Cloud 提供了分布式根据的解决方案。它大量借用了 Google Dapper 的设计。先来了解一下 Sleuth 中的术语和相关概念。
Spring Cloud Sleuth 采用的是 Google 的开源项目 Dapper 的专业术语。
- Span : 基本工作单元,
例如,在一个新建的 span 中发送一个 RPC 等同于发送一个回应请求给 RPC,span 通过一个64位 ID 唯一标识,trace 以另一个64位 ID 表示,span 还有其他数据信息,比如摘要、时间戳事件、关键值注释(tags)、span 的 ID、以及进度 ID(通常是IP地址) span 在不断的启动和停止,同时记录了时间信息,当你创建了一个 span,你必须在未来的某个时刻停止它。
- Trace : 一系列 spans 组成的一个树状结构,
例如,如果你正在跑一个分布式大数据工程,你可能需要创建一个 trace。
二、链路追踪:sleuth 入门
1、模拟链路追踪:
客户端 —> 调用 网关 —> 网关调用 订单微服务 —> 订单微服务 调用 商品微服务。
网关模块(子工程 api_gateway_service)
订单微服务模块(子工程 order_service)
商品微服务模块(子工程 product_service)
注册中心模块(子工程 eureka_service)
2、在子工程 api_gateway_service(子模块)中,修改 application.yml 配置文件,添加上 order_service 模块的配置。
## spring_cloud_demo\api_gateway_service\src\main\resources\application.yml
server:
port: 8088 # 启动端口 命令行注入。
spring:
application:
name: api-gateway-service #spring 应用名, # 注意 FeignClient 不支持名字带下划线
redis: # 引入 redis
host: localhost
pool: 6379
database: 0
# 配置 SpringCloudGateway 的路由
cloud:
gateway:
routes: # 配置路由,路由Id,路由到微服务的 uri, 断言(判断条件)
- id: product-service # 保持唯一
uri: lb://service-product # lb:// 根据微服务名称从注册中心拉取服务请求路径。
predicates: # 断言(判断条件)设置
- Path=/product-service/** # 将当前请求转发到 http://127.0.0.1/product/1
filters: # 配置路由过滤器 http://localhost:8088/product-service/product/1 --> http://127.0.0.1:9001/product/1
- RewritePath=/product-service/(?<segment>.*), /$\{segment} # 路径重写的过滤器。
- id: order-service # 保持唯一
uri: lb://service-order # lb:// 根据微服务名称从注册中心拉取服务请求路径。
predicates: # 断言(判断条件)设置
- Path=/order-service/** # 将当前请求转发到 http://127.0.0.1/order/buy/1
filters: # 配置路由过滤器 http://localhost:8088/order-service/order/buy/1 --> http://127.0.0.1:9002/order/buy/1
- RewritePath=/order-service/(?<segment>.*), /$\{segment} # 路径重写的过滤器。
eureka: # 配置 Eureka
client:
service-url:
defaultZone: http://localhost:9000/eureka/
instance:
prefer-ip-address: true # 使用ip地址注册。
logging: # 日志
level:
root: info
org.springframework.web.servlet.DispatcherServlet: DEBUG
org.springframework.cloud.sleuth: DEBUG
3、重新启动 父工程 spring_cloud_demo 下 全部子项目( eureka_service, product_service, order_service, api_gateway_service )的启动类,进行测试:
1)浏览器地址栏输入(网关 调用 订单微服务):
http://localhost:8088/product-service/product/1 就相当于调用 http://127.0.0.1:9001/product/1
2)浏览器地址栏输入(网关 调用 订单微服务 调用 商品微服务):
http://localhost:8088/order-service/order/buy/1 就相当于调用 http://127.0.0.1:9002/order/buy/1
http://127.0.0.1:9002/order/buy/1 又调用了 http://127.0.0.1:9001/product/1
4、链路追踪 Sleuth 入门:接下来通过之前的项目案例整合 Sleuth,完成 链路追踪 Sleuth 入门案例的编写。
之前的项目模块代码请查看:
# 从浅入深 学习 SpringCloud 微服务架构(十一)–SpringCloudGateWay(1)
4.1 在各个子工程 ( product_service, order_service, api_gateway_service )(子模块)的 pom.xml 中,引入链路追踪 Sleuth 依赖坐标。
<!-- 引入 sleuth 链路追踪 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
4.2 在各个子工程 ( product_service, order_service, api_gateway_service )(子模块)的 application.yml 配置文件,添加日志级别。
logging: # 日志
level:
root: info
org.springframework.web.servlet.DispatcherServlet: DEBUG
org.springframework.cloud.sleuth: DEBUG
5、重新启动 父工程 spring_cloud_demo 下 全部子项目( eureka_service, product_service, order_service, api_gateway_service )的启动类,进行测试:
1)浏览器地址栏输入(网关 调用 订单微服务):
http://localhost:8088/product-service/product/1 就相当于调用 http://127.0.0.1:9001/product/1
2)浏览器地址栏输入(网关 调用 订单微服务 调用 商品微服务):
http://localhost:8088/order-service/order/buy/1 就相当于调用 http://127.0.0.1:9002/order/buy/1
http://127.0.0.1:9002/order/buy/1 又调用了 http://127.0.0.1:9001/product/1
3)在 IDEA 的 Run Dashboard 后台面板,会显示详细日志信息。
三、链路追踪:zipkin 概述
1、查看日志文件分析链路追踪并不是一个很好的方法,当微服务越来越多日志文件也会越来越多,通过 zipkin 可以将日志聚合,并进行可视化展示和全文检索。
2、Zipkin 的概述
-
Zipkin 是 Twiter 的一个开源项目,它基于 Google Dapper 实现,它致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现。
-
我们可以使用 Zipkin 来收集各个服务器上请求链路的跟踪数据,并通过它提供的 REST API 接口来辅助我们查询跟踪数据以实现对分布式系统的监控程序,从而及时地发现系统中出现的延迟升高问题并找出系统性能瓶颈的根源。
-
除了面向开发的 API 接口之外,Zipkin 也提供了方便的 UI 组件来帮助我们直观的搜索跟踪信息和分析请求链路明细,比如:可以查询某段时间内各用户请求的处理时间等。
-
Zipkin 提供了可插拔数据存储方式 : In-Memory、MySql、Cassandra 以及 Elasticsearch.
3、Zipkin 的基础架构,它主要由4个核心组件构成:
- Collector : 收集器组件,它主要用于处理从外部系统发送过来的跟踪信息,将这些信息转换为 Zipkin 内部处理的 Span 格式,以支持后续的存储、分析、展示等功能。
- Storage : 存储组件,它主要对处理收集器接收到的跟踪信息,默认会将这些信息存储在内存中我们也可以修改此存储策略,通过使用其他存储组件将跟踪信息存储到数据库中。
- RESTfUI API : API 组件,它主要用来提供外部访问接口。比如给客户端展示跟踪信息,或是外接系统访问以实现监控等,
- Web Ul : U1 组件,基于 API 组件实现的上层应用。通过 UI 组件用户可以方便而有直观地査询和分析跟踪信息。
4、Zipkin 分为两端,一个是 Zipkin 服务端,一个是 Zipkin 客户端。
客户端也就是微服务的应用。客户端会配置服务端的 URL 地址,一旦发生服务间的调用的时候,会被配置在微服务里面的 Sleuth 的监听器监听,并生成相应的 Trace 和 Span 信息发送给服务端。发送的方式主要有两种,一种是 HTTP 报文的方式,还有一种是消息总线的方式如 RabbitMQ。
不论哪种方式,我们都需要:
- 一个 Eureka 服务注册中心,这里我们就用之前的 eureka 项目来当注册中心。
- 一个 Zipkin 服务端。
- 多个微服务,这些微服务中配置 Zipkin 客户端。
四、链路追踪:zipkinServer 的安装和启动
1、Zipkin Server 下载
从 spring boot 2.0 开始,官方就不再支持使用自建 Zipkin Server 的方式进行服务链路追踪,而是直接提供了编译好的 jar 包来给我们使用。
可以从官方网站下载先下载 zipkin 的 web Ul,如:下载 zipkin-server-2.12.9-exec.jar
1)cmd 用如下命令下载:
curl -sSL https://zipkin.io/quickstart.sh | bash -s
2)到 Maven 中央仓库下载:
https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec
2、启动 Zipkin Server
在命令行输入 java -jar zipkin-server-2.12.9-exec.jar 启动 Zipkin Server
java -jar zipkin-server-2.12.9-exec.jar
3、浏览器输入 http://127.0.0.1:9411 即可进入到 Zipkin Server 的管理后台
默认 Zipkin Server 的请求端口为 9411
五、链路追踪:zipkin 整合 sleuth 展示调用链路
1、在各个子工程 ( product_service, order_service, api_gateway_service )(子模块)的 pom.xml 中,引入 zipkin 依赖坐标。
<!-- 引入 zipkin 依赖坐标 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
2、在各个子工程 ( product_service, order_service, api_gateway_service )(子模块)的 application.yml 配置文件,添加 zipkin 配置(注意在 spring 标签下)。
zipkin: # 配置 zipkin 链路追踪
base-url: http://127.0.0.1:9411 # server 的请求地址
sender:
type: web # 数据的传输方式,以 http 的形式向 server 端发送数据
sleuth:
sampler:
probability: 1 # 采样比,1 代表 100% 全采样。
3、重新启动 父工程 spring_cloud_demo 下 全部子项目( eureka_service, product_service, order_service, api_gateway_service )的启动类,并确保已经启动 zipkin 服务,进行测试:
1)浏览器地址栏输入(网关 调用 订单微服务):
http://localhost:8088/product-service/product/1 就相当于调用 http://127.0.0.1:9001/product/1
2)浏览器地址栏输入(网关 调用 订单微服务 调用 商品微服务):
http://localhost:8088/order-service/order/buy/1 就相当于调用 http://127.0.0.1:9002/order/buy/1
http://127.0.0.1:9002/order/buy/1 又调用了 http://127.0.0.1:9001/product/1
3)浏览器地址栏输入 http://127.0.0.1:9411 即可进入到 Zipkin Server 的管理后台
查看链路追踪相关信息。
六、链路追踪:zipkin 整合 sleuth 的执行过程和存在的问题分析
1、重新启动 Zipkin Server (cmd 窗口,按 Ctrl + C 停止 ZipkinServer 服务。)
在命令行重新输入 java -jar zipkin-server-2.12.9-exec.jar 启动 Zipkin Server
浏览器输入 http://127.0.0.1:9411 进入到 Zipkin Server 的管理后台,发现原来采集的数据都没有了。
2、以上问题说明 链路追踪:zipkin 整合 sleuth 的执行过程存在的问题如下:
-
1)链路数据如何持久化(保存)?
-
2)如何优化数据采集过程?
七、链路追踪:zipkin 服务端数据保存 mysql 数据库
1、链路追踪:存储跟踪数据
Zipkin Server 默认时间追踪数据信息保存到内存,这种方式不适合生产环境。因为一旦 Service 关闭重启或者服务崩溃,就会导致历史数据消失。Zipkin 支持将追踪数据持久化到 mysql 数据库或者存储到 elasticsearch 中。
2、链路数据持久化:在 zipkin 服务湍,将数据存储到 mysql 数据库中的步骤:
- 1)准备 mysql 数据库和表(由 zipkin 提供)。
- 2)修改 zipkin server 的启动命令(带上参数)。
3、准备 mysql 数据库和表,创建 zipkin 数据库,并创建三张表(zipkin_spans,zipkin_annotations,zipkin_dependencies)。
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;
4、修改 zipkin server 的启动命令(带上参数)
查看 zipkin 官方文档:
https://gitcode.com/openzipkin/zipkin/blob/master/zipkin-server/src/main/resources/zipkin-server-shared.yml
D:\software>java -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSQL_USER=root --MYSQL_PASS=12311 --MYSQL_DB=zipkin
5、重新启动 父工程 spring_cloud_demo 下 全部子项目( eureka_service, product_service, order_service, api_gateway_service )的启动类,并确保已经启动 zipkin 服务,进行测试:
1)浏览器地址栏输入(网关 调用 订单微服务):
http://localhost:8088/product-service/product/1 就相当于调用 http://127.0.0.1:9001/product/1
2)浏览器地址栏输入(网关 调用 订单微服务 调用 商品微服务):
http://localhost:8088/order-service/order/buy/1 就相当于调用 http://127.0.0.1:9002/order/buy/1
http://127.0.0.1:9002/order/buy/1 又调用了 http://127.0.0.1:9001/product/1
3)浏览器地址栏输入 http://127.0.0.1:9411 即可进入到 Zipkin Server 的管理后台
查看链路追踪相关信息。
6、重新启动 Zipkin Server (cmd 窗口,按 Ctrl + C 停止 ZipkinServer 服务。)进行测试。
1)在命令行重新输入 启动命令, 重新启动 Zipkin Server
java -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSQL_USER=root --MYSQL_PASS=12311 --MYSQL_DB=zipkin
2)浏览器输入 http://127.0.0.1:9411 进入到 Zipkin Server 的管理后台,采集的数据依然存在。
3)用 SQLyong 连接 mysql 数据库,发现三第表,有了数据。
八、链路追踪:zipkin 通过消息中间件进行数据收集的思路分析
1、链路追踪:zipkin 如何优化数据采集过程?
解决方法:可以使用消息中间件 RabbitMQ 进行异步收集数据。
2、使用 RabbitMQ 进行异步收集数据步骤:
- 1)准备 rabbitmq 的服务器。
- 2)修改 zipkin 客户端,将消息以 rabbit 的形式发送到 mq 服务器。
- 3)修改 zipkin 服务端,从 rabbit 中拉取消息。
九、链路追踪:zipkin 服务端连接 rabbitmq
1、下载安装 Eralng 和 消息中间件 rabbitmq-server 服务。
1.1 下载安装 Eralng (otp_win64_20.2.exe)
1.2 配置 Eralng 环境变量:
- 新建系统变量名为:ERLANG_HOME 变量值:erlang 安装地址(如:D:\Program Files\erl9.2)
- 将 系统变量 ERLANG_HOME 添加到 Path 目录下。
1.3 验证 erlang 是否安装成功:
WIN + R 打开【运行】,输入【cmd】,打开命令提示符窗口,输入:erl 显示 erlang 版本号,说明安装成功。
1.4 下载安装 rabbitmq-server-3.7.4.exe
1.5 进入 rabbitMQ 安装目录的 sbin 目录,安装管理界面 rabbitmq_management(插件)
rabbitmq-plugins enable rabbitmq_management
1.6 进入 rabbitMQ 安装目录的 sbin 目录,启动 rabbitmq-server.bat 服务:
rabbitmq-server.bat
1.7 验证 rabbitmq 是否安装成功:
WIN + R 打开【运行】,输入【cmd】,打开命令提示符窗口,输入:rabbitmqctl status
出现如下界面,表示安装成功。
1.8 打开浏览器,地址栏输入 http://127.0.0.1:15672 ,进入 rabbitmq 管理界面
默认用户名、密码都是:guest
2、修改 zipkin 服务端,从 rabbit 中拉取消息。在命令行重新输入 zipkin 启动命令, 重新启动 Zipkin Server(注意 rabbitmq 管理页面端口是:15672,请求端口是:5672,使用默认用户名密码:guest 连接,就不需要此参数了)
java -jar zipkin-server-2.12.9-exec.jar --RABBIT_ADDRESSES=127.0.0.1:5672
3、再次打开浏览器,地址栏输入 http://127.0.0.1:15672 ,进入 rabbitmq 管理界面查看
(默认用户名、密码都是:guest)
队列里多了 Name :zipkin
十、链路追踪:zipkin 客户端向 rabbitmq 中发送数据并测试
1、在各个子工程 ( product_service, order_service, api_gateway_service )(子模块)的 pom.xml 中,引入 rabbitmq 依赖坐标。
<!-- 引入 rabbit 相关 依赖坐标 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
</dependency>
2、在各个子工程 ( product_service, order_service, api_gateway_service )(子模块)的 application.yml 配置文件,添加 rabbitmq 配置(注意在 spring 标签下)。
# 修改 zipkin 使用 rabbitmq 采集数据
zipkin: # 配置 zipkin 链路追踪
#base-url: http://127.0.0.1:9411 # server 的请求地址
sender:
#type: web # 数据的传输方式,以 http 的形式向 server 端发送数据
type: rabbit # 向 rabbitmq 中发送消息。
sleuth:
sampler:
probability: 1 # 采样比,1 代表 100% 全采样。
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
listener: # 配置重试策略
direct:
retry:
enabled: true
simple:
retry:
enabled: true
3、重新启动 父工程 spring_cloud_demo 下 全部子项目( eureka_service, product_service, order_service, api_gateway_service )的启动类,并确保已经启动 zipkin 服务 和 rabbitmq 服务,进行测试:
1)试着把 zipkin 服务停掉,
2)浏览器地址栏输入(网关 调用 订单微服务):
http://localhost:8088/product-service/product/1 就相当于调用 http://127.0.0.1:9001/product/1
3)浏览器地址栏输入(网关 调用 订单微服务 调用 商品微服务):
http://localhost:8088/order-service/order/buy/1 就相当于调用 http://127.0.0.1:9002/order/buy/1
http://127.0.0.1:9002/order/buy/1 又调用了 http://127.0.0.1:9001/product/1
4)浏览器地址栏输入 http://127.0.0.1:15672 即可进入到 rabbitmq Server 的管理后台
查看链路追踪相关信息,已经有了数据。
5)在 zipkin 安装目录下(如:D:\software\zipkin-server-2.12.9-exec.jar ),再次打开 zipkin 服务(不连接 mysql 数据库),
java -jar zipkin-server-2.12.9-exec.jar --RABBIT_ADDRESSES=127.0.0.1:5672
6)浏览器地址栏输入 http://127.0.0.1:9411 即可进入到 Zipkin Server 的管理后台
查看链路追踪相关信息,有数据。
由于 zipkin 启动没有连接数据库,所以 Zipkin Server 的管理后台 查询到的数据就是从 rabbitmq 服务拉取的。
上一节关联链接请点击:
# 从浅入深 学习 SpringCloud 微服务架构(十三)SCG 网关中使用 sentinel 限流