# yiwise-sms-gateway **Repository Path**: yiwise/yiwise-sms-gateway ## Basic Information - **Project Name**: yiwise-sms-gateway - **Description**: 一知短信网关 - **Primary Language**: Java - **License**: Unlicense - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 5 - **Forks**: 5 - **Created**: 2022-06-07 - **Last Updated**: 2025-09-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: 短信网关 ## README # 一知短信网关 ## 项目简介 该项目将常用短信协议CMPP进行封装,提供http接口发送短信,使用上只需要简单配置短信通道信息,即可快速发送短信;并提供了短信补发等功能。 ## 项目技术栈 Spring Boot + Mysql + Redis + Netty 4.x + Hutool 5.x + Mybatis-plus 3.x + Guava + Caffeine + Quartz等 ## 应用部署 1. 前提:本地服务器有公网IP,并安装了jdk 8(工程使用Oracle JDK,其他JDK需要自行适配),配置了mysql5.7 和 redis 2. 数据库初始化:执行resource/sql下的sms.sql文件创建数据库和表 3. 账号密码修改:修改prod.properties中Mysql和Redis的配置信息 4. 代码编译: ```bash mvn clean package -T 2C -Dmaven.test.skip=true -P prod ``` windows powershell 环境: ```bash mvn clean package -T 2C '-Dmaven.test.skip=true' -P prod ``` 得到打包文件: sms-gateway-quartz-1.0.0-SNAPSHOT.tar.gz sms-gateway-web-1.0.0-SNAPSHOT.tar.gz 这两个工程实现了短信接口和短信发送的分离。 其中: sms-gateway-web用于实现http短信接口调用,监听http的8925端口; sms-gateway-quartz用于短信发送的调度。监听http的8926端口; 8926端口的值可以自行调整,实际业务上用不到,只是因为springboot启动需要指定端口。 5. 将打包文件拷贝到服务器上,解压运行: 启动命令:```sh bin/start.sh start``` 停止命令:```sh bin/start.sh stop``` 6. 或者使用docker部署,在完成1-4步骤后,执行如下操作: + 构建java基础镜像: ```bash cd docker.java-base docker build -t java-base:1.0.0 ./ ``` + 构建sms-gateway-web镜像: ```bash cd sms-gateway-web/target docker build -t sms-gateway-web:1.0.0 ./ ``` + 构建sms-gateway-quartz镜像: ```bash cd sms-gateway-quartz/target docker build -t sms-gateway-quartz:1.0.0 ./ ``` + 运行 sms-gateway-web 镜像 ```bash docker run -d -it --name sms-gateway-web -p 8925:8925/tcp sms-gateway-web:1.0.0 ``` + 运行 sms-gateway-quartz 镜像 ```bash docker run -d -it --name sms-gateway-quartz -p 8926:8926/tcp sms-gateway-quartz:1.0.0 ``` 7. 部署GUI管理页面,可以参考:[https://gitee.com/yiwise/yiwise-sms-control-panel](https://gitee.com/yiwise/yiwise-sms-control-panel) ## 服务器配置说明 挂机短信场景(发送速率100~200)推荐如下的服务器资源配置: | 服务名称 | 服务器推荐规格 | 数量 | 服务说明 | |:------------------:|--------------------------------------------------------------:|:----:|:---------------------------:| | sms-gateway-quartz | 4c8g,磁盘500G,带宽20Mbps | 1 | 包含短信发送能力,需要和供应商通道链接 | | sms-gateway-web | 2c4g, 磁盘300G,无需访问公网 | 2 | 提供http短信发送接口 | | 负载均衡 | qps>=100 | 1 | 为sms-gateway-web的http接口负载均衡 | | mysql | 4c8g,磁盘500G | 1 | 存储短信发送和回调记录 | | redis | 内存4g | 1 | 存储短信发送中间结果记录 | | 管理页面 | 无 | 1 | 性能要求很低,可以和其它服务器资源共用 | 群发场景(发送速率1000~2000)推荐如下的服务器资源配置: | 服务名称 | 服务器推荐规格 | 数量 | 服务说明 | |:------------------:|:---------------------------------------------------:|:----:|:---------------------------:| | sms-gateway-quartz | 8c16g,磁盘500G,带宽50Mbps | 1 | 包含短信发送能力,需要和供应商通道链接 | | sms-gateway-web | 2c4g, 磁盘300G,无需访问公网 | 2 | 提供http短信发送接口 | | 负载均衡 | qps>=1000 | 1 | 为sms-gateway-web的http接口负载均衡 | | mysql | 8c16g,磁盘500G | 1 | 存储短信发送和回调记录 | | redis | 内存8g | 1 | 存储短信发送中间结果记录 | | 管理页面 | 无 | 1 | 性能要求很低,可以和其它服务器资源共用 | ## 配置项说明 ### 速率控制 短信网关将短信发送的过程,以流水线的方式执行,分为解密、发送、发送响应处理、回执响应处理、回执信息落库,回调等几个阶段,每个阶段都有单独的线程池来负责,会开放出工作线程数量的配置项; 此外,对于数据库操作,为了减少io,加快处理速度,短信数据用了批处理sql操作,会开放出每批数据的数量的配置项; 一般说来,线程数量越多,每批处理的数据量越多,短信发送速率越快,但是对服务器和数据库的资源消耗也越大;需要结合服务器的实际情况合理调优: | 配置项名称 | 配置项说明 | |:-----------------------:|--------------------------------------------:| | sms.decrypt.thread-num | 解密线程数量 | | sms.decrypt.batch-size | 解密批量写库时每批数量 | | sms.decrypt.save-plain | 数据库是否保存解密后的真实号码,1-是(默认),0-否(AES加密存储) | | sms.decrypt.notify | 导入完成后,发起解密通知,1-开启(默认),0-关闭 | | sms.send.thread-num | 发送线程数量 | | sms.send.batch-size | 发送批量写库时每批数量 | | sms.send.notify | 解密批量完成后,发起发送通知,1-开启(默认),0-关闭 | | sms.submit.thread-num | 发送响应处理线程数量(处理SubmitResponse消息) | | sms.report.thread-num | 回执的处理线程数量(处理DeliverRequest消息,含上行短信,处理过程不写库) | | sms.report.batch-size | 回执批量写库时每批数量 | | sms.flush.thread-num | 回执写库线程数量 | | sms.callback.thread-num | 回调线程数量(http方式回调给一知或第三方平台) | | sms.callback.batch-size | 回调批量写库时每批数量 | | sms.callback.notify | 回执落库完成后,发起回调通知,1-开启(默认),0-关闭 | ### 回执重试 短信网关处理通道消息时,通道消息是乱序返回的,有可能会出现回执匹配不到发送消息的情况,这种情况下,回执会被暂存起来并延迟30秒后重试,默认开启,但对性能有一定的影响: | 配置项名称 | 配置项说明 | |:----------------------:|------------------------------------------------------:| | sms.report.retry | 1表示开启,0表示关闭 | ### redis全局前缀 如果有部署多个短信网关实例的需求,又希望多个短信网关共用一个redis服务,因此短信网关支持配置redis的全局前缀便于区分: | 配置项名称 | 配置项说明 | |:------:|-----------------------------------------------------:| | redis.global-prefix | 不配置的话,默认为空字符串 | ### 解密接口 号码解密默认通过调用外部http接口完成,可以将接口url配置到配置项中: | 配置项名称 | 配置项说明 | |:------:|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:| | rest.decrypt.url | 默认值为示例接口: http://localhost:8925/api/mock/getRealNumber, 对应的实现在MockDecryptController这个类中,需要参考接口规范自行实现, 如果不能支持接口调用,需要自己实现解密服务的话,只需要重新实现PhoneConvertService,并将BatchDecryptServiceImpl中的phoneConvertService对象进行替换即可; | ## sms-gateway-web接口说明 1. MockDecryptController下的/api/mock/getRealNumber提供了示例的解密接口实现,可以作为参考实现,入参和出参需要和该接口保持一致,接口url配置到rest.decrypt.url配置项即可; 2. SmsController下的接口内容如下: | 接口名称 | 接口说明 | |:------------------------------:|--------------------:| | /sms/sendMsg | 发送加密号码短信 | | /sms/sendMsgMock | 无通道场景下,模拟发送加密号码短信 | | /sms/sendPlainMsg | 发送真实号码短信 | | /sms/sendMsgBatch | 批量发送加密号码短信 | | /sms/sendMsgBatchMock | 无通道场景下,模拟批量发送加密号码短信 | | /sms/sendPlainMsgBatch | 批量发送真实号码短信 | 3. 工程提供了调用接口的单元测试类:SendMsgTest,可以用来调试接口排查问题; ## sms-gateway-quartz接口说明 1. 配置项接口: | 接口名称 | 接口说明 | |:------------:|-----------------------------------------------------------------------------------------------------:| | /config/list | 查看可调的配置项列表:curl "http://127.0.0.1:8926/config/list" | | /config/get | 查看单个配置项:curl "http://127.0.0.1:8926/config/get?name=sms.flush.thread-num" | | /config/set | 修改单个配置项:curl -X POST "http://127.0.0.1:8926/config/set" --data 'name=sms.submit.thread-num&value=8' | 注意:/config/set修改配置项仅在内存中有效,重启应用后,配置项会被重置,如果需要持久化的话,需要在配置文件中同步调整; 2. 监控接口: | 接口名称 | 接口说明 | |:------------:|---------------------------------------------------------------:| | /monitor/speed | 查看各个阶段的速率情况: curl "http://127.0.0.1:8926/monitor/speed" | | /monitor/threadQueueInfo | 查看线程池堆积情况:curl "http://127.0.0.1:8926/monitor/threadQueueInfo" | ## 感谢 项目是在 [cmpp-to-http](https://gitee.com/troubleshooting/cmpp-to-http) 和 [SMSGate](https://github.com/Lihuanghe/SMSGate) 基础上开发的,感谢开源!