From 6fcf7a4b758523d85e80b58971a8b000ee3dcc4e Mon Sep 17 00:00:00 2001 From: bunny <1319900154@qq.com> Date: Tue, 20 May 2025 11:07:36 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E9=9B=86=E7=BE=A4=E7=8E=AF?= =?UTF-8?q?=E5=A2=83-=E8=B4=9F=E8=BD=BD=E5=9D=87=E8=A1=A1=E5=AE=8C?= =?UTF-8?q?=E6=88=90;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mq-demo/ReadMe.md | 153 +++++- mq-demo/images/image-20250520105109623.png | Bin 0 -> 18923 bytes mq-demo/images/image-20250520105125396.png | Bin 0 -> 13490 bytes mq-demo/images/image-20250520105149567.png | Bin 0 -> 7416 bytes .../mq/mqdemo/controller/IndexController.java | 20 + .../listener/ClusterEnvironmentListener.java | 25 + .../mq/listener/MessageListenerOrder.java | 31 +- .../src/main/resources/application-dev.yml | 4 +- .../src/main/resources/templates/dialog.html | 480 ++++++++++++++++++ .../mq/mqdemo/ClusterEnvironmentTest.java | 23 + 10 files changed, 704 insertions(+), 32 deletions(-) create mode 100644 mq-demo/images/image-20250520105109623.png create mode 100644 mq-demo/images/image-20250520105125396.png create mode 100644 mq-demo/images/image-20250520105149567.png create mode 100644 mq-demo/src/main/java/cn/bunny/mq/mqdemo/controller/IndexController.java create mode 100644 mq-demo/src/main/java/cn/bunny/mq/mqdemo/mq/listener/ClusterEnvironmentListener.java create mode 100644 mq-demo/src/main/resources/templates/dialog.html create mode 100644 mq-demo/src/test/java/cn/bunny/mq/mqdemo/ClusterEnvironmentTest.java diff --git a/mq-demo/ReadMe.md b/mq-demo/ReadMe.md index 5f631d3..2eae681 100644 --- a/mq-demo/ReadMe.md +++ b/mq-demo/ReadMe.md @@ -615,6 +615,8 @@ void buildExchangeOverflowTest() { > > - 最大延迟时间:**2天(48小时)** > - 必须匹配RabbitMQ版本 +> +> **插件版本必须与RabbitMQ严格匹配(如3.13.x需使用v3.13.x插件)。** #### 1、确认docker数据卷 @@ -746,8 +748,8 @@ try { --- -### **2. 生产环境推荐方案** -#### **(1)Confirm 模式(轻量级确认)** +### 生产环境推荐方案 +#### (1)Confirm 模式(轻量级确认) - **原理**:异步确认消息是否成功到达 Broker。 - **配置方式**: ```java @@ -763,14 +765,14 @@ try { ``` - **优点**:性能接近非事务模式,可靠性高。 -#### **(2)消息补偿 + 幂等设计** +#### (2)消息补偿 + 幂等设计 - **步骤**: 1. 消息表记录发送状态(如 `status: sending/success/fail`)。 2. 定时任务补偿失败消息。 3. 消费者端做幂等处理(如唯一 ID + 去重表)。 - **适用场景**:订单支付、库存扣减等关键业务。 -#### **(3)本地消息表(最终一致性)** +#### (3)本地消息表(最终一致性) ```mermaid sequenceDiagram participant App @@ -852,6 +854,8 @@ channel.queueDeclare("myLazyQueue", true, false, false, args); ## 优先级队列 +**优先级仅在消息堆积时生效(空队列时无意义)** + **优先级范围** - 通过 `x-max-priority` 参数定义队列支持的最大优先级(默认0=无优先级) @@ -949,6 +953,8 @@ public void processMessagePriority(String dataString, Channel channel, Message m > [!IMPORTANT] > > 如果需要修改,记得修改网关和IP地址。 +> +> 节点间端口要求(如4369/25672需互通),避免防火墙问题.。 看自己是否有这个需求。 @@ -1014,7 +1020,6 @@ sudo systemctl daemon-reload && sudo systemctl restart docker > # 3. 重建目录并设置权限 > mkdir -p ~/docker/docker_data/rabbitmq/{rabbit1,rabbit2,rabbit3}/{data,conf,log} > sudo chown -R 999:999 ~/docker/docker_data/rabbitmq -> sudo chmod -R 775 ~/docker/docker_data/rabbitmq > > # 4. 重新启动 > docker compose up -d @@ -1253,6 +1258,14 @@ sudo vim /etc/hosts #### 3、设置Erlang Cookie +> [!IMPORTANT] +> +> 普通方式搭建集群时,`.erlang.cookie`的权限必须为`400` +> +> ```bash +> sudo chmod 400 /var/lib/rabbitmq/.erlang.cookie +> ``` + RabbitMQ节点使用Erlang cookie进行认证,所有节点必须使用相同的cookie。 如果是克隆的虚拟机,可以不检查(最好还是检查下),因为克隆的基本上是一样的。 @@ -1270,8 +1283,8 @@ sudo systemctl stop rabbitmq-server sudo nano /var/lib/rabbitmq/.erlang.cookie # 粘贴主节点的cookie内容 -# 然后设置正确的权限 sudo chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie +# 然后设置正确的权限 sudo chmod 400 /var/lib/rabbitmq/.erlang.cookie # 重新启动RabbitMQ服务 @@ -1353,6 +1366,14 @@ sudo rabbitmqctl status - 如果需要Web管理界面: +> [!IMPORTANT] +> +> 如果使用Web界面,需要在每个集群上都执行一下,否则情况会出现下面情况,举个例子。 +> +> 如果在主节点上执行,那么主节点可以访问,之后输入账户密码登录之后可以看到主节点的情况,但是其余节点会出现【Node statistics not available】。 +> +> 为了避免这种情况,要在每个节点上都执行一下下面的命令。 + ```bash sudo rabbitmq-plugins enable rabbitmq_management ``` @@ -1470,26 +1491,26 @@ sudo cat /var/lib/rabbitmq/.erlang.cookie 1. 停止 RabbitMQ: - ``` + ```bash sudo systemctl stop rabbitmq-server ``` 2. 修改 Cookie(复制主节点的 Cookie 到其他节点): - ``` + ```bash echo "YOUR_MASTER_NODE_COOKIE" | sudo tee /var/lib/rabbitmq/.erlang.cookie ``` 3. 设置权限: - ``` + ```bash sudo chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie sudo chmod 400 /var/lib/rabbitmq/.erlang.cookie ``` 4. 重启 RabbitMQ: - ``` + ```bash sudo systemctl start rabbitmq-server ``` @@ -1501,14 +1522,14 @@ sudo cat /var/lib/rabbitmq/.erlang.cookie 确保用户在所有节点都有 **管理员权限**: -``` +```bash sudo rabbitmqctl set_user_tags administrator sudo rabbitmqctl set_permissions -p / ".*" ".*" ".*" ``` 例如: -``` +```bash sudo rabbitmqctl set_user_tags admin administrator sudo rabbitmqctl set_permissions -p / admin ".*" ".*" ".*" ``` @@ -1516,3 +1537,111 @@ sudo rabbitmqctl set_permissions -p / admin ".*" ".*" ".*" **情况五 管理界面缓存问题** 浏览器可能缓存了旧数据,导致显示异常。 + +### 集群环境-负载均衡 + +#### 1. 安装 HAProxy +```bash +sudo apt update +sudo apt install haproxy -y +``` + +#### 2. 配置 HAProxy +编辑 HAProxy 的配置文件 `/etc/haproxy/haproxy.cfg`: +```bash +sudo vim /etc/haproxy/haproxy.cfg +``` +添加以下内容(假设 RabbitMQ 节点为 `rabbit1:5672` 和 `rabbit2:5672`): + +> [!IMPORTANT] +> +> 绑定的端口号(`bind *:`)不能重复!!! + +```ini +frontend rabbitmq_front + bind *:22222 + mode tcp + default_backend rabbitmq_back + +backend rabbitmq_back + mode tcp + balance roundrobin + # 在之前设置了hosts文件,所以这里没有写端口号 == server rabbit1 192.168.3.144:5672 check + server rabbit1 rabbit1:5672 check + server rabbit2 rabbit2:5672 check + server rabbit3 rabbit3:5672 check + server rabbit4 rabbit4:5672 check + +# 可选:启用 RabbitMQ 管理界面的负载均衡(默认端口 15672) +frontend rabbitmq_admin + bind *:12222 + mode http + default_backend rabbitmq_admin_back + +backend rabbitmq_admin_back + mode http + balance roundrobin + # 在之前设置了hosts文件,所以这里没有写端口号 == server rabbit1 192.168.3.144:15672 check + server rabbit1 rabbit1:15672 check + server rabbit2 rabbit2:15672 check + server rabbit3 rabbit3:15672 check + server rabbit4 rabbit4:15672 check +``` + +#### 3. 重启 HAProxy + +> [!TIP] +> +> 重启报错可以看下报错内容: journalctl -xeu haproxy.service +> +> 如果使用一些远程软件,修改时可能会出现,多行配置变一行问题,需要手动通过vim查看。 + +```bash +sudo systemctl restart haproxy +``` +### 集群环境的连接 + +> [!NOTE] +> +> 如果是新建环境,需要将之前写的监听内容注释,否则启动容易报错。 + +使用Java程序进行连接。如果搭建了集群环境还配置了负载均衡,就是用负载均衡的方式进行连接。 + +负载均衡配置的是端口是:`5672`对应上面的文件是`22222`。所以在连接时候是`22222`这个 端口(参考【2. 配置 HAProxy】) + +#### Java配置 + +```yaml +# application.yaml +rabbitmq: + host: ${bunny.rabbitmq.host} + port: ${bunny.rabbitmq.port} + username: ${bunny.rabbitmq.username} + password: ${bunny.rabbitmq.password} + virtual-host: ${bunny.rabbitmq.virtual-host} + +# application-dev.yaml +bunny: + rabbitmq: + host: 192.168.3.144 + # port: 5672 + # 集群环境的端口号 + port: 22222 + virtual-host: / + username: admin + password: admin +``` + +#### 创建环境 + +**交换机:**exchange.cluster.test + +![image-20250520105125396](./images/image-20250520105125396.png) + +**队列:**queue.cluster.test + +![image-20250520105109623](./images/image-20250520105109623.png) + +**路由键:**routing.key.cluster.test + +![image-20250520105149567](./images/image-20250520105149567.png) diff --git a/mq-demo/images/image-20250520105109623.png b/mq-demo/images/image-20250520105109623.png new file mode 100644 index 0000000000000000000000000000000000000000..e2bb3d3a67da1e0b49c9b18a1d07dfb93240c2d3 GIT binary patch literal 18923 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", dataString); + } +} diff --git a/mq-demo/src/main/java/cn/bunny/mq/mqdemo/mq/listener/MessageListenerOrder.java b/mq-demo/src/main/java/cn/bunny/mq/mqdemo/mq/listener/MessageListenerOrder.java index 8738c7b..f61fcac 100644 --- a/mq-demo/src/main/java/cn/bunny/mq/mqdemo/mq/listener/MessageListenerOrder.java +++ b/mq-demo/src/main/java/cn/bunny/mq/mqdemo/mq/listener/MessageListenerOrder.java @@ -1,15 +1,8 @@ package cn.bunny.mq.mqdemo.mq.listener; -import com.rabbitmq.client.Channel; import lombok.extern.slf4j.Slf4j; -import org.springframework.amqp.core.Message; -import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; -import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.Date; - @Component @Slf4j public class MessageListenerOrder { @@ -81,17 +74,17 @@ public class MessageListenerOrder { // channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); // } - /* 测试延迟消息 */ - @RabbitListener(queues = "queue.test.delay") - public void processMessageDelay(String dataString, Channel channel, Message message) throws IOException, InterruptedException { - log.info("<延迟消息>----消息本身{}", dataString); - log.info("<延迟消息>----当前时间{}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); - } - - /* 测试优先级队列 */ - @RabbitListener(queues = "queue.test.priority") - public void processMessagePriority(String dataString, Channel channel, Message message) throws IOException, InterruptedException { - log.info("<<优先级队列>>----{}", dataString); - } + // /* 测试延迟消息 */ + // @RabbitListener(queues = "queue.test.delay") + // public void processMessageDelay(String dataString, Channel channel, Message message) throws IOException, InterruptedException { + // log.info("<延迟消息>----消息本身{}", dataString); + // log.info("<延迟消息>----当前时间{}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + // } + // + // /* 测试优先级队列 */ + // @RabbitListener(queues = "queue.test.priority") + // public void processMessagePriority(String dataString, Channel channel, Message message) throws IOException, InterruptedException { + // log.info("<<优先级队列>>----{}", dataString); + // } } diff --git a/mq-demo/src/main/resources/application-dev.yml b/mq-demo/src/main/resources/application-dev.yml index 22c3674..4513150 100644 --- a/mq-demo/src/main/resources/application-dev.yml +++ b/mq-demo/src/main/resources/application-dev.yml @@ -4,7 +4,9 @@ server: bunny: rabbitmq: host: 192.168.3.144 - port: 5672 + # port: 5672 + # 集群环境的端口号 + port: 22222 virtual-host: / username: admin password: admin diff --git a/mq-demo/src/main/resources/templates/dialog.html b/mq-demo/src/main/resources/templates/dialog.html new file mode 100644 index 0000000..5a501ed --- /dev/null +++ b/mq-demo/src/main/resources/templates/dialog.html @@ -0,0 +1,480 @@ + + + + + + 优雅的Bootstrap弹窗表单 + + + + + +
+
+
+

优雅的Bootstrap弹窗示例

+

点击下方按钮查看带有表单验证的现代化弹窗

+ +
+
+
+ + +
+
+
+
+
+ 用户注册 +
+ +
+
+
+
+ + +
请输入有效的用户名(4-20个字符)
+
用户名可用
+
+ +
+ + +
请输入有效的电子邮箱地址
+
邮箱格式正确
+
+ +
+ + +
密码至少需要8个字符
+
+
+
+
+ +
+ + +
密码不匹配
+
+ +
+
+ + +
必须同意条款才能继续
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/mq-demo/src/test/java/cn/bunny/mq/mqdemo/ClusterEnvironmentTest.java b/mq-demo/src/test/java/cn/bunny/mq/mqdemo/ClusterEnvironmentTest.java new file mode 100644 index 0000000..1ef34e5 --- /dev/null +++ b/mq-demo/src/test/java/cn/bunny/mq/mqdemo/ClusterEnvironmentTest.java @@ -0,0 +1,23 @@ +package cn.bunny.mq.mqdemo; + +import org.junit.jupiter.api.Test; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +public class ClusterEnvironmentTest { + + @Autowired + private RabbitTemplate rabbitTemplate; + + /* 集群环境下消息 */ + @Test + void clusterTest() { + for (int i = 0; i <= 10; i++) { + rabbitTemplate.convertAndSend("exchange.cluster.test", + "routing.key.cluster.test", + "集群环境下消息-" + i); + } + } +}