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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;让图像整体更 “平缓”。形态学平滑与高斯平滑、均值平滑等其…