APP下载

基于Spring、Hibernate、Dubbo的消息推送中间件的设计

2018-11-20汪琳

现代计算机 2018年30期
关键词:中间件调用短信

汪琳

(中国人民银行南京分行,南京210004)

0 引言

中间件是一种运行在操作系统、网络和数据库管理系统之上,应用软件之下的软件,其作用是为上层应用软件提供运行支持和开发环境,帮助用户灵活、高效地进行开发和集成[1]。中间件依据提供服务的不同,可分为消息中间件、交易中间件、对象中间件、数据访问中间件以及安全中间件等[2]。随着信息化的快速发展,消息中间件逐渐成为用户的应用重点,在各类系统中随处可见其身影[3]。传统的消息推送中间件基于生产者-消费者模式[4],即发布方首先通过网络传输把数据寄存到消息队列中,等待订阅方从消息队列中获取数据,当队列中的数据确认被订阅方获取后,消息队列中的该数据就会被移除。这里,队列是数据传输的“缓冲区”,使用队列能实现交换数据的临时寄存,支持数据的即时或延时读取,从而实现消息的同步或异步传输[5-6]。

随着互联网的发展,各行各业使用消息中间件进行数据交换越发普遍,这对于深度依赖消息中间件的软件产品而言,一旦某次消息推送服务出现异常,在第一时间精准定位问题并分析异常产生的原因是至关重要的。因此,对每一次推送的“消息”进行有效的管理和监控十分必要。

目前应用比较广泛的消息中间件有Apache的ActiveMQ、IBM的 RocketMQ、BEA的 Tuxedo等,这些消息中间件都有它们自身的特点,如在性能、安全性、健壮性、稳定性上都比较突出,然而这些消息中间件却存在着无法快速定位异常信息、难以快速检索某次服务信息以及难以兼容消息通讯双方使用的不同通讯协议等问题。针对上述问题,本文基于Spring、Hibernate、Dubbo框架以及MySQL和Redis数据库,并以与发送方通讯协议异构的第三方短信推送接口为例进行整合,设计了一个消息中间件原型。

1 总体架构设计

总体架构主要分为:控制层、业务层和数据访问层,如图1所示。

控制层主要通过两种架构实现:

(1)Spring MVC 架构。通过 Bootstrap、jQuery、HT⁃ML等前端技术实现的Web页面和用户进行交互。用户通过Web页面发出HTTP的请求首先被Spring Shiro框架实现的权限校验拦截器拦截,对配置文件以及数据库中用户信息进行权限验证,如限验证通过,则把HTTP请求发送给控制层Controller进行处理,调用相应的业务逻辑层代码,最后返回结果给前端Web页面。

(2)Dubbo架构。外部系统通过远程调用的方式访问控制层,首先被Dubbo核心拦截,Dubbo核心通过匹配查找,找到相应的控制层类和方法并进行调用。控制层被调用后会对传参的有效性进行校验,校验通过后,控制层调用业务逻辑层生成本次远程调用服务的唯一标识号,并作为参数继续调用相应业务的业务逻辑层代码,最终控制层会把服务的简单描述结果以及唯一标识号返回给外部系统。

业务逻辑层负责实现具体业务。包括生成每次远程调用服务唯一标识号、生成调用参数的SHA1签名、根据参数SHA1签名查询是否重复调用服务、第三方消息推送业务接口调用的具体逻辑,以及Web页面检索服务结果、管理推送服务的相关逻辑等。

数据访问层使用Hibernate框架将第三方业务接口将成功调用的结果持久化到数据库中,而将调用过程中出现的异常信息输出到日志文件。对于访问比较频繁、数据时效性髙的热点数据,为加快数据的访问速度,该层使用Java API对Redis缓存数据库中数据进行存取。

图1 系统整体架构示意图

2 第三方短信接口

对于消息推送服务中间件而言,能否兼容收、发端通讯协议不一致的情况是衡量中间件适用性的重要方面。本文设计的中间件发送端使用的是Dubbo框架集成的通讯协议,通过远程调用使用信息推送服务中间件服务,接收端选用一个通讯协议与发送端不一致的第三方短信推送接口。该第三方短信接口可以根据请求参数的内容,动态改变短信模版内容,然后发送给具体手机号码。具体方法为:首先需要在平台上预置短信模版,并赋予每个模板一个模版号,将来作为请求参数,告知服务器此次服务选择的短信模版。短信模版可以设计为:“验证码${code},您正在进行${product}身份验证,打死也不要告诉别人哦!”,其中${code}、${product}为模板可变参数,接口调用者在调用短信接口时,传入不同的替换参数即可实现发送短信内容的动态变化。

该第三方短信接口明确要求的请求发送参数为:

(1)PhoneNumbers:短信接收号码,支持以逗号分隔的形式进行批量调用,批量调用相对于单条调用在及时性方面稍有延迟,验证码类型的短信推荐使用单条调用的方式。

(2)TemplateCode:短信模板号,传入的模板必须是在第三方平台中预置的可用模板。

(3)TemplateParam:短信模板变量,传参规则为{“key”:”value”}键-值对,key的名字须和申请模板中的变量名保持一致,多个变量之间以逗号隔开。如:针对模板“验证码${code},您正在进行${product}身份验证,打死也不要告诉别人哦!”,传参时需传入{"code":"1234","product":"alidayu"}

第三方短信接口返回的响应参数为:

(1)RequestId:请求 ID。

(2)Code:返回结果。

(3)Message:状态码的描述。

(4)BizId:发送回执ID,可根据该ID可查询具体的发送状态。

3 唯一标识生成

在信息推送服务中间件的服务周期中,不能保证每次服务都能正常执行,当出现异常时,信息推送服务中间件的使用者重点关心的是异常描述,而在大量的日志记录中,开发者想要快速定位到对应本次服务的异常信息,则需要给每一个异常信息加入一个可返回给调用端的唯一标识号。如果消息推送成功完成,用户若要从数据库中快速检索服务结果,也需要加入唯一的标识号。唯一标识号将与本次服务相关联,并加入到本次服务产生的异常信息或服务结果中,最终返回给外部系统以供查询。

唯一标识号的生成需要解决两个问题:

(1)在多线程髙并发环境中,避免生成同样的标识号。

(2)在信息推送服务中间件集群部署运行中,避免生成同样的标识号。

对于第一个问题,可使用Java原子类实现,Java原子类实现了其变量的原子性,其提供的方法使用锁机制保证其运算的原子性。在每次的服务中,都对原子类变量进行累加1,即可保证单机环境下,每次服务的唯一标识号都不一样。

对于第二个问题,可利用数据库系统(如MySQL)的自增id的特性,即在数据库创建一个记录表,该表记录了信息推送服务中间件每次启动后,首次提供服务的时间,该表中存在着一个自增的id列,将该id将作为信息推送服务中间件的唯一标识。

为同时解决上述2个问题,可将数据库自增id和原子类对象值进行组合作为最终的唯一标识号,组合规则可规定为:自增id为前缀,中间拼接下划线字符,并以原子类对象值为后缀。

4 短信推送服务设计

通过在信息推送服务中间件中集成第三方提供的服务,一方面可以避免外部调用系统受到代码入侵的影响,另一方面则能够实现对服务信息的集中式管理,支持对服务信息的快速检索。短信推送服务的业务流程示意如图2所示。

在信息推送服务中间件短信远程调用接口(控制层)被调用后,控制层会先行对传入参数进行检查,然后控制层会调用业务逻辑层流水号(唯一标识号)生成方法进行流水号的生成,再进行业务逻辑层短信发送方法调用,业务逻辑层若出现异常则通过日志服务把带有流水号的异常信息输出到日志文件,以方便开发和维护人员进行检索,若服务正常,则业务逻辑层通过调用数据处理层进行对服务结果信息持久化到数据库中。

图2 短信推送服务的业务流程

5 结语

通过在中间件中集成第三方的消息推送服务,外部系统只需要统一使用Dubbo通讯协议接入中间件,即可实现对异构通讯协议的第三方消息推送服务的使用,避免了外部系统代码中耦合大量第三方消息推送服务的调用逻辑,且外部系统无需关心推送服务结果的持久化实现,将第三方消息推送服务集中于中间件实现,大幅度降低了对第三方消息推送服务功能的维护难度。

该消息推送服务中间件使用了远程调用功能提供消息推送服务,由于当前的远程调用功能仅支持同步回调,因而在整个信息推送服务过程中,调用第三方短信推送服务的时间耗占比会比较髙,若能实现远程调用服务的异步回调,将能大大地缩减信息推送服务的响应时间,提高服务响应速度,因此,下一步将会研究远程调用服务异步回调的实现,进一步提升消息推送服务中间件的服务性能。

猜你喜欢

中间件调用短信
我国自主可控中间件发展研究
道歉短信
系统虚拟化环境下客户机系统调用信息捕获与分析①
代发短信
基于属性数据的系统调用过滤方法
以实力证明 用事实说话
云计算环境下中间件的负载均衡机制研究
利用RFC技术实现SAP系统接口通信
“八一”节日短信之一
金蝶 引领中间件2.0新时代