来源:勇哥java实战分享 很多业务场景里,聊聊我们都需要发送短信,应用中比如登陆验证码、发送告警、短信营销通知、聊聊节日祝福等等。应用中 这篇文章,发送我们聊聊 Java 应用中如何优雅的短信发送短信。 Java 应用中发送短信通常需要使用短信服务提供商提供的短信 API 。 我们经常使用的应用中短信渠道有:阿里云、腾讯云、发送华为云、短信亿美等。聊聊 发送短信模式分为两种: 1、应用中客户端模式 客户端模式是发送指应用系统直接调用短信服务提供商提供的短信 API 发送短信。 2、服务端模式 服务端模式是独立创建一个短信平台服务,应用系统直接使用短信平台服务提供的 SDK 发送短信。 核心流程如下: 1、使用三方短信渠道 SDK 客户端模式是非常简单的模式,亿华云很多短信服务提供商会提供成熟的 SDK ,业务系统只需要添加 SDK 依赖以及相关配置,就可以调用 SDK 提供的方法发送短信。 我们以阿里云短信服务为例, 调用 API 发送短信的全流程如下所示: 使用 SDK 示例如下: 国内云厂商阿里云、腾讯云、华为云的短信服务,都需要依次申请签名,申请模版,审核通过之后才能发送短信。 2、封装多个三方渠道接口 虽然使用三方短信渠道 SDK 非常简单,但是在实际项目中,可能会存在多个三方渠道,也就是说:可能有的短信是通过腾讯云发送,有的是通过阿里云发送。这样就需要在工程中配置不同渠道的 SDK 依赖。 但这种方式会有两个明显的问题 : 为了解决这个问题,有一种方法是摈弃三方渠道 SDK ,自己实现 SDK 的发送短信方法,这样可以统一发送短信代码,易于管理。 笔者发现一个开源项目 SMS4J,该项目为短信聚合框架,旨在集成多家短信服务,解决接入多个短信 SDK 的繁琐流程。 下面我们展示在 SpringBoot 环境如何集成。 ) { ) { SmsFactory.createSmsBlend(SupplierType.ALIBABA). ); SmsFactory.createSmsBlend(SupplierType.HUAWEI). ); } } 客户端模式是简单实用的模式,云服务器提供商我们可以直接引入三方渠道的 SDK 发送短信,但当存在多种渠道短信时,可能代码会比较混乱。 虽然我们可以封装多个三方渠道接口来解决问题,但研发成本还是比较高的。 另外,当研发小组分散,发送短信各自自成体系时,当某一个渠道由于某种原因被弃用时,大部分研发小组都可能会受影响。 服务端模式是独立创建一个短信平台服务,应用服务直接使用短信平台提供的 SDK 发送短信。 短信平台的设计有如下要点: 1、应用管理 短信平台为每一个接入的应用分配单独的 appKey 和 appSecret ,每一个应用可以配置独立的限流策略。 2、精简的 SDK 提供按照模版单发/群发的功能 ( String mobile, String templateId, ; 3、签名、模版管理 每个应用服务涉及到的签名、模版的管理都中心化 ,我们可以让一个模板绑定多个渠道。 当某条短信通过渠道 A 发送失败时,可以通过另一个渠道 B 发送,如此可以达到高可用的效果。 4、多渠道适配 服务端要加载多个渠道的 SDK ,那么可能导致依赖冲突,可以采取 SPI 机制加载渠道插件。 5、扩展功能 我们可以根据业务需求灵活定制短信平台的功能,比如批量发送、延迟发送、路由策略、灵活的接口限流等。 服务端的设计可以非常灵活,笔者曾经重构过一个短信平台服务,架构图如下:1 客户端/服务端两种模式
2 客户端模式
3 服务端模式
模仿腾讯云的 SDK 设计,提供简单易用的短信接口;设计短信服务 API 端,接收发短信请求,发送短信信息到消息队列;worker 服务消费消息,按照负载均衡的算法,调用不同渠道商的短信接口;Dashboard 可以配置渠道、管理应用、查看短信发送记录等。