AWS Lambda 上的 Spring Boot 应用程序 – 使用 Spring Cloud Function AWS 部分开发应用程序

介绍

在第 8 部分中,我们介绍了 spring cloud function (aws) 背后的概念。在本文中,我们将了解如何使用 java 21 运行时和 spring cloud function aws 使用 spring boot 3.2 版本编写 aws lambda 函数。要使用较新版本的 spring boot(即 3.3),更新 pom.xml 中的版本可能就足够了。

如何使用 Spring Boot 3.2 使用 Spring Cloud Function AWS 编写 AWS Lambda

为了便于解释,我们将使用 Spring Boot 3.2 示例应用程序,并为 Lambda 函数使用 Java 21 运行时。

Image description

使用 Spring Boot 3.2 通过 Spring Cloud Function AWS 编写 AWS Lambda 有多种方法:

广义上讲,使用 AWS Serverless Java Container 开发应用程序一文中介绍的 AWS Lambda 和 AWS Serverless Java Container 也可以被视为 Spring Cloud Function AWS 应用程序,因为依赖于 spring-cloud-function-serverless-web 和 aws-serverless-java -container-springboot3 需要。这是 Spring 和 AWS Serverless 开发人员之间的合作成果。它提供了 AWS Lambda 功能上的 Spring Cloud Function。

我们还可以直接在主 Spring Boot Application 类(使用 @SpringBootApplication 注解)中定义 Spring Bean(使用 @Bean 注解),并将使用 @Bean 注解的方法名称(这是默认的 Bean 名称)映射到与 Lambda 完全匹配基础设施即代码(即 AWS SAM 模板)中的函数名称。这种方法的示例可以在这里找到。

另一种方法是使用 org.springframework.cloud.function.adapter.aws.web.WebProxyInvoker::handleRequest Lambda 处理程序和普通的 Spring Boot RestController(用 @RestController 注释)。这种方法的示例可以在这里找到。

在这篇文章中,我想展示更经典的方法如何将 Java 8 Function 接口转换为 AWS Lambda 函数。

在示例应用程序中,我们将创建和检索产品并使用 DynamoDB 作为 NoSQL 数据库。您可以在此处找到 DynamoProductDao.java 实现。我们还将 Amazon API Gateway 放在它前面,如 AWS SAM 模板中定义的那样。

在 pom.xml 中,我们需要定义这些依赖项:

  org.springframework.cloud  spring-cloud-function-adapter-aws   org.springframework.cloud   spring-cloud-function-web

这会将 Spring Cloud Function 转换为 AWS Lambda 并将其公开为 Web 应用程序。

这是我们的 Spring Boot 主类,我们还必须在环境变量部分的 SAM 模板中另外定义:

全局变量:  功能:    ……    环境:      变量:        MAIN_CLASS:software.amazonaws.Application

接下来我们实现 GetProductByIdHandler ,它实现了 java.util.function.Function 接口,并且必须使用 Spring @Component 注解进行注释。

AppMall应用商店 AppMall应用商店

AI应用商店,提供即时交付、按需付费的人工智能应用服务

AppMall应用商店 56 查看详情 AppMall应用商店

@组件公共类 GetProductByIdHandler 实现 函数 {      @Autowired      私人 DynamoProductDao 产品Dao;      ...      公共 APIGatewayProxyResponseEvent apply(APIGatewayProxyRequestEvent requestEvent) {      String id = requestEvent.getPathParameters().get("id");      可选 可选产品=productDao.getProduct(id);      返回新的 APIGatewayProxyResponseEvent()。              withStatusCode(HttpStatusCode.OK).                  withBody(....);  }

@Component 是一个注解,它允许 Spring 自动检测我们的自定义 bean。默认情况下,Spring 采用声明 bean 的类型(Java 类)的简单名称,将第一个字母更改为小写,并使用结果值来命名 bean。

我们也可以通过直接返回 Product 或Optional 而不是将其包装到 APIGatewayProxyResponseEvent 对象中来实现此 Lambda 函数,而无需某些 AWS 依赖项。

接下来我们在SAM模板中定义Lambda函数映射

 GetProductByIdFunction:    类型:AWS::无服务器::函数    特性:      环境:        变量:           SPRING_CLOUD_FUNCTION_DEFINITION:getProductByIdHandler      函数名称:GetProductByIdWithSpringBoot32SCF      ...      活动:        获取请求ID:          类型: API          特性:            RestApiId:!Ref MyApi            路径:/产品/{id}            方法:获取            

相关部分在这里是环境变量 SPRING_CLOUD_FUNCTION_DEFINITION,它是 Spring bean 名称,在我们的例子中对应于 Lambda 函数类名称,其中第一个字母更改为小写。在我们的示例中,环境变量 SPRING_CLOUD_FUNCTION_DEFINITION = getProductByIdHandler 的 Lambda 函数映射到 Lambda Java 类 GetProductByIdHandler.

请注意,由于 AWS 不允许使用点。和/或连字符 – 在环境变量的名称中,我们可以受益于 Spring Boot 支持,只需用下划线替换点,用驼峰式大小写替换连字符。例如 spring.cloud.function.definition 变为 spring_cloud_function_definition。我们还可以使用全部大写字母来编写变量名称,即 spring.cloud.function.definition 和 spring.cloud.function.routing-expression 。

还在全局 Lambda 函数环境变量的 SAM 模板中,我们定义了通用 Spring Cloud Function AWS Lambda 处理程序

全局变量:  功能:    处理程序:org.springframework.cloud.function.adapter.aws.FunctionInvoker::handleRequest

它将所有请求路由到正确的 Lambda 实现(我们为每个 Lambda 函数实现定义了单独的 Lambda Handler Java 类)。

您可以在本文中了解有关 Spring Cloud Function 路由和过滤功能的更多信息。

然后我们需要使用 sam deploy -g 部署应用程序并检索现有产品,我们必须调用以下命令:

curl -H“X-API-密钥:a6ZbcDefQW12BN56WEA7”https://{$API_GATEWAY_URL}/prod/products/1

结论

在本文中,我们研究了如何使用 Spring Boot 3 版本通过 Spring Cloud Function AWS 使用 Java 21 运行时编写 AWS Lambda 函数。与 AWS Serverless Java Container 和 AWS Lambda Web Adapter 相比,Spring Cloud Function AWS 不严格要求但支持重用 Spring Boot Rest Controller。在我们使用 Spring Cloud Function AWS 的主要示例中,我们将 Java 8 Function 作为 Lambda 函数公开。

在本系列的下一篇文章中,我们将测量此示例应用程序的冷启动和热启动时间,包括在 Lambda 函数上启用 SnapStart,并为 DynamoDB 调用应用各种启动技术。

以上就是AWS Lambda 上的 Spring Boot 应用程序 – 使用 Spring Cloud Function AWS 部分开发应用程序的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/519074.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月9日 04:35:34
下一篇 2025年11月9日 04:36:55

相关推荐

  • 在 Java 中使用 Argparse4j 接收 Duration 类型参数

    本文介绍了如何使用 `net.sourceforge.argparse4j` 库在 Java 命令行程序中接收 `java.time.Duration` 类型的参数。由于 `Duration` 不是原始数据类型,需要通过自定义类型转换器或工厂方法来处理。文章提供了两种实现方案,分别基于 `value…

    2025年12月6日 java
    000
  • 使用 String 和 Enum 的 Switch Case 详解

    本文详细讲解了如何在 Java 中结合 String 和 Enum 类型进行 switch case 操作。重点介绍了如何将字符串转换为 Enum 类型,以及如何在 switch 语句中使用 Enum。同时,探讨了分离关注点的原则,并提供了一个完整的示例,展示了如何将字符串到 Enum 的映射与实际…

    2025年12月6日 java
    000
  • 在Java中如何初始化静态代码块

    静态代码块在类加载时执行一次,用于初始化静态资源;语法为static{},多个按出现顺序执行;在创建对象、调用静态方法等主动使用类时触发,仅执行一次,与每次实例化都执行的实例代码块和构造函数不同。 在Java中,静态代码块用于在类加载时执行一次性的初始化操作。它会在类第一次被JVM加载时自动执行,且…

    2025年12月6日 java
    000
  • 使用循环创建带参数的对象

    本文介绍了如何使用循环动态地创建对象,并使用数组中的数据作为构造函数的参数。通过示例代码展示了如何避免嵌套循环,并使用列表存储创建的对象,最后演示了如何访问和使用这些对象。 在Java编程中,经常需要根据一组数据动态地创建对象。例如,从数据库或文件中读取了一组用户信息,需要为每个用户创建一个Empl…

    2025年12月6日 java
    000
  • Java中char与String的字节表示深度解析

    本文深入探讨java中`char`类型和`string`对象在内存中的字节表示及其与字符编码的关系。`char`固定占用2字节并采用utf-16编码,而`string.getbytes()`方法返回的字节数组长度则取决于所使用的字符集,这正是导致常见混淆的关键。文章将通过示例代码和详细解释,阐明不同…

    2025年12月6日 java
    000
  • 在Java中如何进行隐式类型转换

    隐式类型转换是Java中自动将小范围数据类型向大范围类型转换的过程,遵循byte→short→int→long→float→double的顺序,char可转为int及以上类型;赋值和运算时低精度类型会自动提升为高精度类型,如int与double运算时int被提升为double;byte、short、…

    2025年12月6日 java
    000
  • ECDSA签名生成:Java到C#的JcaPEMKeyConverter替代方案

    本文针对将Java ECDSA签名生成代码迁移到C#时,`JcaPEMKeyConverter`类的替代方案问题,提供了一种基于BouncyCastle库的解决方案。通过`Org.BouncyCastle.OpenSsl.PemReader`读取私钥,并使用`SignerUtilities`类进行签…

    2025年12月6日 java
    000
  • JavaFX跨舞台UI更新:掌握数据绑定实现弹窗数据回传主界面

    本文探讨了在javafx应用中,如何实现从子舞台(弹窗)向父舞台(主界面)回传数据并更新父舞台gui元素。通过分析传统方法的局限性,文章重点介绍了利用javafx的`stringproperty`进行数据绑定的高效解决方案,确保了父子控制器间的实时通信与界面同步,避免了创建冗余控制器实例的问题。 引…

    2025年12月6日 java
    000
  • Oracle DATE 类型存储时间戳及如何仅存储日期

    本文旨在解释 Oracle 数据库中 DATE 类型总是包含时间戳的原因,并提供在数据库中存储日期时去除时间部分的方法,重点介绍如何通过格式化函数控制日期显示,而非修改数据库结构。 在 Oracle 数据库中,DATE 类型的设计初衷就是同时存储日期和时间信息。即使你只关心日期部分,DATE 类型仍…

    2025年12月6日 java
    000
  • Java中long类型转换失效?理解表达式求值与整数溢出

    当在java中将一个可能溢出的整数表达式强制转换为long时,常见的错误是由于表达式在转换前已按int类型计算而导致溢出。本文将深入解释java的类型转换规则和运算符优先级,揭示为何直接对表达式进行long类型转换会失败,并提供两种确保大整数运算准确性的正确方法,帮助开发者避免潜在的数据丢失问题。 …

    2025年12月6日 java
    000
  • Spring Boot服务层空结果处理策略:抛出异常还是返回空列表?

    在spring boot应用中,当数据查询未返回任何结果时,服务层应选择抛出`entitynotfoundexception`并返回404状态码,还是直接返回一个空列表并保持200状态码?本文将深入探讨这两种策略的适用场景、实现方式、优缺点及决策考量,旨在帮助开发者根据具体业务需求和api语义,做出…

    2025年12月6日 java
    000
  • 解决Hadoop Map任务无输出记录的问题

    本文旨在帮助开发者诊断并解决Hadoop MapReduce任务中Map阶段无输出记录的问题。通过分析常见原因,例如数据解析错误、异常处理不当以及数据类型不匹配等,提供详细的排查步骤和代码示例,确保Map任务能够正确处理输入数据并生成有效输出。 在Hadoop MapReduce编程中,Map任务的…

    2025年12月6日 java
    000
  • 解决Hadoop Map任务无输出记录问题

    本文旨在帮助开发者诊断和解决Hadoop MapReduce任务中Map阶段无输出记录的问题。通过分析常见原因,例如数据解析错误、异常处理不当以及数据类型设置错误,提供详细的排查步骤和示例代码,确保Map任务能够正确地处理输入数据并生成有效的输出。 问题分析 当Hadoop MapReduce任务的…

    2025年12月6日 java
    000
  • 在Java中如何压缩与解压ZIP文件

    Java通过java.util.zip包实现ZIP文件的压缩与解压,使用ZipOutputStream压缩文件、ZipInputStream解压文件,需注意路径安全、编码问题及资源管理。 Java提供了内置的工具来处理ZIP文件的压缩与解压,主要通过java.util.zip包中的类实现,如ZipI…

    2025年12月6日 java
    000
  • 在Java中如何实现课程报名管理功能

    首先设计Course和Student类,分别包含课程与学生的基本属性,并通过CourseRegistrationService管理报名逻辑;利用Map存储课程和学生信息,实现报名、退课与查询功能;在报名时检查课程是否已满、学生是否重复报名,确保数据一致性;最后通过测试用例验证系统正确性。该方案适用于…

    2025年12月6日 java
    000
  • 如何使用Java中的Files.walk遍历目录结构

    使用 Files.walk 可遍历目录及子目录,返回 Stream 支持函数式操作;通过设置深度参数限制层级,filter 过滤文件类型,结合 FOLLOW_LINKS 处理符号链接,适用于文件搜索与批量处理。 使用 Java 中的 Files.walk 方法可以轻松遍历目录及其子目录中的所有文件和…

    2025年12月6日 java
    000
  • 在Java中如何通过异常触发警报通知

    通过异常触发警报的核心是捕获异常并执行通知。1. 使用try-catch在关键操作中捕获已知异常,调用通知服务;2. 设置Thread.UncaughtExceptionHandler处理未捕获的线程异常,监控应用崩溃;3. 在Spring中使用@ControllerAdvice统一处理Web层异常…

    2025年12月6日 java
    000
  • 在Java中如何实现在线留言功能

    实现在线留言功能需完成用户提交、数据存储、后台管理与前端展示。使用Java的Spring Boot框架结合MySQL数据库,通过Message实体类与JPA实现数据持久化,设计包含姓名、邮箱、内容和时间的留言表,后端提供REST接口处理增删改查,前端用HTML表单和JavaScript的fetch …

    2025年12月6日 java
    000
  • 在Java REST API中优雅处理动态JSON请求体

    本文深入探讨了在Java REST API中处理结构动态变化的JSON请求体的多种策略。重点介绍了如何利用Jackson库的`JsonNode`进行灵活解析,以及通过实现自定义`JsonDeserializer`实现类型安全且可维护的动态数据映射。文章提供了详细的代码示例,帮助开发者高效应对复杂的A…

    2025年12月6日 java
    000
  • Maven多模块项目独立构建子模块时父POM查找失败的解决方案

    本文探讨Maven多模块项目中,当尝试独立构建子模块时,Maven因无法在远程仓库找到父POM而报错的常见问题。即使配置了relativePath,Maven仍可能尝试远程查找。核心解决方案是先使用mvn install -N命令将父POM非递归地安装到本地仓库,从而确保子模块构建时能正确解析父PO…

    2025年12月6日 java
    000

发表回复

登录后才能评论
关注微信