【微服务学习笔记】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控制台中看到完整的调用链路图。

相关推荐
fanly113 天前
Surging AI Agent 完整产品介绍
微服务·microservice
蝎子莱莱爱打怪9 天前
XZLL-IM干货系列 04|Netty 长连接实战:Pipeline 怎么排、心跳怎么跳、连接怎么管
后端·微服务·面试
SamDeepThinking10 天前
Java微服务练习方式
java·后端·微服务
米丘13 天前
微前端之 Web Components 完全指南
微服务·html
霸道流氓气质16 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
霸道流氓气质16 天前
Spring Boot 微服务性能优化完全指南
spring boot·微服务·性能优化
地瓜伯伯16 天前
从MESI缓存一致性协议讲透synchronized的底层
java·spring boot·spring·spring cloud·微服务·springcloud
Devin~Y16 天前
大厂 Java 面试实录:从音视频内容社区到 AI RAG 的全链路技术设计
java·spring boot·redis·spring cloud·微服务·kafka·音视频
递归尽头是星辰16 天前
AI 访问数据仓库:从直连到微服务化
数据仓库·人工智能·微服务·dataagent·ai数据治理
就改了17 天前
Windows 环境 SkyWalking 完整实操教程
windows·微服务·skywalking