使用 Java 创建你的第一个Cloud-Agnostic Serverless应用程序

1,468 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情

如果你不熟悉Cloud-Agnostic Serverless(云无关)服务,那么为Serverless基础架构创建一个简单的应用程序是一个不错的起点。

在本文中,将完成创建你的第一个可在任何云上运行的Serverless Java 应用程序的步骤。

什么是Serverless?

与名称相反,Serverless中仍然存在服务器,但你无需担心管理它们。你只需要部署容器,Serverless基础架构负责为你的应用程序扩展或缩减资源,它会在有高需求时自动扩展,或者在没有需求时自动缩减至零。这将减少你在云上的开销。

你会创造什么?

您将使用 Quarkus 创建一个简单的 Java 应用程序,该应用程序向 HTTP 请求返回问候消息并将其部署到 Knative。

为什么选择 Knative?

一开始,Serverless应用程序通常由一小段代码组成,这些代码由云供应商运行。在第一阶段,应用程序有一些限制,并且与供应商库紧密耦合。

Knative 使开发人员能够在 Kubernetes 集群上运行Serverless应用程序。这使您可以灵活地在任何云、本地甚至混合所有应用程序上运行你的应用程序。

为什么选择Quarkus?

因为无服务器应用程序需要快速启动。

由于 Serverless 的最大优势是按需扩展和缩减(甚至为零),因此 serverless 应用程序在扩展时需要快速启动,否则请求将被拒绝。

Quarkus 应用程序的最大特点之一是它们的超快速启动。

此外,Quarkus 是Kubernetes Native,这意味着可以轻松地将 Quarkus 应用程序部署到 Kubernetes,而无需了解底层 Kubernetes 框架的复杂性。

要求

  • 本地 Knative 安装。

    • 本文使用 minikube 作为本地 Kubernetes 集群
  • kn已安装 CLI。

  • JDK 11+ 安装了适当配置的 JAVA_HOME

  • Apache Maven 3.8.1+

  • GraalVM(可选部署原生镜像)

创建 Quarkus 应用程序

注意: 如果您不想创建应用程序,您可以从GitHub克隆它并跳到将您的应用程序部署到 Knative

mvn io.quarkus.platform:quarkus-maven-plugin:2.11.2.Final:create \
    -DprojectGroupId=org.acme \
    -DprojectArtifactId=knative-serving-quarkus-demo
cd knative-serving-quarkus-demo

在本地运行您的应用程序

要验证您是否正确创建了项目,请通过运行以下命令在本地运行该项目:

mvn quarkus:dev
__  ____  __  _____   ___  __ ____  ______ 
 --/ __ / / / / _ | / _ / //_/ / / / __/ 
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \   
--________/_/ |_/_/|_/_/|_|____/___/   
2022-08-15 16:50:25,135 INFO  [io.quarkus] (Quarkus Main Thread) knative-serving-quarkus-demo 1.0.0-SNAPSHOT on JVM (powered by Quarkus 2.11.2.Final) started in 1.339s. Listening on: http://localhost:8080
2022-08-15 16:50:25,150 INFO  [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
2022-08-15 16:50:25,150 INFO  [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, resteasy-reactive, smallrye-cont

在不同的终端窗口或浏览器中,您可以通过向http://localhost:8080/hello 发送请求来访问应用程序:

curl -X 'GET' 'http://localhost:8080/hello' -H 'accept: text/plain'

如果看到以下输出,则已成功创建应用程序:

Hello from RESTEasy Reactive

点击Ctrl+C停止应用程序。

准备将应用程序以部署到 Knative

添加所需的依赖项

将以下依赖项添加到pom.xml文件中:

<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-kubernetes</artifactId>
</dependency>
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-container-image-jib</artifactId>
</dependency>

配置应用程序以部署到 Knative

将以下配置添加到src/main/resources/application.properties文件中:

quarkus.kubernetes.deployment-target=knative
quarkus.container-image.group=dev.local/hbelmiro

注意:quarkus.container-image.group属性中,替换hbelmiro为您的容器注册表用户名。

将应用程序部署到 Knative

启动 Minikube 隧道

注意: 仅当您使用 minikube 作为本地 Kubernetes 集群时,才需要执行此步骤。

在不同的终端窗口中,运行以下命令来启动 minikube 隧道:

minikube tunnel --profile knative

您应该会看到类似于以下内容的输出:

Status:    
    machine: knative
    pid: 223762
    route: 10.96.0.0/12 -> 192.168.49.2
    minikube: Running
    services: [kourier]
    errors: 
        minikube: no errors
        router: no errors
        loadbalancer emulator: no errors

保持终端窗口打开并运行上述命令。

配置容器 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.
[INFO] [io.quarkus.kubernetes.deployment.KubernetesDeployer] Applied: Service knative-serving-quarkus-demo.
[INFO] [io.quarkus.deployment.QuarkusAugmentor] Quarkus augmentation completed in 8952ms
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

检查 Knative 部署的服务

运行以下命令检查 Knative 部署的服务:

kn service list

将会在已部署的服务中看到您的应用程序,如下所示:

NAME                           URL                                                                   LATEST                               AGE   CONDITIONS   READY   REASON
knative-serving-quarkus-demo   http://knative-serving-quarkus-demo.default.10.106.207.219.sslip.io   knative-serving-quarkus-demo-00001   23s   3 OK / 3     True

提示:在上述输出中,检查应用程序的 READY 状态。如果状态不是True,则需要等待应用准备好,否则部署有问题。

向已部署的应用程序发送请求

使用上述命令返回的 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

Going Native

可以创建应用程序的本机映像,以使其启动更快。为此,请使用以下命令部署您的应用程序:

mvn clean package -Pnative -Dquarkus.native.native-image-xmx=4096m -Dquarkus.native.remote-container-build=true -Dquarkus.kubernetes.deploy=true

提示:-Dquarkus.native.native-image-xmx=4096m是 Quarkus 可用于生成本机图像的内存量。您应该根据本地机器的规格对其进行调整或完全删除它。

现在已准备好使用 Java 运行Cloud-Agnostic Serverless应用程序

Quarkus 和 Knative 让你可以自由地在本地或云中使用 Java 运行无服务器应用程序,无论供应商如何。你甚至可以将多个云供应商与您的本地基础设施混合使用。这种灵活性的优势是快捷部署并降低基础架构成本。