Kotlin 上的无服务器函数:AWS Lambda 及替代方案

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Kotlin 上的无服务器:AWS Lambda 及类似平台 — 编写可运行的无服务器代码

\n

曾几何时,编写后端就意味着配置服务器、设置 Nginx 以及因监控负载而彻夜不眠。如今,一切都不同了。无服务器并非幻想,而是一种现实,它让您能够忘记硬件,专注于应用程序的逻辑。而如果您使用 Kotlin 编写代码,您将获得优雅、安全且快速的代码,它完美契合无服务器架构。

\n

在本文中,我们将探讨如何创建 Kotlin 上的无服务器函数,哪些云服务商提供最佳条件,以及如何避免在配置细节中迷失方向。开始吧!

\n\n

什么是无服务器,为什么 Kotlin 是理想选择

\n

无服务器(或无服务器计算)是一种云计算模型,您编写代码,而基础设施由服务商负责。您无需为闲置的服务器付费——只需为函数的实际执行时间付费。听起来像梦想?对于 Kotlin 来说尤其如此。

\n

为什么是 Kotlin?首先,它编译为 JVM 字节码,因此在 AWS Lambda、Google Cloud Functions 和 Azure Functions 上获得原生支持。其次,Kotlin 是一种现代语言,具有零成本抽象、lambda 表达式和协程。第三,其语法允许编写简洁且易于维护的代码。

\n

Kotlin 上的无服务器函数的主要优势:

\n
    \n
  • 节省成本 — 仅为代码的实际执行付费。
  • \n
  • 自动扩展 — 云服务自行决定启动多少个实例。
  • \n
  • 简单易用 — 无需配置服务器。
  • \n
  • 快速启动 — 一键部署。
  • \n
\n

但也存在细微差别:“冷启动”可能需要几秒钟,尤其是对于 JVM 语言。然而,现代服务商已经学会了应对这一问题:AWS Lambda 的 Provisioned Concurrency 或 Google Cloud Functions 的 min-instances 可以解决这个问题。

\n\n

AWS Lambda:无服务器计算之王

\n

我们从最流行的服务开始——AWS Lambda。Amazon Web Services 提供了一个成熟的生态系统,Kotlin 通过 Java Runtime 即可“开箱即用”。

\n

如何为 Kotlin 配置 AWS Lambda

\n

您需要 Gradle 或 Maven。我们使用带有 Kotlin 插件的 Gradle。示例 build.gradle.kts:

\n
plugins {\n    kotlin("jvm") version "1.9.0"\n    id("com.github.johnrengelman.shadow") version "7.1.2"\n}\n\ndependencies {\n    implementation("com.amazonaws:aws-lambda-java-core:1.2.2")\n    implementation("com.amazonaws:aws-lambda-java-events:3.11.0")\n}\n\ntasks {\n    shadowJar {\n        archiveBaseName.set("lambda-function")\n        archiveClassifier.set("")\n    }\n}
\n

现在我们来编写函数本身。AWS Lambda 期望一个包含 handleRequest 方法的类。这是一个返回问候语的简单处理器:

\n
import com.amazonaws.services.lambda.runtime.Context\nimport com.amazonaws.services.lambda.runtime.RequestHandler\n\nclass HelloHandler : RequestHandler<Map<String, String>, String> {\n    override fun handleRequest(input: Map<String, String>, context: Context): String {\n        val name = input["name"] ?: "World"\n        return "Hello, $name! 您的 Kotlin 无服务器函数正在运行!"\n    }\n}
\n

构建 fat JAR:./gradlew shadowJar。上传到 AWS Lambda,指定运行时为 Java 11 或 Java 17。完成!

\n

处理 AWS 事件

\n

Lambda 经常响应 S3、DynamoDB 或 API Gateway 的事件。S3 的处理器示例:

\n
import com.amazonaws.services.lambda.runtime.events.S3Event\n\nclass S3Handler : RequestHandler<S3Event, String> {\n    override fun handleRequest(event: S3Event, context: Context): String {\n        val bucket = event.records.f                

博客

书籍推荐