Spring Boot整合Amazon SNS實戰:郵件訂閱通知系統開發

Spring Boot整合Amazon SNS實戰

  • 引言
  • 配置服務
  • 總結

新用戶可獲得高達 200 美元的服務抵扣金

亞馬遜云科技新用戶可以免費使用亞馬遜云科技免費套餐(Amazon Free Tier)。注冊即可獲得 100 美元的服務抵扣金,在探索關鍵亞馬遜云科技服務時可以再額外獲得最多 100 美元的服務抵扣金。使用免費計劃試用亞馬遜云科技服務,最長可達 6 個月,無需支付任何費用,除非您選擇付費計劃。付費計劃允許您擴展運營并獲得超過 150 項亞馬遜云科技服務的訪問權限

引言

在當下的軟件開發中,事件驅動架構和消息系統早已成為不可或缺的基礎設施,而在這一領域,亞馬遜云科技的簡單通知服務無疑是一位實力強勁的選手。它讓消息的發布與訂閱變得高效、靈活又易于擴展,尤其適合需要即時通知的業務場景,比如交易提醒、溫度監控、庫存預警等。今天,我們就用一個基于 Spring Boot 的實戰項目,帶你從零到一構建一個郵件訂閱通知系統,讓你真切感受到 Amazon SNS 的魅力。
在正式開工之前,我們先搞清楚幾個核心概念。所謂“主題”,你可以把它想象成消息的“頻道”或“標簽”,發布者把消息投遞到主題中,而訂閱者則對自己感興趣的主題保持監聽,一旦有新消息就會收到通知。這樣一來,發布者無需關心接收者是誰、在哪里,接收者也只會拿到自己關心的內容。Amazon SNS 的主題有兩種類型:一種是標準主題,支持高吞吐量傳輸,并且保證消息至少被投遞一次;另一種是 FIFO 主題,顧名思義,它能保證消息的嚴格順序,并且只會投遞一次,適合那些對順序和唯一性要求很高的場景。
為了讓主題上的消息真正觸達到接收者,Amazon SNS 支持多種訂閱目標,比如應用程序、Amazon SQS 隊列、Lambda 函數、HTTP(S) 端點,甚至直接發送郵件。本次示例中,我們選擇了 Email-JSON 協議,通過電子郵件來接收通知,方便直觀,也便于測試。
在這里插入圖片描述

配置服務

第一步是配置 IAM 用戶,這是所有亞馬遜云科技服務的“門禁卡”。在 亞馬遜 控制臺里選擇 IAM 服務,為新用戶添加 AmazonSNSFullAccess 權限策略,并生成訪問密鑰對。這些憑證就像是你的賬號密碼,必須妥善保存,因為稍后我們會在 Spring Boot 的監聽器里用到它們,讓應用具備訪問 Amazon SNS 的能力。
接下來,我們進入 Amazon SNS 控制臺創建主題。在 Topics 頁面點擊“Create topic”,選擇標準類型,輸入一個便于識別的名稱并確認創建。完成后,你會得到一個 Topic ARN,它是整個系統里識別該主題的唯一標識符。然后為這個主題添加訂閱,選擇 Email-JSON 作為協議,并填寫接收郵件的地址。訂閱創建后,亞馬遜云科技會向這個郵箱發送一封確認郵件,你需要點擊郵件里的確認鏈接,這樣才能開始接收消息。
項目的技術棧非常清晰:Java 17 作為運行環境,Spring Boot 提供 Web、校驗、監控等基礎功能,Lombok 簡化代碼,另外引入了

package rs.karajovic.milan.controller;import rs.karajovic.milan.model.Message;
import rs.karajovic.milan.model.SnsResponse;
import rs.karajovic.milan.service.MessagePublisher;import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;/*** * @author Milan Karajovic <milan.karajovic.rs@gmail.com>**/@RestController
public class MessageController {private final MessagePublisher messagePublisher;public MessageController(MessagePublisher messagePublisher) {this.messagePublisher = messagePublisher;}@PostMapping(value = "/publish")@ResponseStatus(HttpStatus.CREATED)public SnsResponse publishMessage(@RequestBody Message message) {return messagePublisher.publish(message);}@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)@ExceptionHandler(RuntimeException.class)private String handleException(RuntimeException e) {return e.getMessage();}
}

提供的 SNS SDK 來和服務端交互。我們在 application.properties 中配置 SNS 所需的參數,包括區域和主題 ARN。這樣一來,項目啟動時就能根據配置自動連接到對應的 Amazon SNS 主題。

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency><dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>2.0.1.Final</version>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency><dependency><groupId>software.amazon.awssdk</groupId><artifactId>sns</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional>
</dependency>

在代碼結構上,我們先定義一個 Amazon Properties 類,通過 @ConfigurationProperties 注解將 application.properties 中的配置綁定到 Java 對象上,確保 region 和 topicArn 不能為空。然后創建一個 SnsConfig 配置類,生成一個基于指定區域的 SnsClient,這個客戶端就是我們與 Amazon SNS 通信的橋梁。

#### AWS ### -
aws.sns.region=fill with region where you crated sns
aws.sns.topicArn=fill with created arn for test-top-arnmanagement.endpoints.web.exposure.include=*

接下來是業務邏輯部分。為了讓訂閱者能夠接收到具體的業務信息,我們定義了一個 Message 類和一個 EventType 枚舉,描述事件類型(比如溫度上升或下降)以及事件的詳細數據。然后用 RequestBuilder 構建消息的發布請求,將業務字段轉換成 Amazon SNS 支持的消息屬性,這樣訂閱者就可以按需過濾消息,比如只接收某個國家或某個城市的溫度變化提醒。這種靈活性正是 Amazon SNS 的一大優勢。

package rs.karajovic.milan.config;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.sns.SnsClient;/*** * @author Milan Karajovic <milan.karajovic.rs@gmail.com>**/@Configuration
public class SnsConfig {@Autowiredprivate AwsProperties awsProperties;@Beanpublic SnsClient snsClient() {return SnsClient.builder().region(Region.of(awsProperties.getRegion())).build();}
}package rs.karajovic.milan.model;/*** * @author Milan Karajovic <milan.karajovic.rs@gmail.com>**/public enum EventType {DROP, INCREASE
}

發布消息的入口在 MessageController 控制器中。我們暴露了一個 /publish 的 POST 接口,接收 JSON 格式的消息對象,將它轉成 PublishRequest,然后調用 SNS 客戶端發布到指定主題。如果成功,返回一個包含狀態碼、消息內容和唯一消息 ID 的 SnsResponse 對象;如果失敗,則捕獲異常并返回詳細錯誤信息。這樣的設計既符合 RESTful API 的最佳實踐,也讓前端或其他系統能明確知道消息是否成功送達。

package rs.karajovic.milan.controller;import rs.karajovic.milan.model.Message;
import rs.karajovic.milan.model.SnsResponse;
import rs.karajovic.milan.service.MessagePublisher;import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;/*** * @author Milan Karajovic <milan.karajovic.rs@gmail.com>**/@RestController
public class MessageController {private final MessagePublisher messagePublisher;public MessageController(MessagePublisher messagePublisher) {this.messagePublisher = messagePublisher;}@PostMapping(value = "/publish")@ResponseStatus(HttpStatus.CREATED)public SnsResponse publishMessage(@RequestBody Message message) {return messagePublisher.publish(message);}@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)@ExceptionHandler(RuntimeException.class)private String handleException(RuntimeException e) {return e.getMessage();}
}

項目完成后,你可以用 Postman 向 /publish 發送一條消息,比如溫度變化的數據。
在這里插入圖片描述
運行中的 Spring Boot 應用會將這條消息發布到 Amazon SNS 主題上,SNS 會根據訂閱規則將它推送到你設置的郵箱。幾秒鐘內,你就能在收件箱看到通知,這種即時反饋在實際業務中非常有價值。
在這里插入圖片描述
更棒的是,這個應用不僅能在本地運行,還可以輕松容器化部署。通過項目中的 Dockerfile 和 docker-compose.yml,我們可以把整個服務打包進容器中運行,無論是在測試環境還是生產環境,都能保證一致的運行效果。這對于需要快速部署、隨時擴展的企業來說,簡直是一種“即插即用”的便利。
在這里插入圖片描述

總結

回顧整個流程,從配置 IAM 用戶,到創建 SNS 主題和訂閱,再到 Spring Boot 項目的開發與部署,每一步都相對直觀。Amazon SNS 的發布/訂閱模型幫我們解耦消息發送與接收,讓系統的可擴展性和靈活性大大提升。你完全可以在這個基礎上延伸出更多玩法,比如用 Lambda 自動處理消息、結合 SQS 做消息隊列緩沖,或者用 HTTP 端點和第三方系統對接。
如果你也在尋找一種穩定、靈活且易于集成的消息通知方案,那么基于 Spring Boot 和 Amazon SNS 的組合無疑是個值得嘗試的選擇。它不僅能幫你快速搭建起一個高可用的通知系統,還能隨著業務需求的變化而輕松擴展。從開發到部署的體驗,會讓你深刻體會到“簡單”與“強大”可以兼得。
以上就是本文的全部內容啦。最后提醒一下各位工友,如果后續不再使用相關服務,別忘了在控制臺關閉,避免超出免費額度產生費用~

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

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

相關文章

LeetCode_動態規劃1

動態規劃1.動態規劃總結1.1 01背1.1.1 二維數組1.1.2 一維數組1.2 完全背包2.斐波那契數(力扣509)3.爬樓梯(力扣70)4.使用最小花費爬樓梯(力扣746)5.不同路徑(力扣62)6.不同路徑 II(力扣63)7.整數拆分(力扣343)8.不同的二叉搜索樹(力扣96)9.分割等和子集(力扣416)10.最后一塊石…

【STM32】HAL庫中的實現(九):SPI(串行外設接口)

SPI 接口通信原理 SPI&#xff08;Serial Peripheral Interface&#xff09;是全雙工主從通信協議&#xff0c;特點是&#xff1a; 信號線功能SCK串行時鐘MOSI主設備輸出&#xff0c;從設備輸入MISO主設備輸入&#xff0c;從設備輸出CS&#xff08;NSS&#xff09;片選信號&am…

Git常用操作大全(附git操作命令)

Git常用操作大全 一、基礎配置 1.1 設置用戶名和郵箱 git config --global user.name "你的名字" git config --global user.email "你的郵箱"1.2 查看配置 git config --list二、倉庫管理 2.1 初始化本地倉庫 git init2.2 克隆遠程倉庫 git clone <倉庫…

詳解flink table api基礎(三)

文章目錄1.使用flink的原因&#xff1a;2. Flink支持兩種模式&#xff1a;3. flink table api工作原理&#xff1a;4. Flink table api 使用5. select語句&flink table api&#xff1a;6. 使用flink table api 創建table7. 使用flink table api 寫流式數據輸出到表或sink8.…

Vue2+Vue3前端開發_Day5

參考課程: 【黑馬程序員 Vue2Vue3基礎入門到實戰項目】 [https://www.bilibili.com/video/BV1HV4y1a7n4] ZZHow(ZZHow1024) 自定義指令 基本語法&#xff08;全局 & 局部注冊&#xff09; 介紹&#xff1a;自己定義的指令&#xff0c;可以封裝一些 DOM 操作&#xff0c…

機器學習--決策樹2

目錄 第一代裁判&#xff1a;ID3 與信息增益的 “偏愛” 第二代裁判&#xff1a;C4.5 用 “增益率” 找平衡 第三代裁判&#xff1a;CART 的 “基尼指數” 新思路 遇到連續值&#xff1f;先 “砍幾刀” 再說 給決策樹 “減肥”&#xff1a;剪枝的學問 動手試試&#xff1…

yggjs_react使用教程 v0.1.1

yggjs_react是一個用于快速創建React項目的工具&#xff0c;它集成了Vite、TypeScript、Zustand和React Router等現代前端技術棧&#xff0c;幫助開發者快速搭建高質量的React應用。 快速入門 快速入門部分將指導您如何安裝yggjs_react工具、創建新項目并啟動開發服務器。 安…

vulhub可用的docker源

這一塊不太容易找&#xff0c;我試了好幾個源&#xff0c;下面是20250820測試可用源 編輯方法sudo mkdir -p /etc/docker sudo vim /etc/docker/daemon.json 配置內容 [1] {"registry-mirrors" : ["https://docker.registry.cyou", "https://docker-…

基于YOLOv8-SEAttention與LLMs融合的農作物害蟲智能診斷與防控決策系統

1. 引言 1.1 研究背景與意義 農作物蟲害是制約農業產量與質量的重要因素。據FAO報告&#xff0c;全球每年因病蟲害造成的糧食損失高達 20%–40%。傳統人工巡查與經驗診斷具有時效性差、成本高與專業人才不足等缺陷。近年來&#xff0c;計算機視覺特別是目標檢測技術在農業檢測…

從零開始構建GraphRAG紅樓夢知識圖譜問答項目(三)

文章結尾有CSDN官方提供的學長的聯系方式&#xff01;&#xff01; 歡迎關注B站從零開始構建一個基于GraphRAG的紅樓夢項目 第三集01 搭建后端服務 創建一個python文件server.py 完整源碼放到文章最后了。 1.1 graphrag 相關導入 # GraphRAG 相關導入 from graphrag.query.cont…

S32K328(Arm Cortex-M7)適配CmBacktrace錯誤追蹤

CmBacktrace 相當于重寫了hard_fault函數&#xff0c;在hard_fault函數里面去分析SCB寄存器的信息和堆棧信息&#xff0c;然后把這些信息打印出來(或者寫到flash)&#xff1b;通過使用串口輸出產生hard_fault的堆棧信息&#xff0c;然后利用addr2line工具反推出具體的代碼執行函…

AI研究引擎的簡單技術實現步驟

產品愿景與核心功能 1.1 產品使命 “洞見 Weaver”是一個全棧AI Web應用,旨在將用戶的復雜研究問題,通過AI驅動的動態思維導圖和結構化報告,轉化為一次沉浸式的、可追溯的視覺探索之旅。我們的使命是,將AI復雜的推理過程透明化,將人類的探索直覺與AI的分析能力無縫結合,…

open webui源碼分析5-Tools

本文從最簡單的時間工具入手&#xff0c;分析Tools相關的代碼。一、安裝工具git clone https://github.com/open-webui/openapi-servers cd openapi-servers# 進入時間工具目錄 cd servers/timepip install -r requirements.txt# 啟動服務 uvicorn main:app --host 0.0.0.0 --r…

windows下通過vscode遠程調試linux c/cpp程序配置

windows下通過vscode遠程調試linux c/cpp程序配置vscode插件配置linux依賴工具安裝launch.json配置vscode插件配置 CodeLLDB插件需要提前下載&#xff1a; linux依賴工具安裝 sudo apt update sudo apt install cmake clangdlaunch.json配置 {"version": "0…

IDEA報JDK版本問題

解決思路&#xff1a;1.找到配置jdk的IDEA配置位置settings和project structure2.先配置setting3.再修改項目結構

VirtualBox 安裝 Ubuntu Server 系統及 Ubuntu 初始配置

文章目錄簡介VirtualBoxUbuntu Server 簡介Ubuntu Server 下載安裝 Ubuntu Server首選項配置導入系統鏡像配置系統用戶配置內存 CPU 虛擬硬盤開始安裝 Ubuntu安裝完成登錄系統配置網絡Ubuntu 系統配置安裝常用工具安裝 SSH設置 root 密碼配置 IP 地址&#xff08;推薦自動分配I…

Milvus 可觀測性最佳實踐

Milvus 介紹 Milvus 是一個開源的向量數據庫&#xff0c;專為處理大規模、高維度向量數據而設計&#xff0c;廣泛應用于人工智能、推薦系統、圖像檢索、自然語言處理等場景。它支持億級向量的高效存儲與快速檢索&#xff0c;內置多種相似度搜索算法&#xff08;如 HNSW、IVF、…

arcgis-空間矯正工具(將下發數據A的信息放置原始數據B的原始信息并放置到成果數據C中,主要按下發數據A的范圍)

正常來說&#xff0c;可以直接相交獲取&#xff0c;但是會存在原始數據B將下發數據A進行分割&#xff0c;所以相交功能會導致最終成果會產生稀碎圖斑及圖斑切割&#xff0c;因此&#xff0c;經學習了解&#xff0c;學會此方法進行既保留原始數據B的信息&#xff0c;又按下發數據…

MySQL深分頁慢問題及性能優化

在數據驅動的應用中&#xff0c;分頁是不可或缺的功能。然而&#xff0c;當數據量達到百萬甚至千萬級別時&#xff0c;傳統基于 LIMIT OFFSET 的分頁方式會遭遇嚴重的性能瓶頸&#xff0c;即“深分頁”問題。本文將剖析其根源并提供主流的優化策略。問題根源&#xff1a;LIMIT …

漫談《數字圖像處理》之平滑

在數字圖像處理中&#xff0c;平滑&#xff08;Smoothing&#xff09; 的核心目標是降低圖像噪聲、模糊細節或簡化紋理&#xff0c;本質是通過 “局部鄰域運算” 對像素值進行 “平均化” 或 “規整化”&#xff0c;讓圖像整體更 “平緩”。形態學平滑與高斯平滑、均值平滑等其…