# 从浅入深 学习 SpringCloud 微服务架构(十四)微服务链路追踪

从浅入深 学习 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 限流

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/609306.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java中的并发编程

1、上下文切换 即使是单核处理器也支持多线程执行代码&#xff0c;CPU通过给每个线程分配CPU时间片来实现 这个机制。这个时间片特别短&#xff0c;一般是几十毫秒&#xff0c;所以会让我们觉得好多任务同时进行。 CPU通过时间片分配算法来循环执行任务&#xff0c;当前任务执…

autolabor(ROS开发笔记)__1

视频链接&#xff1a;ROS机器人 chapter 1 ROS概述与环境搭建 学习步骤&#xff1a; 1.了解该模块的相关概念 是什么&#xff0c;为什么学&#xff0c;前世今生&#xff0c;发展前景 2.安装官方软件包 具备基本的开发环境&#xff0c;简陋notepad 3.搭建集成开发环境(IDE,Int…

打造抖音萌娃账户,一条广告轻松过万,副业兼职最佳选择(实例教程 素材内容)

我特别喜欢简单易操作的新项目&#xff0c;因为过于复杂和门槛高的项目对新手来说可能是毁灭性的&#xff0c;他们往往难以入门&#xff0c;而且付出努力也得不到反馈。 下 载 地 址 &#xff1a; laoa1.cn/1971.html 小宝宝小萌娃账户就相对简单&#xff0c;它类似于电视剧…

文字图形化:UI设计师的必备能力,带你看看为什么要这么做。

在UI设计中&#xff0c;文字尽可能要进行图形化设计的原因有以下几点&#xff1a; 提高识别性&#xff1a; 图形化设计可以通过视觉效果和形状来吸引用户的注意力&#xff0c;从而提高文字的可识别性。这有助于用户更快地理解并记住信息&#xff0c;同时也可以增强品牌的认知…

Python实现一个简单的计算器

简单版本 使用 Python 的 Tkinter 模块来实现一个简单的图形化计算器。以下是一个基本的示例代码 示例效果 代码源码 import tkinter as tkdef button_click(number):current entry.get()entry.delete(0, tk.END)entry.insert(0, current str(number))def button_clear():e…

翼支付——风控场景中图模型的范式变迁

目录 风控图深度学习模型 风控图大模型

ASP.NET校园新闻发布系统的设计与实现

摘 要 校园新闻发布系统是在学校区域内为学校教育提供资源共享、信息交流和协同工作的计算机网络信息系统。随着网络技术的发展和Internet应用的普及&#xff0c;互联网已成为人们获取信息的重要来源。由于现在各大学校的教师和学生对信息的需求越来越高&#xff0c;校园信息…

Redis未授权访问

一、漏洞描述 Redis未授权访问 因配置不当可以未经授权访问&#xff0c;攻击者无需认证就可以访问到内部数据。 1. 导致敏感信息泄露 2. 执行 flushall 可清空所有数据 3. 通过数据备份功能往磁盘写入后门文件&#xff08;webshell、定时任务&#xff09; 4. 如果Redis以…

Swift 集合类型

集合类型 一、集合的可变性二、数组&#xff08;Arrays&#xff09;1、数组的简单语法2、创建一个空数组3、创建一个带有默认值的数组4、通过两个数组相加创建一个数组5、用数组字面量构造数组6、访问和修改数组7、数组的遍历 三、集合&#xff08;Sets&#xff09;1、集合类型…

共识算法基础

目录 PaxosRaft节点间是如何通讯的什么是任期与任期编号选举有哪些规则随机超时时间Raft日志成员变更Nacos中Raft的运用&#xff08;cp模式&#xff09; DistroZAB协议博客 Paxos paxos算法是由兰伯特与1990年提出的一个分布式系统的共识算法。分布式系统的共识算法通俗易懂的…

【多客系统】社交圈子论坛系统,小程序/app/H5多端圈子社区论坛系统交友,社区圈子论坛小程序前后端搭建,社交圈平台系统

简述 社交圈子论坛系统是一种面向特定人群或特定话题的社交网络&#xff0c;它提供了用户之间交流、分享、讨论的平台。在这个系统中&#xff0c;用户可以创建、加入不同的圈子&#xff0c;圈子可以是基于兴趣、地域、职业等不同主题的。用户可以在圈子中发帖、评论、点赞等互…

聊聊 ASP.NET Core 中间件(二):中间件和筛选器的区别

前言 有些小伙伴看到上一篇文章后&#xff0c;可能会发现中间件和我们之前讲的筛选器非常类似&#xff0c;比如它们都是通过 next 串起来的一系列的组件&#xff0c;并且都可以在请求处理前后执行代码&#xff0c;都可以通过不执行 next 来进行请求的终止。那么筛选器和中间件…

风筝挂在高压线上怎么办?输电线路AI视频监测装置快速识别保平安

放风筝是一项既有趣又能够让人放松心情的活动&#xff0c;如今风筝的造型和设计也是越来越多样&#xff0c;各种形状奇特的风筝随风起舞&#xff0c;飘荡在空中。不过需要注意的是&#xff0c;由于风速变化无常&#xff0c;放风筝时稍不留神就会将风筝挂在高压线等公共基础设施…

从Apache HttpClient类库,说一说springboot应用程序中的AutoConfiguration的封装

一、背景 在使用httpclient框架请求http接口的时候&#xff0c;我们往往会需要自定义配置httpclient&#xff0c;而非直接使用。 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>…

SPSS之主成分分析

SPSS中主成分分析功能在【分析】--【降维】--【因子分析】中完成&#xff08;在SPSS软件中&#xff0c;主成分分析与因子分析均在【因子分析】模块中完成&#xff09;。 求解主成分通常从分析原始变量的协方差矩阵或相关矩阵着手。 &#xff08;1&#xff09;当变量取值的度量…

20232820 2023-2024-2 《网络攻防实践》实践九报告

20232820 2023-2024-2 《网络攻防实践》实践九报告 1.实践内容 本次实践的对象是一个名为pwn1的linux可执行文件。 该程序正常执行流程是&#xff1a;main调用foo函数,foo函数会简单回显任何用户输入的字符串。 该程序同时包含另一个代码片段&#xff0c;getShell&#xff…

从开发角度理解漏洞成因(02)

文章目录 文件上传类需求文件上传漏洞 文件下载类需求文件下载漏洞 扩展 留言板类&#xff08;XSS漏洞&#xff09;需求XSS漏洞 登录类需求cookie伪造漏洞万能密码登录 持续更新中… 文章中代码资源已上传资源&#xff0c;如需要打包好的请点击PHP开发漏洞环境&#xff08;SQL注…

当导师和学生陷入「隐形冲突」

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

AI写的论文AI疑似度太高怎么办?教你一招解决

随着 AI 技术迅猛发展&#xff0c;各种AI辅助论文写作的工具层出不穷&#xff01; 为了防止有人利用AI工具进行论文代写&#xff0c;在最新的学位法中已经明确规定“已经获得学位者&#xff0c;在获得该学位过程中如有人工智能代写等学术不端行为&#xff0c;经学位评定委员会…

易基因:Nature子刊:ChIP-seq等揭示c-di-AMP与DasR互作以调控细菌生长、发育和抗生素合成|项目文章

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 c-di-AMP是一种在细菌信号中普遍存在且至关重要的核苷酸第二信使&#xff0c;对于大多数c-di-AMP合成生物体来说&#xff0c;c-di-AMP稳态及其信号转导的分子机制非常值得关注。 2024年…