使用红帽企业Linux随处部署Quarkus
什么是红帽构建的Quarkus(RHBQ)
如果你不熟悉Quarkus,它是"超音速亚原子Java"。Quarkus是一个专为JVM(Java虚拟机)和GraalVM/Mandrel原生编译而设计的Kubernetes原生Java框架。Quarkus专门针对容器优化Java代码,使其成为无服务器和云环境(如Openshift)的有效平台。
Quarkus设计用于与流行的Java标准、框架和库配合使用,如Eclipse MicroProfile、Spring、Apache Kafka、RESTEasy(JAX-RS)、Hibernate ORM(JPA)、Spring、Infinispan、Camel等。
如何在RHEL上开始使用Quarkus
有多种方式可以在RHEL上开始使用Quarkus。你只需要能够从红帽的Maven仓库获取构件。这里记录了不同方法的列表。
对于新手,你可以简单地使用Web浏览器或Maven插件通过项目生成器开始,如图1所示。配置完成后,你可以下载zip文件或复制Maven命令在机器上运行。
图1. Quarkus项目生成器
在上面,你将能够看到技术预览(TP)中支持的所有扩展以及可供使用的扩展。Quarkus拥有庞大的扩展生态系统,帮助开发人员编写应用程序,如Kafka、Hibernate Reactive、Panache、Spring等。
示例:RHEL上的基本功能
在我们今天的示例中,我们已经创建了一个可以在轻量级资源高效的RHEL服务器上运行的基本应用程序,例如在边缘设备上。这个应用程序做什么?
- 设备向MQTT代理发送数据
- Quarkus使用响应式消息传递和通道接收这些消息,处理它们,并在基于浏览器的前端展示它们
- 数据通过通道实时传入
- 数据也存储在PostgreSQL数据库中
- 前端使用REST和Javascript
这篇博客指导开发人员如何在RHEL上使用podman开发和部署此应用程序。Quarkus能够检测底层容器引擎并为应用程序构建容器,如图2所示。
图2. 高层架构图
如果你想跟随操作或尝试,此应用程序的源代码位于此处。
Podman
红帽企业Linux有一个无守护进程的容器引擎。这意味着什么?RHEL使用Podman作为容器引擎。相比之下,Podman架构允许你在启动容器的用户下运行容器(fork/exec),并且此用户不需要任何root权限。由于Podman具有无守护进程架构,每个运行Podman的用户只能查看和修改自己的容器。没有CLI工具与之通信的公共守护进程。
我们将在整个示例中使用Podman。
启动代理。对于此演示,我们使用Mosquitto代理。Mosquitto轻量级且适用于从低功耗单板计算机到完整服务器的所有设备。我们在此演示中使用它作为基本简单的MQTT代理。让我们使用podman启动一个mosquitto实例:
|
|
构建我们的应用程序
假设你拥有最新的红帽构建的OpenJDK,即11版本。
你可以通过在终端上启动以下命令来检查版本:
|
|
输出:
|
|
现在我们有了Java和Mosquitto。让我们尝试启动我们的应用程序。你可以使用任何IDE(集成开发环境)来开发Quarkus。对于大多数IDE,我们有"Quarkus工具"扩展,使开发人员能够更轻松地创建Quarkus。假设你选择了自己喜欢的IDE。让我们启动Quarkus"开发模式"。
要做到这一点:
- 打开终端(从你的RHEL机器或任何IDE)
- CD进入我们的项目目录,即quarkus-edge-mqtt-demo
- 运行命令"mvn quarkus:dev"
输出应该类似,如图3所示:
图3. Quarkus开发模式
打开浏览器并导航到http://localhost:8080
你应该能够看到我们应用程序的主页,报告来自我们模拟设备的实时数据,如图4所示。在这种情况下,设备是一个模拟的ESP8266-01,它以JSON格式将温度和热量测量值从设备发送到MQTT代理。然后,这些数据被响应式通道接收,并在处理后输出到流中。浏览器读取流并实时显示数据。模拟设备可以轻松更改为真实设备,但抛出的数据应采用正确的Json格式。
图4. 来自设备的实时数据
开发人员乐趣
到目前为止,你已经在RHEL机器上有一个运行中的应用程序处于开发模式。Quarkus是为Java开发人员构建的,让他们能够轻松、舒适和快速地享受开发应用程序的乐趣。这是一个"为优化开发人员乐趣而设计的凝聚平台"。那么开发人员将从开发模式中获得什么好处?
- 零配置,实时编码和瞬间重新加载,开发时无需重新启动开发模式。Quarkus理解!
- 基于标准,但不限于此
- 统一配置
- 为80%常见用途简化代码,为20%提供灵活性
- 无忧原生可执行文件生成
例如,如果我们更改任何Java文件,我们不需要重新加载整个环境。
如果我们访问http://localhost:8080/q/dev,你还可以找到一个很棒的开发人员控制台,自RHBQ 1.11版本起可用
你应该看到以下扩展,点击SmallRye Reactive messaging “Channels”,如图5所示。
图5. Quarkus开发UI
然后你可以看到为我们的边缘设备使用的响应式流,如图6所示。
图6. 响应式流通道
有关开发模式的更多详细信息请参见此处。
使用Podman构建应用程序镜像
你可以通过使用Maven运行"-Pnative"指令为你的平台创建原生二进制文件。
但是,假设你可能没有完整的编译环境设置,如Mandrel或GraalVM安装。在这种情况下,你也可以使用容器运行时构建原生镜像。
最简单的方法是运行以下命令:
|
|
Quarkus将拾取默认容器运行时(例如,在我们的例子中是Podman)。
你还可以指定"-Dquarkus.native.container-runtime=podman"来明确选择Podman。构建镜像需要几分钟时间,通过死代码元素、类扫描、反射和构建代理来优化Quarkus应用程序。这不仅针对原生镜像进行优化,也针对JVM模式进行优化。因此,在这两种情况下,你都将看到快速的启动时间和低内存占用,如图7所示。
图7. Quarkus构建过程
你还可以通过设置quarkus.native.native-image-xmx配置属性来限制原生编译期间使用的内存量。设置低内存限制可能会增加构建时间。
你也可以使用podman创建带有我们二进制文件的容器镜像。
在src/main下,Quarkus为你的应用程序预生成了不同的Dockerfile。在我们的示例中,我们将使用原生版本,因为我们已经创建了原生二进制文件。
在我们的项目主目录中执行以下命令:
|
|
最后,运行以下命令在你的RHEL机器上启动容器:
|
|
返回http://localhost:8080。然后,你应该看到我们的应用程序正在运行并显示来自我们设备的传入数据。
总结
Quarkus是适用于多种用例的Java框架。无论你是在边缘网关上运行,还是创建无服务器功能,或是在Kubernetes/OpenShift等云环境上部署,Quarkus都提供开发人员的便利和乐趣,为云端的Java应用程序带来性能,其运营效率使得在任何地方运行都能节省成本。
在这篇博客中,我们学习了:
- 在RHEL上使用Quarkus
- 在RHEL上使用Quarkus(RHBQ)
- 开发模式
- 使用和不使用podman创建Java原生可执行文件
- 在RHEL上使用Podman创建镜像
资源
发布说明,入门指南,文档
想通过示例了解更多关于Quarkus的信息,请参见此处
书籍《Practising Quarkus》,《Understanding Quarkus》
Quarkus备忘单,Quarkus参考卡
介绍Quarkus:下一代Java框架