通过Quarkus远程开发增强开发循环


Kubernetes是云原生微服务和无服务器架构的既定基础层。通过自动化应用程序的部署,扩展和管理,Kubernetes在内部循环开发(本地编码,构建,运行和测试应用程序)和外部循环开发(集成测试,连续部署和安全性)方面改变了开发人员的日常工作流程。使用Kubernetes的开发人员还必须计划容器化,调试pod内的代码以及自动化测试用例。

在本文中,您将看到使用Quarkus远程开发如何增强Kubernetes上的开发循环。我们将建立一个新的Quarkus项目,然后将其配置为在远程Red Hat OpenShift集群上进行实时编码,就像在本地开发环境中一样。

步骤1:创建一个新的Quarkus项目

我们将使用Maven插件通过以下命令构建新项目:

$ mvn io.quarkus:quarkus-maven-plugin:1.11.1.Final:create \
    -DprojectGroupId=org.acme \
    -DprojectArtifactId=quarkus-remote \
    -DprojectVersion=1.0.0-SNAPSHOT \
    -DclassName="org.acme.GreeterResource" \
    -Dextensions="openshift"

该命令生成一个quarkus-remote包含新Quarkus项目的目录。在中打开GreeterResource.java类文件时src/main/java/org/acme,您将看到一个简单的RESTful API:

@Path("/hello")
public class GreeterResource {

   @GET
   @Produces(MediaType.TEXT_PLAIN)
   public String hello() {
       return "Hello RESTEasy";
   }
}

第2步:在本地环境中进行实时编码

Quarkus带有内置开发模式,可通过后台编译进行热部署。在更改了正在运行的应用程序中的代码,资源或配置之后,您只需要刷新Web浏览器或调用项目的RESTful API即可使更改自动生效。要在本地运行您的应用程序,请在项目的主目录中执行以下命令:

$ mvn quarkus:dev

您将看到实时编码已被激活:

INFO  [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.

使用以下curl命令调用应用程序的RESTful API端点:

$ curl http:/localhost:8080/hello

输出应为:

Hello RESTEasy

返回中的GreeterResource.java类文件src/main/java/org/acme。更改hello()方法中的代码:

return "Hello RESTEasy from Local";

保存文件,然后使用相同的curl命令重新调用端点。新的输出应为:

Hello RESTEasy from Local

调用RESTful API会触发对工作区的扫描。如果检测到任何更改,将编译Java文件,并重新部署应用程序,并且重新部署的应用程序将为您的请求提供服务。如果在运行的Quarkus运行时中检查日志,则应该看到检测到的源文件:

INFO  [io.qua.dep.dev.RuntimeUpdatesProcessor] (vert.x-worker-thread-4) Changed source files detected, recompiling [/Users/danieloh/Downloads/quarkus-remote/src/main/java/me/daniel/GreeterResource.java]

命中CTRL + C,当你准备停止应用程序。

步骤3:构建和部署可变的应用程序

如果要将内部循环开发周期扩展到远程容器环境(如Kubernetes或OpenShift),该怎么办?您可以在远程开发模式下配置应用程序,以使对本地文件的更改在远程容器环境中立即可见。

要进行远程开发,您需要使用该mutable-jar格式构建可变的应用程序。然后,您可以使用OpenShift扩展和Maven插件将应用程序部署到远程OpenShift集群。将以下配置添加到Quarkus项目的application.properties文件中:

# Mutable Jar configurations
quarkus.package.type=mutable-jar
quarkus.live-reload.password=changeit

# OpenShift Extension Configurations
quarkus.container-image.build=true
quarkus.kubernetes-client.trust-certs=true
quarkus.kubernetes.deployment-target=openshift
quarkus.openshift.expose=true
quarkus.openshift.env-vars.quarkus-launch-devmode.value=true

请注意,您可以将密码更改为所需的任何密码。它用于保护远程端和本地端之间的通信。

在您的OpenShift集群中打开可变应用程序 要登录OpenShift集群,您必须安装oc命令行界面并使用oc登录名。CLI的安装选项将根据您的操作系统而有所不同。

假设已oc安装,请在Quarkus项目主目录中执行以下命令:

$ oc new-project quarkus-remote
$ mvn clean package -DskipTests -Dquarkus.kubernetes.deploy=true

此命令在远程OpenShift集群中创建一个新项目。可变的JAR将打包并部署到OpenShift。输出应以结尾BUILD SUCCESS。

在OpenShift控制台中检查应用程序

到目前为止,一切都很好。现在,让我们转到OpenShift集群中的Developer控制台,然后浏览Topology视图。您将看到您的Quarkus应用程序已部署。单击“查看日志”以查看可变应用程序的部署方式,如图1所示。

1613396211925.png

您应该Profile dev activated. Live Coding activated在pod日志中看到输出“ ”,如图2所示。

1613396249528.png

检查应用程序的RESTful API

返回拓扑视图以访问应用程序的RESTful API。单击图3中突出显示的Open URL图标。

1613396278729.png

附加/hello在应用程序的路由URL上。当您检查它时,您应该在本地环境中看到相同的输出:

1613396297722.png

步骤4:在远程开发模式下运行应用程序

最后一步是将本地代理连接到OpenShift上的远程主机。首先,将quarkus.live-reload.url配置附加到application.properties文件中。请注意,您将需要删除或注释OpenShift扩展配置,以便在您更改代码时它们不会触发源到图像的构建:

# Mutable Jar configurations
quarkus.package.type=mutable-jar
quarkus.live-reload.password=changeit
quarkus.live-reload.url=http://YOUR_APP_ROUTE_URL

# OpenShift Extension Configurations
# quarkus.container-image.build=true
# quarkus.kubernetes-client.trust-certs=true
# quarkus.kubernetes.deployment-target=openshift
# quarkus.openshift.expose=true
# quarkus.openshift.env-vars.quarkus-launch-devmode.value=true

使用以下remote-dev命令执行远程开发模式:

$ mvn quarkus:remote-dev

输出应以结尾Connected to remote server。现在,您可以在运行应用程序的相同环境中进行开发,并且可以访问相同的服务。

接下来,返回中的GreeterResource.java类文件src/main/java/org/acme,然后更改hello()方法中的代码:

return "Hello RESTEasy from OpenShift";

保存文件,然后刷新浏览器。输出应该如图5所示。

1613396317115.png

每次刷新浏览器时,您应该看到本地更改在远程应用程序中立即可见。基于HTTP的长轮询传输通过HTTP调用同步本地工作空间和远程应用程序。这是本地Quarkus运行时中的日志输出示例:

INFO  [io.qua.dep.dev.RuntimeUpdatesProcessor] (Remote dev client thread) Changed source files detected, recompiling [/Users/danieloh/Downloads/quarkus-remote/src/main/java/me/daniel/GreeterResource.java]
...

INFO  [io.qua.ver.htt.dep.dev.HttpRemoteDevClient] (Remote dev client thread) Sending dev/app/me/daniel/GreeterResource.class
INFO  [io.qua.ver.htt.dep.dev.HttpRemoteDevClient] (Remote dev client thread) Sending quarkus-run.jar
...

惊人的!在实施应用程序的新业务需求时,您应该准备享受内循环开发的经验。

注意:在生产中使用Quarkus的远程开发模式可能会导致正在运行的应用程序发生意外的功能更改。只有在开发应用程序时才应使用远程开发。

结论

您可以使用Quarkus通过将实时编码功能从本地计算机连接到远程容器环境(例如OpenShift)来增强开发循环。能够在云本地Java运行时中进行远程开发可以简化开发工作流程-从编写代码到快速构建,运行,调试和部署微服务。


原文链接:http://codingdict.com