一、 实验一: Spring Cloud Stream 消息驱动开发
1.什么是Spring Cloud Stream
- 官方定义Spring Cloud Stream是一个构建消息驱动微服务的框架。
2.实验环境准备(以 RabbitMQ为例)
- 启动RabbitMQ:以管理员身份运行cmd启动,执行命令rabbitmq-service start

- 打开浏览器,访问:http://localhost:15672,默认用户名和密码都是 guest

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控制台中看到完整的调用链路图。