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

图片来源:
(丹尼尔哦,CC BY-SA 4.0)
在 Java 开发人员开始开发新的无服务器功能之前,他们的首要任务是选择一个新的云原生 Java 框架,与传统的单体应用程序相比,该框架允许他们以更小的内存占用更快地运行 Java 功能。这可以应用于各种基础架构环境,从物理服务器到虚拟机,再到多云和混合云环境中的容器。
更多关于 Java
-
什么是企业Java编程?
-
Red Hat 构建的 OpenJDK
-
Java 备忘单
-
免费在线课程:使用微服务架构开发云原生应用程序
-
Java 新鲜文章
开发人员可能会考虑一个自以为是的 Spring 框架,它使用Spring Cloud Function中的java.util.function包来支持命令式和响应式函数的开发。 Spring also enables developers to deploy Java functions to installable serverless platforms such as Kubeless, Apache OpenWhisk, Fission, and Project Riff.但是,对于 Spring 的启动和响应时间缓慢以及消耗大量内存的过程存在担忧。在 Kubernetes 等可扩展容器环境中运行 Java 函数时,这个问题可能会更严重。
Quarkus是一个新的开源云原生 Java 框架,可以帮助解决这些问题。它旨在设计无服务器应用程序并编写在云基础设施(例如 Kubernetes)上运行的云原生微服务。
Quarkus 重新思考 Java,使用封闭世界的方法来构建和运行它。它将 Java 变成了可与 Go 相媲美的运行时。 Quarkus 还包括 100 多个集成企业功能的扩展,包括数据库访问、无服务器集成、消息传递、安全性、可观察性和业务自动化。
这是开发人员如何使用 Quarkus 构建 Java 无服务器函数项目的快速示例。
1.创建 Quarkus 无服务器 Maven 项目
开发人员有多种选择来安装本地 Kubernetes 集群,包括Minikube和OKD(OpenShift Kubernetes Distribution)。本教程将 OKD 集群用于开发人员的本地环境,因为在 Knative 和 DevOps 工具上轻松设置无服务器功能。这些OKD 安装指南和Knative 操作员安装提供了有关设置它们的更多信息。
以下命令生成 Quarkus 项目(例如quarkus-serverless-restapi)以公开简单的 REST API 并下载quarkus-openshift扩展以用于 Knative 服务部署:
$ mvn io.quarkus:quarkus-maven-plugin:1.13.4.Final:create \
-DprojectGroupId\u003dorg.acme \
-DprojectArtifactId\u003dquarkus-serverless-restapi\
-扩展\u003d"openshift" \
-DclassName\u003d"org.acme.getting.started.GreetingResource"
2.在本地运行无服务器功能
使用 Quarkus 开发模式运行应用程序以检查 REST API 是否工作,然后稍微调整代码:
$ ./mvnw quarkus:dev
输出将如下所示:
__ ____ __ _____ ___ __ ____ ___ ___
--/ __ / / / / _ | / _ / //_/ / / / __/
-/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\__\\___/_/ |_/_/|_/_/|_|\__ _/___/
INFO [io.quarkus](Quarkus 主线程) JVM 上的 quarkus-serverless-restapi 1.0.0-SNAPSHOT(由 Quarkus xx.xx.xx 提供支持。)于 2.386 秒开始。监听:http://localhost:8080
信息 [io.quarkus](Quarkus 主线程)配置文件开发已激活。激活实时编码。
INFO [io.quarkus](Quarkus 主线程)已安装的功能:[cdi, kubernetes, resteasy]
注意:保持 Quarkus 应用程序运行以使用 Live Coding。这使您可以避免在代码更改时重新构建、重新部署应用程序和重新启动运行时。
现在您可以使用快速curl命令访问 REST API。输出应该是Hello RESTEasy:
$ curl 本地主机:8080/你好
你好 RESTEasy
调整GreetingResource.java中的返回文本:
公共字符串hello() {
返回“Kubernetes 上的 Quarkus 函数”;
}
当您重新调用 REST API 时,您将看到新的输出:
$ curl 本地主机:8080/你好
Kubernetes 上的 Quarkus 函数
普通微服务和无服务器功能之间没有太大区别。 Quarkus 的一个好处是它使开发人员能够使用任何微服务将 Kubernetes 部署为无服务器功能。
3.将函数部署到 Knative 服务
如果您还没有,在您的 OKD (Kubernetes) 集群上创建一个命名空间(例如quarkus-serverless-restapi)来部署这个 Java 无服务器功能。
Quarkus 通过在src/main/resources/application.properties中添加以下变量,使开发人员能够生成 Knative 和 Kubernetes 资源:
quarkus.container-image.groupu003dquarkus-serverless-restapi <1>
quarkus.container-image.registryu003dimage-registry.openshift-image-registry.svc:5000 <2>
quarkus.kubernetes-client.trust-certsu003dtrue <3>
quarkus.kubernetes.deployment-targetu003dknative <4>
quarkus.kubernetes.deployu003dtrue <5>
quarkus.openshift.build-strategyu003ddocker <6>
图例:
<1> 定义部署无服务器应用程序的项目名称
<2> 要使用的容器注册表
<3> 在这个简单的示例中使用自签名证书来信任它们
<4> 启用 Knative 资源的生成
<5> 在构建容器镜像后指示扩展部署到 OpenShift
<6> 设置 Docker 构建策略
此命令构建应用程序,然后将其直接部署到 OKD 集群:
$ ./mvnw clean package -DskipTests
注意: 请务必提前使用
oc login命令登录正确的项目(例如quarkus-serverless-restapi)。
输出应以BUILD SUCCESS结尾。
使用以下oc命令将 Quarkus 标签添加到 Knative 服务:
$ oc 标签 rev/quarkus-serverless-restapi-00001
app.openshift.io/runtime\u003dquarkus --覆盖
然后访问 OKD Web 控制台,转到 Developer 透视图中的拓扑视图。您可能会看到您的 pod(无服务器功能)已经缩小到零(白线圆圈)。

图片来源:
(丹尼尔哦,CC BY-SA 4.0)
4.在 Kubernetes 上测试功能
通过运行以下oc命令检索无服务器功能的路由URL:
$ oc 获取 rt/quarkus-serverless-restapi
[...]
名称 网址 准备好原因
quarkus-serverless[...] http://quarkus[...].SUBDOMAIN 真
使用curl命令访问路由URL:
$ curl http://quarkus-serverless-restapi-quarkus-serverless-restapi.SUBDOMAIN/hello
几秒钟后,您将获得与本地相同的结果:
Quarkus Function on Kubernetes
当您返回 OKD 集群中的 Topology 视图时,Knative 服务会自动扩展。

图片来源:
(丹尼尔哦,CC BY-SA 4.0)
由于 Knative 服务的默认设置,此 Knative 服务 pod 将在 30 秒内再次降为零。
下一步是什么?
无服务器之旅已经发展,从虚拟机上的功能到无服务器容器以及与企业遗留系统的集成。在此过程中,企业开发人员仍然可以使用熟悉的技术(如 Java)来开发无服务器功能,方法是使用 Quarkus 创建一个项目,然后使用 Knative 服务构建并将其部署到 Kubernetes。
本系列的下一篇文章将指导您优化 Kubernetes 中的 Java 无服务器功能,以实现更快的启动时间和更小的大规模内存占用。
更多推荐
所有评论(0)