# monster **Repository Path**: lyhome_admin/monster ## Basic Information - **Project Name**: monster - **Description**: 开发工具集与技术平台。 MQ代理、延时消息、分布式锁、动态网关 ... - **Primary Language**: Java - **License**: MIT - **Default Branch**: master - **Homepage**: https://gitee.com/lyhome_admin/monster - **GVP Project**: No ## Statistics - **Stars**: 8 - **Forks**: 1 - **Created**: 2023-07-18 - **Last Updated**: 2025-09-01 ## Categories & Tags **Categories**: message-server **Tags**: None ## README #### 介绍 开发工具集与技术平台系统 消息代理系统 > RocketMQ的客户端SDK代理。针对企业使用RocketMQ因没有相应语言的稳定SDK,且想通过RocketMQ进行系统通信的解决方案。 作者在2016年开发第一个应用于生产环境的程序,用于某上市互联网公司Java应用与PHP应用通过RocketMQ通信。后续还支持了某D轮互联网公司PHP&GO应用接入RocketMQ,单日峰值处理消息量 5000w+。 延时队列 > 基于Redisson封装的延时队列,和MQ spring starter包相同的丝滑开发体验。 * 发送消息 ```java DelayedQueueUtils.publish("testQueue", "data", 10, java.util.concurrent.TimeUnit.SECONDS); ``` * 消费消息 ```java @DelayedQueueListener(queueName = "test", consumeThreadNumber = 4) public class TestDelayedQueueListener implements DelayedQueueHandler { private final static Logger log = LoggerFactory.getLogger(TestDelayedQueueListener.class); @Override public void onMessage(String message) { log.info("redisson delay queue message {}", message); } } ``` 分布式锁 > 基于Redisson封装的分布式锁,注解式开发并通过SpEl表达式灵活控制锁粒度。 ```java // 方法一:通过工具类加锁保护 DistributeLockUtils.lockAndExecute("myLock", 10, TimeUnit.SECONDS, () -> { System.out.println("在这里执行你需要加锁保护的代码."); }); ``` ```java // 方法二:注解加在需要加锁保护的方法上 @GetMapping("/lock") @DistributeLock(lockPath = "#root.methodName+#p0.id+#p0.name+#p0.age", timeout = 10, leaseTime = 10) public R lock(TestParam param) { log.info("param {}", JSON.toJSONString(param)); return R.ok("success"); } ``` 动态网关 > 基于Gateway实现的网关,支持通过数据库配置路由,灰度发布,设备信息上报,IP/设备封禁等。 > 正在开发中 ## 软件架构 软件架构说明 * 消息代理管理后台:Ruoyi-Vue * 消息代理服务:SpringBoot Rocketmq-client Mybatis HttpClient ## 消息代理使用 ### 消息生产 1. 配置生产者代理 ![logo](doc/images/producer-edit.png) 2. 发送消息 > 通过HTTP请求代理服务接口实现消息发送 * 请求方式:POST application/json * 接口路径:/mq/proxy/sendMessage/sendSync * 入参: ```bash { "topic": "demo-topic", "tag": "tagA", "keys": "dfd434", //非必须字段 "message": "hello world", "producerGroupName": "demo-producer" } ``` * 接口返回: ```bash { "msg": "消息发送成功", "code": 200 } ``` 根据code值判断消息是否发送成功 ### 消息消费 1. 配置消费者代理 ![logo](doc/images/consumer-edit.png) 2. 消息消费 * 消费代理会根据配置将对应的消息发送到被代理系统的HTTP接口(配置的appUrl地址) 3. 被代理系统接口 > 例如:某PHP系统开发消息消费接口 * 请求方式:POST application/json * 接口路径:自定义,与配置的appUrl路径一致 * 入参: ```bash { "topic":"demo-topic", "tag":"tagA", "message":"hello world", "msgId":"DFDf434", "keys":"dfd434" } ``` 其中 message 为需要处理的消息内容,其他的是消息的属性信息,例如可以在发送消息时传递keys来做消息幂等性消费。 * 接口返回结果为简单的字符串 > 消费成功返回:SUCCESS > 消费失败返回:FAIL ## 部署文档 ### 前端应用 #### 开发 ```bash # 进入项目目录 cd admin-ui # 安装依赖 npm install # 建议不要直接使用 cnpm 安装依赖,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题 npm install --registry=https://registry.npmmirror.com # 启动服务 npm run dev ``` 浏览器访问 http://localhost:80 #### 发布 ```bash # 构建测试环境 npm run build:stage # 构建生产环境 npm run build:prod ``` ### 管理后台 #### 配置 monster-admin模块,src/main/resources中application-dev.yml ```bash # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 port: 8080 # 数据源配置 spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver druid: # 主库数据源 master: url: jdbc:mysql://127.0.0.1:3306/mq_proxy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: 123456 ``` ```bash # redis 配置 redis: # 地址 host: 127.0.0.1 # 端口,默认为6379 port: 6379 # 数据库索引 database: 0 # 密码 password: 123456 ``` > 数据库【与代理服务同库】 #### 服务启动 ```bash # 执行命令: java –jar monster-admin.jar ``` #### 多环境部署 例如:src/main/resources中新建application-prod.yml ```bash # 启动时,通过命令行参数的方式指定配置属性: java -jar monster-admin.jar --spring.profiles.active=prod ``` ### 消息代理服务 #### 配置 monster-mq-proxy模块,src/main/resources中application-dev.yml ```bash # 基础配置 mq: proxy: # RocketMQ NameServer地址 nameServer: 127.0.0.1:9876 # 开发环境配置 server: # 服务器的HTTP端口,默认为19876 port: 19876 # 数据源配置 spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver druid: # 数据源 master: url: jdbc:mysql://127.0.0.1:3306/mq_proxy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: 123456 ``` 配置RocketMQ NameServer地址,数据库【与管理后台同库】,服务端口。 #### 服务启动 ```bash # 执行命令: java –jar monster-mq-proxy.jar ``` #### 多环境部署 例如:src/main/resources中新建application-prod.yml ```bash # 启动时,通过命令行参数的方式指定配置属性: java -jar monster-mq-proxy.jar --spring.profiles.active=prod ``` * 部署多个monster-mq-proxy节点后,使用Nginx / 阿里云SLB等进行负载均衡 * 发送消息调用的接口地址使用Nginx / 阿里云SLB的地址 ## 交流 > 钉钉群:40650002839