基于SpringBoot的短信服务的设计与实现
2020-05-29庄学松黄可望
庄学松 张 智 黄可望
(无锡职业技术学院 a.物联网技术学院; b.人事处; c.物联网技术学院,江苏 无锡 214121)
为了保护气象值班人员的眼睛,降低值班人员的工作强度,各种业务系统的状态监控和报警系统相继开发。及时的短信报警通知让装备设备的维修更加及时,解决问题的效率也更加高效。短信报警功能在实际的业务系统运行中发挥了重要的作用。
目前,大部分气象部门技术人员采用的短信报警方式是利用短信猫进行消息的通知,其在开发和维护时难度较高,并且在发送短信的时容易遇到一些底层难以定位的问题。为了进一步开发短信报警功能,急需重新对短信发送的方案进行改造,使气象各级单位的技术人员都能简单方便地调用短信发送功能而无需关注底层的发送指令。
1 系统结构
1.1 微服务结构
微服务是一种构建应用程序的体系结构方法。作为一个架构框架,微服务呈分布式且松散耦合结构,因此,一个子部件的更改不会破坏整个应用程序。使用微服务的好处是开发团队能够快速构建应用程序的新组件,以达到乃至引领业务需求。与传统方法相比,微服务架构将应用分解为核心功能的几个功能模块,每个功能都称为服务,并且可以独立构建和部署,这意味着单个服务运行的失败并不会对其他服务产生影响[1]。
由于当前各行政级别的气象部门存在大量自己开发的系统,这些系统在各部门间不共享资源,对于各自业务系统的状态监控信息和报警信息缺少共享机制,开发资源和技术也同样缺少共享和交互机制。同时,以前的系统都是“整体式”的开发方法,即使对已有业务系统进行最小的改动,也需要对整个系统进行重新编码、验证及发行。此方式将源代码编译打包在一个压缩文件中,网站程序文件一般为War文件。如果应用系统中的一部分程序出现错误,则会影响整个系统中的其他单元。微服务的思想是将一个大系统拆成几个小系统,每个系统只需要关注自己的业务逻辑即可。多人可以同时开发同一个系统的中的不同单元,每个单元之间通过流行的RPC框架进行通信[2]。
1.2 实现方式
目前主要的短信方式包括两种,短信猫发送和网络接口调用。利用短信猫发送硬件进行发送需要外接电源及手机通信卡,在连接设备后可在电脑上通过厂家公开的AT指令或更上层的短信操作API实现短信发送。随着后端服务技术的发展及移动运行商短信接口的开放,网络接口调用的方式逐渐流行起来。在系统前期的研究过程中采用的是第一种方案,该方案的优点是发送短信快速、稳定、开发和使用不受除移动运行商外的第三方限制,其缺点是需要购买硬件并理解底层的AT指令,开发周期相对较长。网络短信服务接口的最主要特点是短信发送的底层细节不需要关心,只需要了解短信服务提供商的接口协议即可。但是该方案严重依赖于网络,如果网络不通则完全无法使用。目前大多数系统还是采用硬件的方式发送短信,该方案在使用过程中发现对AT指令的理解和具体短信猫的特性需要理解得比较透彻才能发挥出优势,否则虽然实现了短信发送的功能,但是在收发短信的时效性和易用性上却无法满足业务应用的需求。
1.3 基于云短信服务的分布式结构
在先前系统的实施方案中采用短信猫直接发送短信,但是在使用一段时间后发现某些短信猫不支持全网通,有些短信猫发送短信时间需要耗时几分钟,后期更换短信猫还需要更改代码层面的AT指令,因此需要在之前系统结构的基础上将短信猫更换为速度快、性能稳定、资费更低的网络短信接口。国内有阿里云、深圳梦网、京东、创信等网络短信服务提供商。本项目方案使用阿里云短信API来开发短信报警服务的基础功能,图1为改进后的基于网络短信服务接口结构图。
图1 短信服务结构
一台可以联网的电脑和阿里云短信服务接口组成了短信服务提供方,短信代理服务器通过阿里云短信服务器的API实现在线短信收发功能,外部通过Http地址的形式访问Servlet接口。各部门单位原先的值班系统和应用系统都不需要变化,这些系统作为短信内容生产方的角色将各种报警信息放到队列中[3]。
通过短信代理服务器解决了采用网络短信服务必须要连通外网的缺点,在省局内只需一台能上网的电脑并在上面部署短信发送代理程序即可使市局和县局通过内网直连接短信代理服务器发送和接收短信。
2 服务实施
2.1 微服务架构的搭建
系统采用SpringBoot实现短信代理服务。微服务架构的主要特征是去中心化和分布式结构。它是将一个项目的各个模块有序分割,之后由各模块提供API,供其他功能模块调用。各模块一般都独立运行,而且有自己的数据库与服务器,通过“化整为零”,各个模块之间得到了解耦,系统的扩展性更强。而SpringBoot就是进行微服务架构开发的一套框架工具,它是在Spring框架基础上发展出来的,借助它可以真正做到前后端分离。
整个系统中短信生产方、短信服务使用方、短信服务提供方都可以按照微服务的思想进行开发。这里主要介绍短信服务提供方实现微服务过程。
(1)在eclipse中创建一个maven应用。
(2)引入SpringBoot框架,需在pom.xml文件中引入SpringBoot父容器并添加Web开发所需要的相应依赖。主要包括jdk1.8;启动器父包spring-boot-starter-parent;web工程包spring-boot-starter-web;特定的网络短信的包,如阿里云短信服务的包。
(3)创建SpringBoot引导类。
(4)创建配置文件 application.properties,对启动端口进行配置,并配置网络短信发送id、密钥、短信签名及短信模板名。
(5)创建发短信的工具类,其中调用阿里云短信服务的主要代码如下:
//a、创建profile
//accessKeyId:申请的ID, accessKeySecret:申请的密钥
IClientProfile pf = DefaultProfile.getProfile(STRING_CN_HZ", akID, akSecret);
DefaultProfile.addEndpoint(STRING_CN_HZ, STRING_CN_HZ, STRING_DYSMS, STRING_DYSMS_URI);
//b、创建client
IAcsClient acsClient= new DefaultAcsClient(pf);
//c、创建Request对象
SendSmsRequest rest = new SendSmsRequest();
//d、设置Request的参数
//mobile:待发送手机号
rest.setPhoneNumbers(mobile);
//signName:签名
rest.setSignName(signName);
//templateCode:自定义的模板
rest.setTemplateCode(templateCode);
//code:变量信息
rest.setTemplateParam("{”code”:"+STRING_PARA+"}");
//e、用client对应的方法传入request,获得response
SendSmsResponse returnValue = acsClient.getAcsResponse(rest);
//f、在response中获得返回的参数值
return returnValue;
2.2 阿里云短信接入配置
系统采用的网络短信服务商为阿里云短信,主要接入流程如下[4]:
(1)到官网上开通短信服务。短信服务开通后需要获取 accessKey和 accessKeySecret。
(2)创建签名并等待官方审核(一般需要等待2个小时),签名指的是短信前面显示的名称,比如“【气象短信报警接口】短信正文....”中括号里面的就是签名。
(3)创建短信发送模板并等待官方审核,模板就是短信的正文中不变的部分,再加上一部分参数输入的描述。如,模版内容: 报警等级为 {class},报警内容为 {text}。其中有两个变量,分别为class-等级和text-内容。
(4)在签名和短信模板审核通过后就能用这个模板发送短信,这与其他短信服务直接在身份验证后直接发送短信有所区别。
(5)根据业务应用选择合适的短信套餐。至此配置完成,可以利用阿里云短信服务的API发送短信。
2.3 短信服务方调用
阿里云短信服务API调用封装后即可在短信代理处进行调用,根据返回的结果判断调用是否成功。在封装后再发布成内网中可以调用的Http服务,即在内网中也可以间接地调用阿里云短信服务。主要调用代码如下:
CommonResponse returnValue = SMSsend(phoneNo,text);
if(returnValue != null && returnValue.getHttpStatus() == 200){
String data = returnValue.getData();
Map map = JSON.parseObject(data, Map.class);
LOGGER.info("send message status is:{}" + phone + "and text is" + text + "," + map.get("Text"));
短信服务接口通过HTTP的形式暴露外部调用接口。HTTP格式为:
http://Address:Port/smsSend/send?user=***&pwd=***&phoneNo=****&text=****&prior=***&token=****
Address和Port是服务提供方供外部访问用的入口;user和pwd是对短信的使用者进行身份鉴别,防止非法调用。只有在验证通过后才能调用阿里云服务封装后的短信发送接口。
2.4 缓存机制
在报警事件产生时需要及时地推送给业务值班人员,值班人员根据报警内容排查并解决问题。但并不是报警推送越多越好,需要把握一个度,不能漏掉重要信息,又不能频繁推送信息影响值班人员对重要信息的判断。频繁推送报警内容甚至会对短信推送功能产生抵触心理。因此需要针对不同等级,不同内容制定详细的频次推送规划,记录每一个短信在一段时间内推送到相关人员的频次,当达到一定的阈限后不能继续推送报警信息。
除了在发生或即将发生报警事件时及时调用短信服务将报警内容推送给指定人员外,还有其他的内容需要短信推送给相关人员。如每个值班人员还关心每个整点的业务运行情况是否正常,每天整体情况运行如何,每月状态统计信息如何。因此,需要定时将业务运行情况、软件和系统资源的运行情况汇总并发给相关人员做实时监控。对于定期推送的不同种类的短信需要精确地推送给指定的人员,不能推送出现混乱。如果因为网络、接口服务器、软件系统、机器等原因不能保证短信发送功能7*24小时连续工作,需要将发送的成功状态、发送的记录保存下来。
对于上述两种情况采用Redis实现短信发送状态的缓存。Redis是一种开源的键值数据库,由于非常优异的性能和可持久化的特性使得它被广泛地应用到各大网站服务平台中[5]。SpringBoot中除了支持关系型数据库Oracle、MySql、SqlServer外,也对Redis等非关系型数据进行了自动化支持。因此,在SpringBoot中利用集成的Redis组件可方便地对数据进行CRUD操作。
2.5 短信发送的注意点
国内短信内容计费方案一般是根据短信内容中的字数进行收费,如果短信字数达到一定的长度(一般为70个)就按多条短信进行计费。
一般情况下,网络短信服务商对同一个手机号码发送短信通知的条数有限制,比如阿里云短信服务支持50条/天。如果发送字数超过限额后也会提示业务限流。单条短信字数也有限制,一般达到500多个字,超限的话会发送失败。
国内短信支持全网通发送,并且支持向国际和中国的港澳台运营商的手机发送短信,但是一次最多发送的目的手机数目受限制,不同网络运营商可能不一样,比如阿里云一次最多可向1 000个手机号码发送短信。
3 结语
基于Springboot实现短信报警的微服务系统结构,结合Redis 的主要特性,利用其优异的数据库条目读写效率的优势,实现了短信服务的快速调用,提高了整个系统的可维护性和用户体验。
短信代理服务通过Http 方式发布接口供外部调用,通过接口的实现方可以实时反馈一些状态信息,比如某个号码发送频率。后期设计可以在后端根据每个号码的发送特性制作统计报表并可以进行流量控制以防止恶意发送。