Quarkus:开始使用Kubernetes-native Java

347 阅读7分钟

Quarkus:开始使用Kubernetes-native Java

红帽的Quarkus是一个为容器和云环境设计的全栈式、开源的Java框架。看看为什么它是Spring的一个值得信赖的替代品。

Quarkus是红帽公司在2019年推出的一个全栈式的开源Java框架。Quarkus是Spring的一个替代品(尽管它也可以与Spring集成),它本身具有一些有趣的功能。

Quarkus从一开始就被设计为 "云原生",这意味着它为Kubernetes、无服务器平台和各种库,如Apache Kafka(用于流处理)和JAX-RS(用于RESTful Web服务)进行了调整。Quarkus还拥有完整的CDI(上下文和依赖性注入)引擎和反应式编程支持。

请继续阅读Quarkus的实践介绍。

安装Quarkus CLI

Quarkus支持Maven和Gradle作为构建工具包装,但也提供了一个命令行界面(CLI)工具。我们将首先通过JBang工具安装CLI。在命令行中,运行清单1中的代码。

清单1.安装Quarkus CLI

// Linux and iOS: 

一旦命令完成,键入quarkus -version 应该会返回一个结果。

创建一个Quarkus应用程序

通过输入quarkus create app com.infoworld:my-quarkus:1.0 ,创建一个新的应用程序,其中com.infoworld 是组ID,my-quarkus 是工件ID,1.0 是版本号。

命令行工具有很多选项,你可以用它们来配置东西。你可以通过输入quarkus --help 来了解这些选项。你可以通过键入quarkus create app --help 来获得特定命令的帮助。注意,你可以定义一些东西,比如使用哪个构建工具包装器。

运行Quarkus应用程序

现在移动到新的my-quarkus目录,然后输入quarkus dev 。Quarkus开发模式代表了一种整洁的方法。它支持热代码加载,允许你在不停止容器的情况下随意运行测试。这就是为什么在dev容器旋转提示后,你会得到一些命令选项。

Tests paused Press [r] to resume testing, [o] Toggle test output, [h] for more options>

这意味着你可以进行代码修改,包括添加测试,然后用r 来运行测试。你还可以用h 来改变日志级别,或者用q 来停止容器。

在远程机器上运行Quarkus开发模式

默认情况下,Quarkus dev模式只监听本地主机。如果你想在所有网络上监听,你可以添加host参数。

quarkus dev -Dquarkus.http.host=0.0.0.0

要为生产构建应用程序,你可以使用quarkus build 命令。

当应用程序在开发模式下运行时,访问localhost:8080,你会看到欢迎屏幕,类似于图1。

图1.Quarkus欢迎界面

IDG

探索Quarkus的项目布局

在新的app目录下是src目录,遵循典型的Maven布局,test用于测试,main用于app文件。在/src/main里面有三个目录。/src/main/resources,存放静态文件(包括驱动页面的HTML页面,如src/main/resources/META-INF/resources/index.html);/src/main/java,存放后端代码和中间件代码;以及/src/main/docker,Quarkus为你生成了默认的Dockerfile(包括Dockerfile.native,用于不使用JVM运行)。

当浏览器被刷新时,你对应用程序所做的任何改变都会被反映出来。例如,你可以打开 src/main/java/com/infoworld/GreetingResource.java 文件,看到一个 JAX-RS 端点。如果你修改该消息并重新加载localhost:8080/hello,你会发现你的改动已经被反映出来。

清单2./hello的REST端点

package com.infoworld;

Quarkus扩展

Quarkus有很多功能是通过扩展来实现的,这些扩展可以通过命令来添加。为了了解Quarkus支持的功能,请看这个Git repo,它包含了几十个使用Quarkus与JPA、Kafka、MongoDB、Amazon S3和Knative等的例子。在用这些技术开发Quarkus应用时,这些例子也可以作为起点使用(因此被称为quickstarts)。

你可以通过运行quarkus ext ls 来查看哪些扩展已经安装在你的应用程序中。你会看到,现在只有quarkus-resteasy被安装。你可以通过quarkus ext ls -i 获得可用的可安装模块的列表。

安装是通过quarkus ext add 命令进行的。

Quarkus CDI依赖性注入

Quarkus提供了一个定制的依赖注入引擎,叫做ArC。ArC是CDI规范的部分实现,同时也有自己的特殊功能。总的来说,ArC系统比CDI更简单,更容易理解。

让我们看看如何添加一个服务类供RESTful资源使用。首先,在/src/main/java/com/infoworld/service/MyService.java创建一个新文件。添加清单3中看到的代码。

清单3.MyService类

package com.infoworld.service;

MyService是一个非常简单的类,只有一个方法:getRandom() ,它返回一个随机的整数。它被注解了CDI标准注解,@ApplicationScoped ,这使得它对DI系统可用。(注意Quarkus CDI包含在你的项目中,因为RESTEasy扩展使用它。

现在打开/src/main/java/com/infoworld/GreetingResource.java类,并按清单4中的方法修改它。

清单4.使用MyService的GreetingResource

package com.infoworld;

这里的关键元素是@Inject 注解,它使CDI引擎用我们在清单4中创建的资源豆来实现myService 引用。然后用它来生成/hello路径的随机数。

修复GreetingResource测试

现在,如果你回到Quarkus dev运行的命令行,输入r ,重新运行测试,你会看到RESTEasy端点的测试案例失败了。让我们来解决这个问题。打开test/java/com/infoworld/GreetingResourceTest.java。注意这个类使用了Quarkus已经提供的几个不同的测试库,包括RestAssured 库,这使得RESTful端点的测试变得容易。

如清单5所示,修改GreetingResourceTest

清单5.更新的GreetingResourceTest

package com.infoworld;

正如注释中指出的,只有两行被改变。你只需检查响应体中是否存在 "machine "这个词。现在,如果你用r 命令运行测试,它们将通过。

添加REST客户端扩展

让我们再深入一点,在服务类中调用外部REST API(星球大战API,又称SWAPI)。首先,通过运行quarkus ext add quarkus-rest-client ,添加quarkus-rest-api客户端。请注意,你可以在应用程序仍在运行的情况下在另一个窗口中完成这个操作,Quarkus将应用这个扩展。相当令人印象深刻。

我们还将利用rest-client-jackson扩展来使数据建模变得简单。类型quarkus ext add rest-client-jackson

模型类

在一个新的目录中创建一个模型类: src/main/java/com/infoworld/client/Person.java。这将是一个非常简单的数据传输对象,Jackson将为我们填充这个对象,如清单6中所示。

清单6.个人模型类

package com.infoworld.client;

注意我们使用了@JsonIgnoreProperties ,这样当源JSON中存在的字段不存在于模型对象中时,就不会出现错误。

在同一目录下,创建一个新的服务类,它将会击中SWAPI的端点。/src/main/java/com/infoworld/client/SwapiClient.java。请看清单7中该文件的内容。

清单7.SwapiClient.java

package com.infoworld.client;

注意到该接口被注册为具有@RegisterRestClient 注解的休息客户端。方法getById 也被注解了,以定义它打出一个GET HTTP方法,发现"/people/{id}" ,其中id 将由调用getById(@PathParam Integer id) 方法提供。我们在这里用同样的注解定义了一个restful端点,一个restful客户端。

但是,端点的根在哪里定义呢?打开src/main/resources/application.properties ,添加清单8中看到的两行。

清单8.在application.properties中定义REST客户端属性

com.infoworld.client.SwapiClient/mp-rest/url=https://swapi.dev/api

关于这些属性的更多信息,以及它们是如何被连接到应用程序中的,可以在这里找到。

现在更新GreetingResource以使用新的客户端服务,如清单9。

清单9.使用REST客户端的GreetingResource

package com.infoworld;

现在我们将rest客户端注入到swapiClient 变量中,用你之前创建的随机数服务中的一个随机ID调用getById 方法。现在你会从localhost:8080/hello得到一个响应,其内容是这样的。

Hello, your Star Wars character is: Ric Olié

云端原生的Java

这是对Quarkus某些功能的一次旋风式参观,但只是开始。Quarkus绝对是Spring的一个有效替代方案,而且还在继续积极开发,经常有新的有用的功能被加入。下次你再去找一个Java框架时,可以考虑Quarkus。