如何设计一个短信发送功能

news2024/10/6 16:20:22

本文主要分享了如何设计一个发送短信功能。

一、总结简述

1.梳理多个平台短信API的发送参数,集成封装提供统一的API,支持多个短信平台(阿里云、腾讯云、百度云、京东云、七牛云)灵活切换

2.提供存储方案,表结构设计

3.提供真实生产项目代码案例,实现异步机制、定时发送、超时取消发送等功能

4.文末提供代码仓库,有兴趣的小伙伴可以fork代码

二、架构图

三、代码实现(渠道SDK封装)

1.短信抽象核心代码(项目:sms-sender-core)

1)抽象短信发送器,定义一个接口

2)以阿里云短信对接实现类为demo的代码展示,其他渠道代码类似,当然也可以增加自定义渠道实现,实现SmsSender的接口即可(可通过gitee查看源码)

3)阿里云短信封装SmsClient核心代码

2.简化项目sms-sender-core的引用,springboot自动装配(项目:sms-sender-spring-boot-starter)

1)这里就只展示SmsSenderAutoConfiguration的代码,其他的可以通过gitee查看源码

简单的短信代码SDK封装到此结束,但在我们实际项目开发是远不够的。实际项目中还需要考虑存储方案、异步机制、定时发送、超时取消发送、失败重试机制、渠道切换等。

四、代码实现(项目实际应用)

1.数据库表结构设计

CREATE TABLE `sms_type_template_config` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
  `type` varchar(16) NOT NULL COMMENT '业务类型(verifycode:验证码,market:营销活动,tips:提示信息)',
  `channel` varchar(16) NOT NULL COMMENT '发送渠道(log:打印日志(测试),ali:阿里云,tencent:腾讯云)',
  `template_code` varchar(32) NOT NULL COMMENT '模板编码',
  `remark` varchar(255) DEFAULT NULL COMMENT '备注',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `uniq_type_channel` (`type`,`channel`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='短信业务-模板配置';

CREATE TABLE `sms_template` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
  `channel` varchar(16) NOT NULL COMMENT '发送渠道(log:打印日志(测试),ali:阿里云,tencent:腾讯云)',
  `template_code` varchar(32) NOT NULL COMMENT '模板编码',
  `template_content` varchar(255) DEFAULT NULL COMMENT '模板内容',
  `remark` varchar(255) DEFAULT NULL COMMENT '备注',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `uniq_channel_templatecode` (`channel`,`template_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='短信模板';

CREATE TABLE `sms_task` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
  `type` varchar(16) NOT NULL COMMENT '业务类型(verifycode:验证码,market:营销活动,tips:提示信息)',
  `plan_send_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '计划发送时间',
  `over_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '超时取消发送时间',
  `remark` varchar(255) DEFAULT NULL COMMENT '备注',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_type` (`type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='短信发送任务';

CREATE TABLE `sms_task_detail` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
  `task_id` int(11) unsigned NOT NULL COMMENT 'sms_task.id',
  `mobile` varchar(11) NOT NULL COMMENT '手机号码',
  `template_param_json` varchar(255) DEFAULT NULL COMMENT '模板参数json',
  `plan_send_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '计划发送时间',
  `actual_send_time` datetime DEFAULT NULL COMMENT '实际发送时间',
  `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '状态(1:待发送,2:待定时发送,11:发送MQ成功,12:MQ消费成功,21:请求成功,22:请求失败,31:取消发送)',
  `content` varchar(255) DEFAULT NULL COMMENT '短信内容',
  `remark` varchar(255) DEFAULT NULL COMMENT '备注',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_taskid` (`task_id`),
  KEY `idx_mobile` (`mobile`),
  KEY `idx_plansendtime_status` (plan_send_time,`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='短信发送任务明细';

CREATE TABLE `sms_record` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
  `channel` varchar(16) NOT NULL COMMENT '发送渠道(log:打印日志(测试),ali:阿里云,tencent:腾讯云)',
  `mobile` varchar(11) NOT NULL COMMENT '手机号码',
  `sign_name` varchar(12) NOT NULL COMMENT '短信签名(2~12个字符),如:【XX公司】,【】不用填写',
  `template_code` varchar(32) NOT NULL COMMENT '模板编码',
  `template_param_json` varchar(255) DEFAULT NULL COMMENT '模板参数json',
  `content` varchar(255) DEFAULT NULL COMMENT '短信内容',
  `result` varchar(8) NOT NULL COMMENT '结果(success:成功,fail:失败)',
  `message` varchar(255) DEFAULT NULL COMMENT '信息',
  `request_id` varchar(64) DEFAULT NULL COMMENT '请求ID',
  `remark` varchar(255) DEFAULT NULL COMMENT '备注',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_mobile` (`mobile`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='短信发送记录';

表说明:

sms_type_template_config:主要是记录业务类型与模板编码的关系,这样可以避免在代码中写死模板编码,因为不同的渠道模板编码也会不一致

sms_template:配置不同渠道的短信模板

sms_task、sms_task_detail:短信任务,可以理解为每次发送短信都是1个短信任务,每个短信任务可以给多个用户发送短信,营销短信常用,支持即时发送和定时发送

sms_record:短信发送记录,最终调用完发送短信API记录(不代表一定发送成功,部分渠道平台还提供了查询发送状态的API,如果需要了解最终状态需要增加状态API的查询

数据样例说明:

短信业务-模板配置

1)代码中会写死type,跟据type+channel查询到template_code

短信模板

1)跟据channel+template_code查询到template_content

为什么要记录模板内容?

1)其实template_content一般是不需要传递给第三方API的,大部分都是通过“模板编码+短信参数”的方式来发送短信,但也有部分渠道API有特殊情况,直接通过“短信内容”来发送

2)运营人员在发送营销短信时需要在管理后台能看到短信模板

3)短信的实际内容是需要保留存储的,而渠道API一般都不会返回实际发送内容,只能由程序拼凑

短信发送记录

2.将sms_type_template_config、sms_template都做成后台配置功能,这里就不细讲了

3.核心代码展示

1)项目结构

2)生产者核心代码

3)消费者核心代码

补充:失败重试机制(可利用template-tool下的innercallback代码实现)、渠道切换尚未实现,后续有时间再补充!!!

怎么样?如果你觉得有用的话,还不快快收藏起来!!!

附:涉及的代码目录

github: GitHub - 897665787/sms-sender: 一个封装了短信发送的框架,支持阿里云短信、腾讯云短信等。、GitHub - 897665787/springcloud-template: 一个基于springcloud netflix微服务框架,记录了关于微服务开发的一些最佳应用,欢迎大家学习指导。

gitee:sms-sender: 一个封装了短信发送的框架,支持阿里云短信、腾讯云短信等。、springcloud-template: 一个基于springcloud netflix微服务框架,记录了关于微服务开发的一些最佳应用,欢迎大家学习指导。


sms-sender
├── sms-sender-core -- 核心代码
     └── ali -- 阿里云
     └── baidu -- 百度云
     └── jingdong -- 京东云
     └── log -- 测试渠道(一般用于测试环境不想真正的发送短信,短信可是要收费的)
     └── qiniu-- 七牛云
     └── tencent -- 腾讯云
└── sms-sender-boot-starter -- 整合springboot代码
└── sms-sender-jdbc-spring-boot-starter -- 整合springboot代码,增加了jdbc存储方案,自动创建表短信模板(sms_template)、短信发送记录(sms_record)2张表
     └── processor
          └── SqlSendPostProcessor -- jdbc存储实现
└── sms-sender-springboot-demo -- 在springboot中使用sms-sender的demo代码

springcloud-template
└── template-tool
     └──controller
          └── SmsController -- 短信任务轮询API
          └── VerifyCodeController -- 验证码短信发送demo
     └── sms
          └── AsyncSmsSender -- 异步发送短信,MQ生产者逻辑
          └── MysqlSendPostProcessor -- 记录短信发送记录
          └── SmsSenderConsumer -- 异步发送短信,MQ消费者逻辑
└── sql
     └── tool
          └── 短信设计相关表.sql

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/679990.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis数据库操作

Redis 命令参考 — Redis 命令参考http://doc.redisfans.com/ 1、Redis,远程词典服务器,是一个基于内存的键值型NoSQL数据库 特征: 键值型,支持多种不同数据结构,功能丰富 单线程,每个命令具备原子性 …

C语言督学营(中级阶段)

文章目录 中级阶段9.数据结构概述逻辑结构 与 存储结构时间复杂度、空间复杂度 10.11.12.线性表 (代码实战)线性表的定义、特点1.线性表的顺序存储(顺序表示):顺序表静态分配动态分配顺序表的定义、初始化、插入、删除、按值查找、按位查找 操作 (代码):…

go开发多云资产管理平台

go开发多云资产管理平台cmdb 代码仓库github.com/yunixiangfeng/gocmdb 云主机管理 主机资源监控 开发流程 Welcome to Beego | Beego bee new gocmdb/servercd gocmdb/servergo mod tidygo get -u github.com/beego/beego/v2 go get -u "github.com/astaxie/beego/o…

津津乐道设计模式 - 模版模式详解(以女友化妆流程带你彻底明白)

🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Micro麦可乐的博客 🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战 🌺《RabbitMQ》…

JDBC-->java如何连接数据库(详细版小白必备)

个人名片: 🐅作者简介:一名大二在校生,热爱生活,爱好敲码! \ 💅个人主页 🥇:holy-wangle ➡系列内容: 🖼️ tkinter前端窗口界面创建与优化 &…

工业相机——显微镜头/放大镜头

校准尺,最小测量刻度为0.1mm 上图为手机拍的看不清,放了一个网上找的图,校准的详细参数见下图 例如:物距为116mm的显微镜头,这种镜头没有景深,只能测镜头前端到物体116mm的物体 ,几乎没有景深&a…

Vscode配置C/C++环境出现报错,导致不能运行代码,报错如下:

Vscode配置C/C环境出现报错,导致不能运行代码,报错如下: 问题描述—gcc : 无法将“gcc”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次…

Hexo博客搭建 —— Next主题配置

Hexo博客搭建 —— Next主题配置 文章目录 Hexo博客搭建 —— Next主题配置配置文件区分站点配置文件主题配置文件 配置文件描述简称引入next主题-sitenext主题页面模式设置-next设置首页不显示全文-site设置博客文章持久化连接-site下载插件URL Setting 参考文档 配置文件区分…

【Docker】一文了解DockerFile

文章目录 Dockerfile 概念DockerFile的指令1、FROM 指定基础镜像2、RUN 执行命令3、COPY 复制文件4、ADD 更高级的复制文件5、ENV 设置环境变量6、EXPOSE7、VOLUME 定义匿名卷8、CMD容器启动命令9、ENTRYPOINT入口点10、USER 指定当前用户11、WORKDIR 指定工作目录12、LABEL为镜…

网络安全、Web安全、渗透测试之笔经面经总结含答案

以下为网络安全各个方向涉及的面试题,星数越多代表问题出现的几率越大,祝各位都能找到满意的工作。 注:本套面试题,已整理成pdf文档,但内容还在持续更新中,因为无论如何都不可能覆盖所有的面试问题&#xf…

4、数据库操作语句:聚合函数

目录 1、定义 2、常用的聚合函数 1)Avg/sum:只适用于数值类型的字段(或变量)。 2)Max/min:适用于数值类型、字符串类型、日期时间类型的字段(或变量) 3)Count: ①作…

一起来学孟德尔随机化(Mendelian Randomization)

孟德尔随机化最近实在是太火了,想不关注都不行,最近也花了点时间研究了一下,和大家分享一下,共同学习。 什么是孟德尔随机化? 在19世纪,孟德尔用豌豆花作为实验材料,通过对豌豆花颜色、形状等特…

ESP-BOX的GUI移植

因为squareline studio软件中适配了ESP-BOX,所以作者本想直接使用该软件创建的工程,但是会出现花屏的现象,也不知道是不是没有做好esp-box-lite的适配。 因此只能先用squareline studio设计好GUI,然后再导出其代码,在其…

jmeter-13-使用JSR223断言(推荐)

文章目录 前言一、JSR 223 进行断言二、总结 前言 之前都在使用 BeanShell 前后置、断言等,但是查看官方文档时发现推荐使用 JSR223 其实 BeanShell 是 JSR223 里面的一种,下面我们继续了解下。 官网介绍:Apache JMeter - User’s Manual: C…

【数据分享】1929-2022年全球站点的逐月平均露点数据(Shp\Excel\12000个站点)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、能见度等指标,说到气象数据,最详细的气象数据是具体到气象监测站点的数据! 对于具体到监测站点的气象数据,之前我们分享过1929-2022年全球气象…

ffmpeg+nginx-rtmp转发视频流

本篇博客最早发布于实验室公共博客,但已无人维护,现迁移至个人博客 nginx与nginx-rtmp-module安装 画了好几天图,实在有些乏力,找点有意思的事情做做 觉得视频流传输挺有意思,B站找了些视频,但感觉有些大…

【论文简述】IS-MVSNet:Importance Sampling-based MVSNet(ECCV 2022)

一、论文简述 1. 第一作者:Likang Wang 2. 发表年份:2022 3. 发表期刊:ECCV 4. 关键词:MVS、3D重建、重要性采样、无监督误差分布估计 5. 探索动机:以粗到细的方式预测深度图,部分缓解了对于分辨率的限…

Apache James邮件服务器搭建(linux)

1、配置jdk,此处不再赘述,随便搜一下然后照着操作即可 注意:后续james的版本是3.5.0,需要与jdk8配套 2、下载apache james ,apacheJames 下载之后可以直接运行,无需安装 注意:此处选择3.5.0版…

人工智能数据集处理——数据清理1

目录 一、概述 二、缺失值 1、检测缺失值 使用isna() 方法检测na_df中是否存在缺失值 使用natna() 方法 2、缺失值的处理 (1) 删除缺失值 使用删除dropna() 方法删除na_df 对象中缺失值所在的一行数据 删除全为缺失值的行 删除有缺失值的行 (2) 填充缺失值 使用fill…

win10 下搭建hadoop(成功截图)

背景: 搭建hadoop是大数据的启蒙第一步,对初学者有很好的信心建设,建议安装版本和作者一样。话不多说,开始正文。 1. 下载hadoop 本文版本为3.0.0 可以Apache.org官网下载,也可以本人csdn资源处下载https://download.…