如何创建云无关的Java无服务器应用? - DZone

22-10-03 banq

在本文中,您将完成创建您的第一个可在任何云上运行的无服务器 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>
    <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.
<p class="indent">[INFO] [io.quarkus.kubernetes.deployment.KubernetesDeployer] Applied: Service knative-serving-quarkus-demo.
<p class="indent">[INFO] [io.quarkus.deployment.QuarkusAugmentor] Quarkus augmentation completed in 8952ms
<p class="indent">[INFO] ------------------------------------------------------------------------
<p class="indent">[INFO] BUILD SUCCESS
<p class="indent">[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


向部署的应用程序发送请求
使用上述命令返回的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