【微服务学习笔记】stream与zipkin的操作和使用

一、 实验一: Spring Cloud Stream 消息驱动开发

1.什么是Spring Cloud Stream

  • 官方定义Spring Cloud Stream是一个构建消息驱动微服务的框架。

2.实验环境准备(以 RabbitMQ为例)

  • 启动RabbitMQ:以管理员身份运行cmd启动,执行命令rabbitmq-service start

3.基础信息收发实验,编写代码操作

新建3个子模块

  • cloud-stream-rabbitmq-provider8801
  • cloud-stream-rabbitmq-consumer8802

  • cloud-stream-rabbitmq-consumer8803

3.1 模块 cloud-stream-rabbitmq-provider8801

导入所需依赖项(8801)

编写配置文件application.yml(8801)

编写SendMessageController.java(8801)

作用:①接收外部 HTTP 请求(GET /sendMessage);②调用服务层发送消息到 RabbitMQ;③返回消息发送结果

编写 IMessageProvider.java和 MessageProviderImpl.java

作用:①@EnableBinding(Source.class):启用Spring Cloud Stream的Source 绑定;Source 是 Stream 提供的标准输出通道接口;自动创建消息发送管道。 ②注入 MessageChannel output:获取消息输出通道。 ③send() 方法:生成 UUID 消息;通过 output.send() 将消息发送到 RabbitMQ;消息流向:MessageChannel → Binder → RabbitMQ Exchange。

3.2 模块 cloud-stream-rabbitmq-consumer8802

每个微服务pom文件都需要定义spring-boot.version和 spring-cloud.version。

编写application.yml(8802)

编写ReceiveMessageListenerController(负责从 RabbitMQ 的消息队列中接收并处理消息)

3.3 模块 cloud-stream-rabbitmq-consumer880 3

编写pom文件,添加所需的依赖

编写配置文件application.yml(8803配置了group)

编写ReceiveMessageListenerController.java(负责从 RabbitMQ 的消息队列中接收并处理消息)

3.4 检查并准备运行

检查三个服务的YAML配置,确保它们使用同一个Exchange,我们的代码中统一为:

▲Provider用的是output,Consumer用的是input

依次启动 Eureka Server(7001)- Provider(8801)- Consumer(8802、8803)

查看控制台,可以看到8802的临时队列和8803的持久化队列。

证明:

①Provider和Consumer已经成功连接到RabbitMQ

②Exchange(studyExchange)已经自动创建

③Consumer绑定了队列并准备接收消息

4.测试

4.1 发送测试消息,访问:http://localhost:8801/sendMessage

终端显示以下类似信息,说明Stream 消息发送和接收链路(消息消费)完全正常

4.2 临时队列:当我们停止8802端口运行后,控制台的临时队列消失

二、 实验二: Zipkin 链路追踪集成

1.下载 Jar

Spring Cloud Edgware版本之后,改为采用官方提供的 Jar 包的形式启动。

2.运行

进入安装目录,打开cmd窗口,无需解压,执行如下命令启动zipkin-server,命令:java -jar zipkin-server-2.23.9-exec.jar

3.访问

zipkin的默认端口为9411,浏览器访问http://localhost:9411/zipkin/,打开zipkin控制台

4.修改现有模块

Zipkin 是一个独立的外部服务(类似于 Eureka 或 RabbitMQ),只需要在现有的微服务模块中添加依赖和配置即可

(1)在你的 cloud-stream-rabbitma-provider8801/pom.xml 中添加:

(2)修改配置 (application.yml),添加以下配置:

(3)对8802和8803文件进行(1)(2)相同操作

5.验证链路

启动 Zipkin Server→启动 Eureka、RabbitMQ→启动 8801、8802、8803→调用 8801 的接口发送消息:http://localhost:8801/sendMessage→打开 http://localhost:9411,点击 "Run Query"

6.测试分组"轮询"机制

接着,我们可以将8802的也配置上分组,查看是否出现同一组内消息争夺的情况

同样的依次启动服务后,可以在RabbitMQ的控制台查看到,只出现一个队列,说明8802和8803已成功的分为一组

当我们发送一条消息时,8802接收到,8803无无响应

发送第2条时,8803接收到,8802无响应,说明同一组内采取"轮询"的机制

接着查看Zipkin的控制台,追踪链路,可以查看到刚刚发送了两个请求

三、总结所遇到的问题

实验一: Spring Cloud Stream 消息驱动开发

1. 总结操作

基于RabbitMQ构建消息驱动微服务,定义消息通道通过 @EnableBinding(Source/Sink) ,利用 @StreamListener 实现生产者的消息推送与消费者的被动监听。在配置上,通过binders定义中间件连接信息,并通过 bindings 将业务通道绑定到具体的 Exchange。

2. 所遇 问题 与解决方法

在启动生产者模块时,频繁报错Unknown binder configuration: rabbit;同时在消费者配置中,binder引用持续报出"值无效"的红色警告。

校对application.yml,确保bindings下引用的binder名称(如 defaultRabbit)与 binders定义的键名完全一致,并避免使用rabbitmq这种易混淆的命名。对于业务需求,为核心消费者添加group属性以创建持久化队列,从而实现断点续传和负载均衡。

实验二: Zipkin 链路追踪集成

1. 总结操作

在项目中引入分布式追踪系统,可以监控微服务间的调用延迟与链路关系。操作流程包括独立启动 Zipkin Server(JAR包方式),并在各个微服务模块中添加追踪依赖,最后在配置文件中指定Zipkin服务器地址及采样率。

2. 所遇问题与解决方法

在 Maven 中直接引入spring-cloud-starter-zipkin依赖时,报错提示"找不到依赖项"。此外,在测试链路时发现服务无法注册到 Eureka,控制台抛出 TransportException: Cannot execute request on any known server

针对版本兼容性问题,将过时的zipkin依赖替换为新标准的spring-cloud-starter-sleuth和spring-cloud-sleuth-zipkin组合。同时调整服务启动顺序,确保在启动微服务前先成功运行Eureka Server(7001端口),最终成功在Zipkin控制台中看到完整的调用链路图。

相关推荐
DianSan_ERP1 小时前
架构师视角:电商大促高并发下的订单API限流与防漏单架构演进
java·运维·网络·安全·微服务·架构·自动化
布朗克1682 小时前
40 Redis与微服务入门
java·数据库·redis·微服务
fajianchen1 天前
RBAC 模型与角色爆炸
微服务·权限管理
咖啡星人k1 天前
MonkeyCode 后端架构全解析:Go微服务如何支撑万级并发AI任务
微服务·架构·golang·monkeycode
无聊的老谢1 天前
电信系统中的单元测试策略:构建高可靠性的微服务防线
数据库·微服务·单元测试
惜缘破军1 天前
基于 Spring Boot 3 和 Spring Cloud 2023 的微服务基础框架 hdfk7-boot
spring boot·后端·微服务
LT10157974441 天前
2026年接口自动化测试平台选型指南:微服务高效测试工具
测试工具·微服务·架构
心之伊始1 天前
Dubbo 3 Consumer 调用链路源码分析:从 Proxy 到 Cluster、Directory、Router、LoadBalance
java·微服务·dubbo·源码分析·服务治理