在本文中,您将完成创建您的第一个可在任何云上运行的无服务器 Java 应用程序的步骤。
什么是无服务器?与名称相反,无服务器中仍然存在服务器,但您无需担心管理它们。您只需要部署容器,无服务器基础架构负责为您的应用程序扩展或缩减提供资源。
最好的部分是它会在有高需求时自动扩展,或者在没有需求时自动扩展至零。这将减少您在云上花费的金额。
将使用 Quarkus 创建一个简单的 Java 应用程序,该应用程序向 HTTP 请求返回问候消息并将其部署到 Knative。
为什么选择 Knative?一开始,无服务器应用程序通常由一小段代码组成,这些代码由云供应商(如 AWS Lambda)运行。在第一阶段,应用程序有一些限制,并且与供应商库紧密耦合。
Knative 使开发人员能够在 Kubernetes 集群上运行无服务器应用程序。这使您可以灵活地在任何云、本地甚至混合所有应用程序上运行您的应用程序。
无服务器应用程序需要快速启动:由于 serverless 的最大优势是按需扩展和缩减(甚至为零),因此 serverless 应用程序在扩展时需要快速启动,否则请求将被拒绝。
Quarkus 应用程序的最大特点之一是它们的超快速启动。
此外,Quarkus 是Kubernetes Native,这意味着可以轻松地将 Quarkus 应用程序部署到 Kubernetes,而无需了解底层 Kubernetes 框架的复杂性。
要求
- 本地 Knative 安装。请参阅使用快速入门安装 Knative
- 本文使用 minikube 作为本地 Kubernetes 集群
- kn已安装 CLI。请参阅Knative CLI 工具
- JDK 11+ 安装了适当配置的 JAVA_HOME
- Apache Maven 3.8.1+
- GraalVM(可选部署原生镜像)
创建 Quarkus 应用程序:可以从GitHub克隆
准备部署到 Knative:
添加所需的依赖项
将以下依赖项添加到pom.xml文件中:
<dependency> |
配置应用程序以部署到 Knative:
将以下配置添加到src/main/resources/application.properties文件中:
quarkus.kubernetes.deployment-target=knative |
注意:在quarkus.container-image.group属性中,替换hbelmiro为您的容器注册表用户名。
部署到 Knative
启动 Minikube 隧道
注意:仅当您使用 minikube 作为本地 Kubernetes 集群时,才需要执行此步骤。
在不同的终端窗口中,运行以下命令来启动 minikube 隧道:
minikube tunnel --profile knative |
输出类似如下:
Status: |
配置容器 CLI 以使用 Minikube 内的容器引擎:
eval $(minikube -p knative docker-env) |
运行以下命令将应用程序部署到 Knative:
mvn clean package -Dquarkus.kubernetes.deploy=true |
您应该会看到类似于以下内容的输出:
[INFO] [io.quarkus.kubernetes.deployment.KubernetesDeployer] Deploying to knative server: https://192.168.49.2:8443/ in namespace: default. |
检查Knative部署的服务
运行以下命令来检查Knative部署的服务。
kn service list |
你应该看到你的应用程序列在已部署的服务中,如下所示:
NAME URL LATEST AGE CONDITIONS READY REASON |
向部署的应用程序发送请求
使用上述命令返回的URL,向部署的应用程序发送请求。
curl -X 'GET' 'http://knative-serving-quarkus-demo.default.10.106.207.219.sslip.io/hello' -H 'accept: text/plain' 。 |
你应该看到以下输出:
Hello from RESTEasy Reactive |
完成!
Quarkus 和 Knative 让您可以自由地在本地或云中使用 Java 运行无服务器应用程序,无论供应商如何。您甚至可以将多个云供应商与您的本地基础设施混合使用。这种灵活性为您带来敏捷性并降低基础架构成本。
最后,完善:
可以创建应用程序的本机映像,以使其启动更快。为此,请使用以下命令部署您的应用程序:
mvn clean package -Pnative -Dquarkus.native.native-image-xmx=4096m -Dquarkus.native.remote-container-build=true -Dquarkus.kubernetes.deploy=true |