下一代云原生-第一个Quarkus应用程序

先决条件

一个IDE

JDK 8或11+

Apache Maven 3.6.2+

创建项目

Linux和MacOS用户:mvnio.quarkus:quarkus-maven-plugin:1.13.2.Final:create\    -DprojectGroupId=org.acme \    -DprojectArtifactId=getting-started \    -DclassName="org.acme.getting.started.GreetingResource"\    -Dpath="/hello"Windows用户:mvnio.quarkus:quarkus-maven-plugin:1.13.2.Final:create-DprojectGroupId=org.acme -DprojectArtifactId=getting-started -DclassName="org.acme.getting.started.GreetingResource"-Dpath="/hello"

生成以下内容 ./getting-started:

Maven结构

org.acme.getting.started.GreetingResource暴露于的资源/hello

相关的单元测试

http://localhost:8080启动应用程序后可访问的登录页面

和中的模式的示例Dockerfile文件nativejvmsrc/main/docker

应用程序配置文件

查看pom.xml。您将找到Quarkus BOM的导入,从而可以省略不同Quarkus依赖项上的版本。此外,您还可以看到quarkus-maven-plugin负责应用程序打包的人员,还可以提供开发模式

io.quarkusquarkus-universe-bom${quarkus.platform.version}pomimportio.quarkusquarkus-maven-plugin${quarkus-plugin.version}truebuildgenerate-codegenerate-code-tests

可以看到开发REST应用程序:

io.quarkusquarkus-resteasy

JAX-RS资源

一个非常简单的REST端点,向“ / hello”上的请求返回“ hello”

packageorg.acme.getting.started;importjavax.ws.rs.GET;importjavax.ws.rs.Path;importjavax.ws.rs.Produces;importjavax.ws.rs.core.MediaType;@Path("/hello")public class GreetingResource {@GET@Produces(MediaType.TEXT_PLAIN)    public String hello() {return"hello";    }}

使用Quarkus,无需创建Application类。它受支持,但不是必需的。另外,仅创建资源的一个实例,而不为每个请求创建一个。您可以使用不同的配置此*Scoped批注(ApplicationScoped,RequestScoped,等)。

运行应用程序

现在,我们准备运行我们的应用程序。使用方法./mvnw compile quarkus:dev:

$./mvnwcompilequarkus:dev[INFO]--------------------<org.acme:getting-started>---------------------[INFO]Buildinggetting-started1.0.0-SNAPSHOT[INFO]--------------------------------[jar]---------------------------------[INFO][INFO]---maven-resources-plugin:2.6:resources(default-resources)@getting-started---[INFO]Using'UTF-8'encodingtocopyfilteredresources.[INFO]skipnonexistingresourceDirectory/Users/starksm/Dev/JBoss/Quarkus/starksm64-quarkus-quickstarts/getting-started/src/main/resources[INFO][INFO]---maven-compiler-plugin:3.1:compile(default-compile)@getting-started---[INFO]Changesdetected-recompilingthemodule![INFO]Compiling2sourcefilesto/Users/starksm/Dev/JBoss/Quarkus/starksm64-quarkus-quickstarts/getting-started/target/classes[INFO][INFO]---quarkus-maven-plugin:<version>:dev(default-cli)@getting-started---Listening for transport dt_socket at address:50052019-02-2817:05:22,347INFO[io.qua.dep.QuarkusAugmentor](main)Beginningquarkusaugmentation2019-02-2817:05:22,635INFO[io.qua.dep.QuarkusAugmentor](main)Quarkusaugmentationcompletedin288ms2019-02-2817:05:22,770INFO[io.quarkus](main)Quarkus started in 0.668s. Listening on:http://localhost:80802019-02-2817:05:22,771INFO[io.quarkus](main)Installed features:[cdi,resteasy]

curl-w"\n"http://localhost:8080/hellohello

使用 注入

Quarkus中的依赖注入基于ArC,ArC是为Quarkus架构量身定制的基于CDI的依赖注入解决方案。如果您不熟悉CDI,建议您阅读CDI简介指南。

Quarkus仅实现CDI功能的一个子集,并具有非标准功能和特定的APIS,您可以在Contexts and Dependency Injection指南中了解有关它的更多信息。

ArC作为的依赖项,quarkus-resteasy因此您已经很方便了。

packageorg.acme.getting.started;importjavax.enterprise.context.ApplicationScoped;@ApplicationScopedpublicclassGreetingService{publicStringgreeting(String name){return"hello "+ name;    }}

编辑GreetingResource该类以注入,GreetingService并使用它创建一个新的端点:packageorg.acme.getting.started;importjavax.inject.Inject;importjavax.ws.rs.GET;importjavax.ws.rs.Path;importjavax.ws.rs.Produces;importjavax.ws.rs.core.MediaType;importorg.jboss.resteasy.annotations.jaxrs.PathParam;@Path("/hello")public class GreetingResource {@InjectGreetingService service;@GET@Produces(MediaType.TEXT_PLAIN)    @Path("/greeting/{name}")    public String greeting(@PathParam String name) {returnservice.greeting(name);    }@GET@Produces(MediaType.TEXT_PLAIN)    public String hello() {return"hello";    }}

编辑GreetingResource该类以注入,GreetingService并使用它创建一个新的端点:

开发模式

quarkus:dev在开发模式下运行Quarkus。这样可以通过后台编译实现热部署,这意味着当您修改Java文件和/或资源文件并刷新浏览器时,这些更改将自动生效。这对于资源文件(如配置属性文件)也适用。刷新浏览器会触发对工作区的扫描,如果检测到任何更改,将重新编译Java文件并重新部署应用程序;然后,重新部署的应用程序将为您的请求提供服务。如果编译或部署有任何问题,则会显示错误页面。

这还将在port上侦听调试器5005。如果要在运行之前等待调试器附加,可以-Dsuspend在命令行中传递。如果您根本不想使用调试器,则可以使用-Ddebug=false。

测试

在生成的pom.xml文件中,您可以看到2个测试依赖项:

io.quarkusquarkus-junit5testio.rest-assuredrest-assuredtest

Quarkus支持Junit 5测试。因此,必须设置Surefire Maven插件的版本,因为默认版本不支持Junit 5:

maven-surefire-plugin${surefire-plugin.version}org.jboss.logmanager.LogManager${maven.home}

我们还设置了java.util.logging系统属性,以确保测试将使用正确的logmanager,并maven.home确保${maven.home}/conf/settings.xml应用了from的自定义配置(如果有)。

生成的项目包含一个简单的测试。编辑

src/test/java/org/acme/getting/started/GreetingResourceTest.java以匹配以下内容:

packageorg.acme.getting.started;importio.quarkus.test.junit.QuarkusTest;importorg.junit.jupiter.api.Test;importjava.util.UUID;importstatic io.restassured.RestAssured.given;importstatic org.hamcrest.CoreMatchers.is;@QuarkusTestpublicclassGreetingResourceTest{@Testpublicvoid testHelloEndpoint() {        given()          .when().get("/hello")          .then()            .statusCode(200)                .body(is("hello"));    }@Testpublicvoid testGreetingEndpoint() {        String uuid = UUID.randomUUID().toString();        given()          .pathParam("name", uuid)          .when().get("/hello/greeting/{name}")          .then()            .statusCode(200)            .body(is("hello "+ uuid));    }}

通过使用运行QuarkusTest程序,您可以指示JUnit在测试之前启动应用程序。

检查HTTP响应状态代码和内容

可以使用Maven运行这些:

./mvnwtest

打包并运行应用程序

该应用程序使用打包./mvnw package。它产生以下几个输出/target:

getting-started-1.0.0-SNAPSHOT.jar-仅包含项目的类和资源,这是Maven构建产生的常规工件-它不是可运行的jar;

quarkus-app包含quarkus-run.jarjar文件的目录-是可执行jar。请注意,这不是über-jar,因为依赖项已复制到的子目录中quarkus-app/lib/。

您可以使用以下命令运行该应用程序: java -jar

target/quarkus-app/quarkus-run.jar

如果要将应用程序部署到某个地方(通常在容器中),则需要部署整个quarkus-app目录。

使用fast-jar

假定quarkus.package.type未明确配置配置属性,或者已将其设置为legacy-jar(在application.properties或任何其他受支持的配置源中)。当属性设置fast-jar为时(将在Quarkus 1.12中使用),执行的结果 ./mvnw package是targetnamed下的新目录quarkus-app。

您可以使用来运行该应用程序java -jar

target/quarkus-app/quarkus-run.jar。

为了成功运行产生的jar,您需要具有quarkus-app目录的全部内容。如果缺少任何文件,则该应用程序将无法启动或无法正常运行。

该fast-jar包装导致创建启动快一点,消耗略少的内存比遗留Quarkus罐子,因为它有哪些相关性JAR包含的类和资源索引信息,神器。因此,在加载类或资源时,它可以避免在旧版jar必需的类路径上查找潜在的每个jar。

配置标语

默认情况下,当Quarkus应用程序启动时(在常规或开发模式下),它将显示ASCII技术标语。横幅可以通过设置被禁用quarkus.banner.enabled=false的application.properties,通过设置-Dquarkus.banner.enabled=falseJava系统属性,或通过设置QUARKUS_BANNER_ENABLED环境变量false。此外,用户可以通过将标语文件放置在中src/main/resources并quarkus.banner.path=name-of-file在中进行配置来提供自定义标语application.properties。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容