无服务器 Java 之旅始于函数——按需运行的小代码片段。这个阶段并没有持续多久。尽管基于 1.0 阶段虚拟机架构的函数使这种范例非常流行,但如下图所示,在执行时间、协议和糟糕的本地开发体验方面存在限制。
然后开发人员意识到,他们可以将相同的无服务器特性和优势应用于微服务和 Linux 容器。这启动了 1.5 阶段,其中一些无服务器容器完全抽象了 Kubernetes,通过 Knative 或位于其顶部的另一个抽象层提供无服务器体验。
在 2.0 阶段,无服务器开始处理更复杂的编排和集成模式,并结合某种程度的状态管理。更重要的是,开发人员希望继续使用熟悉的应用程序运行时 Java,在遗留系统中运行无服务器和非无服务器工作负载的组合。

(Daniel Oh, CC BY-SA 4.0)
在 Java 开发人员可以开始开发新的无服务器函数之前,他们的首要任务是选择一个新的云原生 Java 框架,该框架允许他们以比传统单体应用更快的速度和更小的内存占用运行 Java 函数。这可以应用于各种基础设施环境,从物理服务器到虚拟机,再到多云和混合云环境中的容器。
开发人员可能会考虑有主见的 Spring 框架,该框架在 Spring Cloud Function 中使用 java.util.function
包来支持命令式和响应式函数的开发。Spring 还使开发人员能够将 Java 函数部署到可安装的无服务器平台,例如 Kubeless、 Apache OpenWhisk、 Fission 和 Project Riff。但是,人们担心 Spring 的启动和响应时间缓慢,以及消耗大量内存的进程。当在 Kubernetes 等可扩展的容器环境中运行 Java 函数时,这个问题可能会更糟。
Quarkus 是一个新的开源云原生 Java 框架,可以帮助解决这些问题。它旨在设计无服务器应用程序并编写云原生微服务,以在云基础设施(例如 Kubernetes)上运行。
Quarkus 重新思考了 Java,使用封闭世界方法来构建和运行它。它已将 Java 变成一个可与 Go 相媲美的运行时。Quarkus 还包括 100 多个扩展,这些扩展集成了企业级功能,包括数据库访问、无服务器集成、消息传递、安全性、可观察性和业务自动化。
这是一个快速示例,说明开发人员如何使用 Quarkus 搭建 Java 无服务器函数项目。
1. 创建一个 Quarkus 无服务器 Maven 项目
开发人员有多种选择来安装本地 Kubernetes 集群,包括 Minikube 和 OKD (OpenShift Kubernetes 发行版)。本教程使用 OKD 集群作为开发人员的本地环境,因为在 Knative 和 DevOps 工具上轻松设置无服务器功能。这些关于 OKD 安装 和 Knative 运算符安装 的指南提供了有关设置它们的更多信息。
以下命令生成一个 Quarkus 项目(例如,quarkus-serverless-restapi
),以暴露一个简单的 REST API 并下载一个用于 Knative 服务部署的 quarkus-openshift
扩展
$ mvn io.quarkus:quarkus-maven-plugin:1.13.4.Final:create \
-DprojectGroupId=org.acme \
-DprojectArtifactId=quarkus-serverless-restapi \
-Dextensions="openshift" \
-DclassName="org.acme.getting.started.GreetingResource"
2. 在本地运行无服务器函数
使用 Quarkus 开发模式运行应用程序,以检查 REST API 是否工作,然后稍微调整代码
$ ./mvnw quarkus:dev
输出将如下所示
__ ____ __ _____ ___ __ ____ ______
--/ __ \/ / / / _ | / _ \/ //_/ / / / __/
-/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
INFO [io.quarkus] (Quarkus Main Thread) quarkus-serverless-restapi 1.0.0-SNAPSHOT on JVM (powered by Quarkus xx.xx.xx.) started in 2.386s. Listening on: http://localhost:8080
INFO [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
INFO [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, kubernetes, resteasy]
注意:保持您的 Quarkus 应用程序运行以使用 Live Coding。这允许您避免在代码更改时必须重建、重新部署应用程序和重启运行时。
现在您可以使用快速 curl
命令访问 REST API。输出应为 Hello RESTEasy
$ curl localhost:8080/hello
Hello RESTEasy
调整 GreetingResource.java
中的返回文本
public String hello() {
return "Quarkus Function on Kubernetes";
}
当您重新调用 REST API 时,您将看到新的输出
$ curl localhost:8080/hello
Quarkus Function on Kubernetes
普通微服务和无服务器函数之间没有太大区别。Quarkus 的一个好处是,它使开发人员能够使用任何微服务将 Kubernetes 部署为无服务器函数。
3. 将函数部署到 Knative 服务
如果您尚未执行此操作,请在您的 OKD (Kubernetes) 集群上创建一个命名空间(例如,quarkus-serverless-restapi
),以部署此 Java 无服务器函数。
Quarkus 使开发人员能够通过在 src/main/resources/application.properties
中添加以下变量来生成 Knative 和 Kubernetes 资源
quarkus.container-image.group=quarkus-serverless-restapi <1>
quarkus.container-image.registry=image-registry.openshift-image-registry.svc:5000 <2>
quarkus.kubernetes-client.trust-certs=true <3>
quarkus.kubernetes.deployment-target=knative <4>
quarkus.kubernetes.deploy=true <5>
quarkus.openshift.build-strategy=docker <6>
图例
<1> 定义您在其中部署无服务器应用程序的项目名称
<2> 要使用的容器注册表
<3> 在此简单示例中使用自签名证书以信任它们
<4> 启用 Knative 资源的生成
<5> 指示扩展在构建容器镜像后部署到 OpenShift
<6> 设置 Docker 构建策略
此命令构建应用程序,然后将其直接部署到 OKD 集群
$ ./mvnw clean package -DskipTests
注意: 确保提前使用
oc login
命令登录到正确的项目(例如,quarkus-serverless-restapi
)。
输出应以 BUILD SUCCESS
结尾。
使用此 oc
命令向 Knative 服务添加 Quarkus 标签
$ oc label rev/quarkus-serverless-restapi-00001
app.openshift.io/runtime=quarkus --overwrite
然后访问 OKD Web 控制台以转到开发者透视图中的拓扑视图。您可能会看到您的 Pod(无服务器函数)已缩减到零(白色圆圈)。

(Daniel Oh, CC BY-SA 4.0)
4. 在 Kubernetes 上测试函数
通过运行以下 oc
命令检索无服务器函数的路由 URL
$ oc get rt/quarkus-serverless-restapi
[...]
NAME URL READY REASON
quarkus-serverless[...] http://quarkus[...].SUBDOMAIN True
使用 curl
命令访问路由 URL
$ curl http://quarkus-serverless-restapi-quarkus-serverless-restapi.SUBDOMAIN/hello
在几秒钟内,您将获得与本地相同的结果
Quarkus Function on Kubernetes
当您返回到 OKD 集群中的拓扑视图时,Knative 服务会自动扩展。

(Daniel Oh, CC BY-SA 4.0)
由于 Knative Serving 的默认设置,此 Knative 服务 Pod 将在 30 秒后再次缩减为零。
接下来是什么?
无服务器之旅已经发展,从虚拟机上的函数到无服务器容器,再到与企业遗留系统集成。在此过程中,企业开发人员仍然可以使用熟悉的 Java 等技术来开发无服务器函数,方法是使用 Quarkus 创建项目,然后构建并将其部署到具有 Knative 服务的 Kubernetes。
本系列中的下一篇文章将指导您如何在 Kubernetes 中优化 Java 无服务器函数,以实现更快的启动时间和大规模的小内存占用。
1 条评论