Quarkus是超音速亚原子Java。 框架的简要概述


引言


3月7日,RedHat(不久之后IBM) 推出了新框架Quarkus 。 根据开发人员的说法,该框架基于GraalVM和OpenJDK HotSpot,并且是为Kubernetes设计的。 Quarkus堆栈包括:JPA / Hibernate,JAX-RS / RESTEasy,Eclipse Vert.x,Netty,Apache Camel,Kafka,Prometheus等。


目标是使Java成为部署到Kubernetes和开发无服务器应用程序的领先平台,为开发人员提供统一的方法来开发反应式和命令式样式。


如果您看一下框架的这种分类,那么Quarkus介于“聚合器/代码生成器”和“高级全栈框架”之间。 这已经不仅仅是一个聚合器,而且还不能达到全栈,因为 后端发展的基础。


可以保证很高的应用程序启动速度和较低的内存消耗。 这是来自开发人员站点的数据:


从开始到第一个答案的时间:


构型休息REST + JPA
Quarkus + GraalVM0.0140.055
Quarkus + OpenJDK0.752.5
传统云原生堆栈*4.39.5

内存消耗(Mb):


构型休息REST + JPA
Quarkus + GraalVM1335
Quarkus + OpenJDK74130
传统云原生堆栈*140218

令人印象深刻,不是吗?


* 我没有找到有关此技术堆栈的信息,我们可以假定这是某种带有附加主体套件的Spring Boot


世界您好!


用Quarkus编写的最简单的应用程序如下所示:


@Path("/hello") public class GreetingResource { @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { return "hello"; } } 

这实际上是一堂课,就足够了! 您可以在开发模式下使用Maven启动应用程序:


 mvn compile quarkus:dev … $ curl http://localhost:8080/hello hello 

与通常的应用程序不同-没有应用程序类! Quarkus支持热重载,因此您无需重新启动即可更改应用程序,从而开发速度更快。


接下来是什么? 您可以使用Inject注释将服务添加到控制器。 服务代码:


 @ApplicationScoped public class GreetingService { public String greeting(String name) { return "Hello " + name + "!"; } } 

控制器:


 @Path("/hello") public class GreetingResource { @Inject GreetingService service; @GET @Produces(MediaType.TEXT_PLAIN) @Path("/{name}") public String greeting(@PathParam("name") String name) { return service.greeting(name); } } 

 $ curl http://localhost:8080/hello/developer Hello developer! 

注意,Quarkus使用来自熟悉的框架的标准注释-CDI和JAX-RS。 当然,如果您之前使用过CDI和JAX-RS,则无需学习任何新知识。


使用数据库


由Hibernate和标准JPA注释用于实体。 与REST控制器一样,您需要编写最少的代码。 在程序集文件中指定依赖项,安排@Entity批注并在application.properties中配置数据源就足够了。


仅此而已。 没有sessionFactory,persistence.xml和其他服务文件。 我们只编写所需的代码。 但是,如有必要,您可以创建一个persistence.xml文件并更精细地配置ORM层。


Quarkus支持缓存实体,一对多关系的集合以及查询。 乍一看,它看起来很不错,但是对于单个Kubernetes主机来说,它是本地缓存。 即 不同节点的缓存彼此不同步。 我希望这是暂时的。


异步代码执行


如上所述,Quarkus还支持反应式编程风格。 先前应用程序的代码可以用另一种形式编写。


 @Path("/hello") public class GreetingResource { @GET @Produces(MediaType.TEXT_PLAIN) @Path("/{name}") public CompletionStage<String> greeting(@PathParam("name") String name) { return CompletableFuture.supplyAsync(() -> { return "Hello " + name + "!"; }); } } 

异步代码也可以传输到服务,结果将是相同的。


测试中


可以用JUnit4或JUnit5编写Quarkus应用程序的测试。 以下是针对端点的示例测试,它是使用RestAssured编写的,但是您可以使用其他框架:


 @QuarkusTest public class GreetingResourceTest { @Test public void testGreetingEndpoint() { String uuid = UUID.randomUUID().toString(); given() .pathParam("name", uuid) .when().get("/hello/{name}") .then() .statusCode(200) .body(is("Hello " + uuid + "!")); } } 

@QuarkusTest批注告诉您在运行测试之前先运行应用程序。 其余所有开发人员代码都熟悉。


平台相关的应用


由于Quarkus与GraalVM紧密集成,因此可以生成特定于平台的代码。 为此,设置GraalVM并指定GRAALVM_HOME环境变量。 接下来, 为程序集注册一个概要文件,并在构建应用程序时指定它:


 mvn package -Pnative 

有趣的是,可以测试生成的应用程序。 这很重要,因为“本机”代码的执行可能与JVM上的执行不同。 注释@SubstrateTest运行平台特定的应用程序代码。 可以使用继承来重用现有的测试代码,因此,用于测试特定于平台的应用程序的代码将如下所示:


 @SubstrateTest public class GreetingResourceIT extends GreetingResourceTest { } 

生成的映像可以打包在Docker中,并在Kubernetes或OpenShift中运行,具体说明中对此进行了描述。


工具包


Quarkus框架可以与Maven和Gradle一起使用。 与Gradle不同,Maven得到了完全支持。 不幸的是,目前Gradle不支持生成空项目,该站点上有详细的教程


扩展名


Quarkus是一个可扩展的框架。 当前,大约有40个扩展添加了各种功能-从对Spring DI容器Apache Camel的支持到运行服务的日志记录和发布指标。 除了Java之外,已经存在扩展以支持用Kotlin语言编写应用程序。


结论


我认为,Quarkus是时间趋势的一部分。 后端代码的开发变得越来越容易,并且此框架进一步简化和加速了服务的开发,增加了对Docker和Kubernetes的“本机”支持。 巨大的优势是对GraalVM的内置支持以及特定于平台的映像的生成,使您能够真正快速地启动服务并占用很少的内存空间。 在我们热衷于微服务和无服务器架构的时代,这非常重要。


官方网站是quarkus.ioGitHub上已经有用于快速入门的项目示例。

Source: https://habr.com/ru/post/zh-CN443242/


All Articles