自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

聊聊如何在Java應(yīng)用中發(fā)送短信

開發(fā) 前端
客戶端模式是非常簡單的模式,很多短信服務(wù)提供商會(huì)提供成熟的 SDK ,業(yè)務(wù)系統(tǒng)只需要添加 SDK 依賴以及相關(guān)配置,就可以調(diào)用 SDK 提供的方法發(fā)送短信。

很多業(yè)務(wù)場景里,我們都需要發(fā)送短信,比如登陸驗(yàn)證碼、告警、營銷通知、節(jié)日祝福等等。

這篇文章,我們聊聊 Java 應(yīng)用中如何優(yōu)雅的發(fā)送短信。

圖片圖片

一客戶端/服務(wù)端兩種模式

Java 應(yīng)用中發(fā)送短信通常需要使用短信服務(wù)提供商提供的短信 API 。

我們經(jīng)常使用的短信渠道有:阿里云、騰訊云、華為云、億美等。

發(fā)送短信模式分為兩種:

1、客戶端模式

客戶端模式是指應(yīng)用系統(tǒng)直接調(diào)用短信服務(wù)提供商提供的短信 API 發(fā)送短信。

圖片圖片

2、服務(wù)端模式

服務(wù)端模式是獨(dú)立創(chuàng)建一個(gè)短信平臺(tái)服務(wù),應(yīng)用系統(tǒng)直接使用短信平臺(tái)服務(wù)提供的 SDK 發(fā)送短信。

圖片圖片

核心流程如下:

  1. 前端調(diào)用應(yīng)用服務(wù)接口發(fā)送短信 ;
  2. 應(yīng)用服務(wù)收到短信請(qǐng)求后,調(diào)用 SDK 方法根據(jù)模版發(fā)送短信;
  3. 短信平臺(tái)服務(wù)收到請(qǐng)求,根據(jù)路由算法選擇配置的渠道(比如阿里云、騰訊云)發(fā)送短信;
  4. 短信成功發(fā)送到用戶手機(jī) 。

二客戶端模式

1、使用三方短信渠道 SDK

客戶端模式是非常簡單的模式,很多短信服務(wù)提供商會(huì)提供成熟的 SDK ,業(yè)務(wù)系統(tǒng)只需要添加 SDK 依賴以及相關(guān)配置,就可以調(diào)用 SDK 提供的方法發(fā)送短信。

我們以阿里云短信服務(wù)為例, 調(diào)用 API 發(fā)送短信的全流程如下所示:

圖片圖片

使用 SDK 示例如下:

圖片圖片

國內(nèi)云廠商阿里云、騰訊云、華為云的短信服務(wù),都需要依次申請(qǐng)簽名,申請(qǐng)模版,審核通過之后才能發(fā)送短信。

2、封裝多個(gè)三方渠道接口

雖然使用三方短信渠道 SDK 非常簡單,但是在實(shí)際項(xiàng)目中,可能會(huì)存在多個(gè)三方渠道,也就是說:可能有的短信是通過騰訊云發(fā)送,有的是通過阿里云發(fā)送。這樣就需要在工程中配置不同渠道的 SDK 依賴。

但這種方式會(huì)有兩個(gè)明顯的問題 :

  • 不同渠道的發(fā)送短信代碼不一致,業(yè)務(wù)代碼偏混亂。
  • 工程中引入到 SDK 包比較多,不同的 SDK 依賴并不相同,可能存在沖突問題 。

為了解決這個(gè)問題,有一種方法是擯棄三方渠道 SDK ,自己實(shí)現(xiàn) SDK 的發(fā)送短信方法,這樣可以統(tǒng)一發(fā)送短信代碼,易于管理。

筆者發(fā)現(xiàn)一個(gè)開源項(xiàng)目 SMS4J,該項(xiàng)目為短信聚合框架,旨在集成多家短信服務(wù),解決接入多個(gè)短信 SDK 的繁瑣流程。

下面我們展示在 SpringBoot 環(huán)境如何集成。

  • maven 引入
<dependency>
 <groupId>org.dromara.sms4j</groupId>
 <artifactId>sms4j-spring-boot-starter</artifactId>
 <version>3.0.2</version>
</dependency>
  • 設(shè)置配置文件
sms:
   alibaba:
      #阿里云的accessKey
      accessKeyId: 您的accessKey
      #阿里云的accessKeySecret
      accessKeySecret: 您的accessKeySecret
      #短信簽名
      signature: 測(cè)試簽名
      #模板ID 用于發(fā)送固定模板短信使用
      templateId: SMS_215125134
      #模板變量 上述模板的變量
      templateName: code
      #請(qǐng)求地址 默認(rèn)為dysmsapi.aliyuncs.com 如無特殊改變可以不用設(shè)置
      requestUrl: dysmsapi.aliyuncs.com
   huawei:
      #華為短信appKey
      appKey: 5N6fvXXXX920HaWhVXXXXXX7fYa
      #華為短信appSecret
      app-secret: Wujt7EYzZTBXXXXXXEhSP6XXXX
      #短信簽名
      signature: 華為短信測(cè)試
      #通道號(hào)
      sender: 8823040504797
      #模板ID 如果使用自定義模板發(fā)送方法可不設(shè)定
      template-id: acXXXXXXXXc274b2a8263479b954c1ab5
      #華為回調(diào)地址,如不需要可不設(shè)置或?yàn)榭?      statusCallBack:
      #華為分配的app請(qǐng)求地址
      url: https://XXXXX.cn-north-4.XXXXXXXX.com:443
   zhutong:
      #助通短信
      #助通終端用戶管理的用戶名 username 必填;非登錄賬號(hào)密碼,請(qǐng)登錄后臺(tái)管理地址進(jìn)行查看:http://mix2.zthysms.com/login
      accessKeyId: tushu1122XXX
      #助通終端用戶管理的用戶名 passwrod 必填;
      accessKeySecret: UbXXX4SL
      #短信簽名,可選;可選的時(shí)候,只能使用自定義短信不能使用模板短信; 具體在這里查看審核過的短信簽名:https://mix2.zthysms.com/index.html#/SignatureManagement
      signature: 上海千XXXX
  • 方法使用
@RestController
@RequestMapping("/test/")
public class DemoController {
  // 測(cè)試發(fā)送固定模板短信
  @RequestMapping("/")
  public void doLogin(String username, String password) {
     //阿里云向此手機(jī)號(hào)發(fā)送短信
     SmsFactory.createSmsBlend(SupplierType.ALIBABA).
                       sendMessage("18888888888","123456");
     //華為短信向此手機(jī)號(hào)發(fā)送短信
     SmsFactory.createSmsBlend(SupplierType.HUAWEI).
                       sendMessage("16666666666","000000");
  }
}

客戶端模式是簡單實(shí)用的模式,我們可以直接引入三方渠道的 SDK 發(fā)送短信,但當(dāng)存在多種渠道短信時(shí),可能代碼會(huì)比較混亂。

雖然我們可以封裝多個(gè)三方渠道接口來解決問題,但研發(fā)成本還是比較高的。

另外,當(dāng)研發(fā)小組分散,發(fā)送短信各自自成體系時(shí),當(dāng)某一個(gè)渠道由于某種原因被棄用時(shí),大部分研發(fā)小組都可能會(huì)受影響。

三服務(wù)端模式

服務(wù)端模式是獨(dú)立創(chuàng)建一個(gè)短信平臺(tái)服務(wù),應(yīng)用服務(wù)直接使用短信平臺(tái)提供的 SDK 發(fā)送短信。

短信平臺(tái)的設(shè)計(jì)有如下要點(diǎn):

1、應(yīng)用管理

短信平臺(tái)為每一個(gè)接入的應(yīng)用分配單獨(dú)的 appKey 和 appSecret ,每一個(gè)應(yīng)用可以配置獨(dú)立的限流策略。

2、精簡的 SDK 提供按照模版單發(fā)/群發(fā)的功能

public SmsSenderResult sendSmsByTemplateId( 
                 String mobile, 
                    String templateId, 
                    Map<String, String> templateParam);

3、簽名、模版管理

每個(gè)應(yīng)用服務(wù)涉及到的簽名、模版的管理都中心化 ,我們可以讓一個(gè)模板綁定多個(gè)渠道。

當(dāng)某條短信通過渠道 A 發(fā)送失敗時(shí),可以通過另一個(gè)渠道 B 發(fā)送,如此可以達(dá)到高可用的效果。

4、多渠道適配

服務(wù)端要加載多個(gè)渠道的 SDK ,那么可能導(dǎo)致依賴沖突,可以采取 SPI 機(jī)制加載渠道插件。

5、擴(kuò)展功能

我們可以根據(jù)業(yè)務(wù)需求靈活定制短信平臺(tái)的功能,比如批量發(fā)送、延遲發(fā)送、路由策略、靈活的接口限流等。

服務(wù)端的設(shè)計(jì)可以非常靈活,筆者曾經(jīng)重構(gòu)過一個(gè)短信平臺(tái)服務(wù),架構(gòu)圖如下:

圖片圖片

  1. 模仿騰訊云的 SDK 設(shè)計(jì),提供簡單易用的短信接口;
  2. 設(shè)計(jì)短信服務(wù) API 端,接收發(fā)短信請(qǐng)求,發(fā)送短信信息到消息隊(duì)列;
  3. worker 服務(wù)消費(fèi)消息,按照負(fù)載均衡的算法,調(diào)用不同渠道商的短信接口;
  4. Dashboard 可以配置渠道、管理應(yīng)用、查看短信發(fā)送記錄等。
責(zé)任編輯:武曉燕 來源: 勇哥java實(shí)戰(zhàn)分享
相關(guān)推薦

2022-05-10 08:17:03

goroutine泄漏

2014-04-24 16:21:50

LinuxIP地址沖突

2020-09-01 10:57:47

物聯(lián)網(wǎng)協(xié)議物聯(lián)網(wǎng)應(yīng)用開發(fā)

2018-10-16 10:13:06

2022-05-12 14:08:56

數(shù)字孿生制造業(yè)醫(yī)療保健

2022-02-22 14:43:16

區(qū)塊鏈游戲加密貨幣

2023-05-26 08:24:17

短信渠道模型

2019-05-31 09:00:49

2024-04-01 07:00:00

區(qū)塊鏈深度偽造

2018-10-10 19:50:18

區(qū)塊鏈GDPR數(shù)據(jù)

2022-01-28 23:11:40

區(qū)塊鏈加密貨幣技術(shù)

2022-09-20 12:53:15

編程語言漏洞

2018-01-29 11:10:47

LinuxUnix網(wǎng)絡(luò)取證工具

2009-07-20 15:38:31

ASP.NET 2.0發(fā)送電子郵件

2022-10-21 13:57:46

2020-12-24 17:16:16

物聯(lián)網(wǎng)保護(hù)環(huán)境IOT

2022-02-09 10:04:35

財(cái)務(wù)自動(dòng)化深度學(xué)習(xí)機(jī)器學(xué)習(xí)

2012-08-06 10:19:36

2011-08-03 10:49:46

2009-09-03 17:40:25

C#發(fā)送短信
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)