基于Spring Boot的短信平臺平滑切換設計方案

基于Spring Boot的短信平臺平滑切換設計方案

案例背景

在電商系統中,短信服務是用戶注冊、登錄驗證、訂單通知等環節的關鍵基礎設施。由于業務需求或成本優化,企業可能需要在不同短信平臺(如阿里云、騰訊云、云片等)之間進行切換。傳統做法需要修改代碼并重新部署,這會導致系統停機和服務中斷。

本文將介紹如何通過Spring Boot的配置機制和設計模式實現短信平臺的平滑切換,無需修改調用處的業務代碼。

設計方案

1. 整體架構設計

采用"策略模式+工廠模式"結合Spring的依賴注入機制:

  • 定義統一的短信服務接口
  • 為每個短信平臺實現具體策略
  • 通過配置決定激活哪個實現
  • 工廠類負責返回正確的短信服務實例

2. 核心實現代碼

定義統一接口
public interface SmsService {/*** 發送短信* @param phone 手機號* @param content 短信內容* @return 發送結果*/SendResult send(String phone, String content);/*** 發送模板短信* @param phone 手機號* @param templateId 模板ID* @param params 模板參數* @return 發送結果*/SendResult sendWithTemplate(String phone, String templateId, Map<String, String> params);
}
實現不同平臺策略(以阿里云為例)
@Slf4j
@Service
@ConditionalOnProperty(name = "sms.provider", havingValue = "aliyun")
public class AliyunSmsService implements SmsService {@Value("${sms.aliyun.access-key-id}")private String accessKeyId;@Value("${sms.aliyun.access-key-secret}")private String accessKeySecret;@Overridepublic SendResult send(String phone, String content) {// 阿里云短信發送實現log.info("使用阿里云短信平臺發送短信至:{}", phone);// 實際調用阿里云SDKreturn new SendResult(true, "阿里云發送成功");}@Overridepublic SendResult sendWithTemplate(String phone, String templateId, Map<String, String> params) {// 實現模板短信發送return new SendResult(true, "阿里云模板發送成功");}
}
騰訊云實現
@Slf4j
@Service
@ConditionalOnProperty(name = "sms.provider", havingValue = "tencent")
public class TencentSmsService implements SmsService {@Value("${sms.tencent.app-id}")private String appId;@Value("${sms.tencent.app-key}")private String appKey;@Overridepublic SendResult send(String phone, String content) {// 騰訊云短信發送實現log.info("使用騰訊云短信平臺發送短信至:{}", phone);// 實際調用騰訊云SDKreturn new SendResult(true, "騰訊云發送成功");}@Overridepublic SendResult sendWithTemplate(String phone, String templateId, Map<String, String> params) {// 實現模板短信發送return new SendResult(true, "騰訊云模板發送成功");}
}
短信服務工廠
@Component
public class SmsServiceFactory {private final Map<String, SmsService> smsServiceMap;@Autowiredpublic SmsServiceFactory(List<SmsService> smsServices) {smsServiceMap = new HashMap<>();for (SmsService service : smsServices) {String providerName = resolveProviderName(service.getClass());smsServiceMap.put(providerName, service);}}public SmsService getSmsService(String provider) {return smsServiceMap.get(provider);}private String resolveProviderName(Class<?> clazz) {// 解析類名或注解獲取提供商名稱if (clazz.getSimpleName().toLowerCase().contains("aliyun")) {return "aliyun";} else if (clazz.getSimpleName().toLowerCase().contains("tencent")) {return "tencent";}return clazz.getSimpleName();}
}
統一門面服務
@Service
public class UnifiedSmsService {@Autowiredprivate SmsServiceFactory smsServiceFactory;@Value("${sms.provider:aliyun}")private String currentProvider;public SendResult sendSms(String phone, String content) {SmsService service = smsServiceFactory.getSmsService(currentProvider);return service.send(phone, content);}public SendResult sendTemplateSms(String phone, String templateId, Map<String, String> params) {SmsService service = smsServiceFactory.getSmsService(currentProvider);return service.sendWithTemplate(phone, templateId, params);}
}

3. 配置示例

application.yml

# 短信服務配置
sms:provider: aliyun  # 可切換為 tencent# 阿里云配置aliyun:access-key-id: your-access-key-idaccess-key-secret: your-access-key-secretsign-name: your-sign-name# 騰訊云配置tencent:app-id: your-app-idapp-key: your-app-keysign-name: your-sign-name

4. 業務調用示例

@RestController
@RequestMapping("/sms")
public class SmsController {@Autowiredprivate UnifiedSmsService unifiedSmsService;@PostMapping("/send")public ResponseEntity<SendResult> sendSms(@RequestParam String phone, @RequestParam String content) {// 業務代碼無需關心具體實現SendResult result = unifiedSmsService.sendSms(phone, content);return ResponseEntity.ok(result);}
}

方案優勢

  1. 解耦設計:業務代碼與具體短信平臺實現完全解耦
  2. 平滑切換:只需修改配置文件中sms.provider的值即可切換平臺
  3. 易于擴展:新增短信平臺只需添加新實現類,無需修改現有代碼
  4. 集中管理:所有短信平臺配置統一管理,便于維護
  5. 條件裝配:使用@ConditionalOnProperty確保只有激活的配置才會被加載

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/920511.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/920511.shtml
英文地址,請注明出處:http://en.pswp.cn/news/920511.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

信息技術發展

信息技術是研究如何獲取信息、處理信息、傳輸信息和使用信息的技術。計算機硬件控制器、運算器、存儲器、輸入設備、輸出設備。計算機軟件系統軟件、應用軟件、中間件。通信系統包括源系統、傳輸系統、目的系統。網絡基礎 個人局域網、局域網、城域網、廣域網、公用網、專用網。…

2023年12月GESP5級C++真題解析,包括選擇判斷和編程

一、選擇題&#xff08;每道題2分&#xff0c;共30分&#xff09; 1、下面C代碼用于求斐波那契數列&#xff0c;該數列第1 、2項為1&#xff0c;以后各項均是 前兩項之和。下面有關說法錯誤的是( ) A. fiboA( ) ?遞歸?式&#xff0c;fiboB() 循環?式 B. fiboA( ) 更加符合…

C++ 面試高頻考點 力扣 704.二分查找 基礎二分查找 題解 每日一題

文章目錄二分查找&#xff1a;從基礎原理到代碼實現二分查找的特點算法重點題目描述&#xff1a;LeetCode 704. 二分查找為什么可以用二分查找&#xff1f;暴力算法解法二分查找解法核心邏輯&#xff1a;三種情況的處理二分查找什么時候結束&#xff1f;為什么二分查找一定是對…

《UE5_C++多人TPS完整教程》學習筆記45 ——《P46 待機與跳躍動畫(Idle And Jumps)》

本文為B站系列教學視頻 《UE5_C多人TPS完整教程》 —— 《P46 待機與跳躍動畫&#xff08;Idle And Jumps&#xff09;》 的學習筆記&#xff0c;該系列教學視頻為計算機工程師、程序員、游戲開發者、作家&#xff08;Engineer, Programmer, Game Developer, Author&#xff09…

2025年03月 Scratch 圖形化(一級)真題解析#中國電子學會#全國青少年軟件編程等級考試

Scratch圖形化等級考試(1~4級)全部真題?點這里 一、單選題(共25題,共50分) 第1題 氣球初始位置如下圖所示,運行下列程序,氣球會朝哪個方向移動?( ) A:水平向右 B:垂直向下 C:水平向左 D:垂直向上 答案:A 氣球水平向右移動 第2題 使用下列哪個選項可以將…

android 不同分辨圖片放錯對應文件夾會怎樣?

多年前有人問過我這個問題&#xff0c;當時沒太了解這個東西&#xff0c;覺得是無所謂的東西&#xff0c;不過沒答上來這個問題還是讓我記了很久。今天又看到有人發文章討論這個問題&#xff0c;我也就特意再研究下。1&#xff0c;了解一下Android分辨率是什么。2&#xff0c;同…

48.【.NET8 實戰--孢子記賬--從單體到微服務--轉向微服務】--擴展功能--集成網關--解決Refit接口調用未授權的訪問問題

我們在項目中集成了Refit&#xff0c;但是在調用接口時&#xff0c;出現了問題&#xff0c;提示未授權的訪問。這個問題是怎么導致的呢&#xff1f;我們該怎么處理呢&#xff1f;在這篇文章中我們一起來解決吧。 一、為什么會出現這個問題 讓我們來深入分析一下是哪里返回的未授…

nacos登錄認證

先看一個現象bootstrap.yml配置如下&#xff1a;spring:application:name: myservicecloud:nacos:discovery:server-addr: 127.0.0.1:8848username: nacospassword: nacosconfig:prefix: testfile-extension: ymlusername: nacos123password: nacos注意&#xff1a;配置中nacos…

論文閱讀:arixv 2025 WideSearch: Benchmarking Agentic Broad Info-Seeking

WideSearch&#xff1a;大規模信息檢索基準測試 https://arxiv.org/pdf/2508.07999 字節&#xff1a;Agent大規模信息獲取基準WideSearch WideSearch&#xff1a;揭示 AI 智能體缺失的「廣度」能力 Project Page: https://widesearch-seed.github.io/ get the data&#x…

【Docker基礎】Docker-compose進階配置:資源限制與高可用部署

目錄 引言 1 Docker資源限制基礎概念 1.1 為什么需要資源限制 1.2 Docker資源限制的類型 2 CPU與內存資源限制配置 2.1 傳統資源限制方式&#xff08;version 2&#xff09; 2.2 現代資源限制方式&#xff08;version 3 deploy.resources&#xff09; 關鍵參數解釋&…

SQL優化--OR

優化 SQL 中的 OR 條件是一個非常常見的性能調優問題。OR 操作符經常會導致性能下降&#xff0c;因為它使得數據庫優化器難以高效地使用索引。下面我將從淺入深地為你講解優化 OR 的多種策略&#xff0c;并附上示例。為什么 OR 性能往往較差&#xff1f;在簡單的 WHERE 子句中&…

Java試題-選擇題(21)

Java試題-選擇題(21) 題目 有關線程的敘述正確的是 ? A:可以獲得對任何對象的互斥鎖定 B:通過繼承Thread類或實現Runnable接口,可以獲得對類中方法的互斥鎖定 C:線程通過使用synchronized關鍵字可獲得對象的互斥鎖定 D:線程調度算法是平臺獨立的 下面有關forward和re…

預測模型及超參數:3.集成學習:[1]LightGBM

想象你是一位樂隊指揮&#xff0c;你的任務是協調樂隊中的每位音樂家&#xff0c;以演奏出一場完美的音樂會。每位音樂家&#xff08;即決策樹&#xff09;擅長不同的樂器或樂章。在指揮過程中&#xff0c;你通過調節各位音樂家演奏的強度&#xff08;模型參數&#xff09;&…

Jetson進行旋轉目標檢測推理實現大疆無人機飛行控制

源碼結構 大疆PSDK源碼地址&#xff1a; https://github.com/dji-sdk/Payload-SDK其目錄結構如下&#xff1a; Payload-SDK-master ├── CMakeLists.txt ├── doc │ ├── dji_sdk_code_style │ └── simple_model ├── EULA.txt ├── LICENSE.txt ├── psd…

阿里云百煉智能體連接云數據庫實踐(DMS MCP)

這篇文章主要是通過使用阿里云的百煉智能體與阿里云的serverless來實現數據庫的操作 歡迎一起交流&#xff01;&#xff01; 首先&#xff0c;當然是選擇自己需要的數據庫啦 在阿里云控制臺選擇產品 - > 數據庫 - > 數據管理DMS進來的界面如下所示 第一次進來的時候是…

某商店JS混淆補環境與純算逆向分析

文章目錄1. 寫在前面2. 接口分析3. 補環境分析4. 純算法還原【&#x1f3e0;作者主頁】&#xff1a;吳秋霖 【&#x1f4bc;作者介紹】&#xff1a;擅長爬蟲與JS加密逆向分析&#xff01;Python領域優質創作者、CSDN博客專家、阿里云博客專家、華為云享專家。一路走來長期堅守并…

如何安裝 mysql-installer-community-8.0.21.0.tar.gz(Linux 詳細教程附安裝包下載)?

這是一個 ?Linux 下 MySQL 8.0.21 的壓縮安裝包&#xff0c;雖然名字里有 installer&#xff0c;但它其實就是一個壓縮好的二進制安裝包&#xff0c;不是 Windows 那種圖形化安裝程序。 一、準備工作 確保你已經有&#xff1a; Linux 系統&#xff08;比如 Ubuntu、CentOS、…

IDEA-琴澳研究中心及學術聯盟啟動,產研協同賦能區域發展

8月30日&#xff0c;IDEA-琴澳中心主導研發的Smaray渲染引擎將發布可免費下載的Tech Preview&#xff08;技術預覽版&#xff09;。本次發布標志著粵港澳大灣區在政產研協同創新實現成果落地&#xff0c;也是產業“人工智能”的探索邁進。Smaray是國內首個公開服務的、AI驅動的…

如何備份 TECNO 手機上的短信

許多 TECNO 用戶都在尋找方法&#xff0c;以防止因手機損壞、被盜或恢復出廠設置而導致重要對話意外丟失&#xff0c;確保在需要時能夠訪問他們的數據。還有些人希望在釋放設備存儲空間的同時&#xff0c;仍然保留舊消息的副本以供日后參考。如果你一直在尋找“備份 TECNO 短信…

OpenAI Sora深度解析:AI視頻生成技術如何重塑廣告電商行業?影業合作已落地

最近刷到一條超震撼的視頻&#xff1a;咖啡杯從桌角滑落&#xff0c;在空中轉了半圈居然自己彈回桌面&#xff0c;牛奶一滴沒灑。你猜怎么著&#xff1f;這居然是AI生成的&#xff0c;就是OpenAI那個叫Sora的工具做的。是不是覺得有點不可思議&#xff1f;現在這技術已經能做到…