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

302 阅读3分钟

先决条件

  • 一个IDE
  • JDK 8或11+
  • Apache Maven 3.6.2+

创建项目

`Linux和MacOS用户:`
`mvn io.quarkus:quarkus-maven-plugin:1.13.2.Final:create \`
 `-DprojectGroupId=org.acme \`
 `-DprojectArtifactId=getting-started \`
 `-DclassName="org.acme.getting.started.GreetingResource" \`
 `-Dpath="/hello"`
`Windows用户:`
`mvn io.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:

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

`<dependencyManagement>`
 `<dependencies>`
 `<dependency>`
 `<groupId>io.quarkus</groupId>`
 `<artifactId>quarkus-universe-bom</artifactId>`
 `<version>${quarkus.platform.version}</version>`
 `<type>pom</type>`
 `<scope>import</scope>`
 `</dependency>`
 `</dependencies>`
`</dependencyManagement>`
`<build>`
 `<plugins>`
 `<plugin>`
 `<groupId>io.quarkus</groupId>`
 `<artifactId>quarkus-maven-plugin</artifactId>`
 `<version>${quarkus-plugin.version}</version>`
 `<extensions>true</extensions>`
 `<executions>`
 `<execution>`
 `<goals>`
 `<goal>build</goal>`
 `<goal>generate-code</goal>`
 `<goal>generate-code-tests</goal>`
 `</goals>`
 `</execution>`
 `</executions>`
 `</plugin>`
 `</plugins>`
`</build>`

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

 `<dependency>`
 `<groupId>io.quarkus</groupId>`
 `<artifactId>quarkus-resteasy</artifactId>`
 `</dependency>`

JAX-RS资源

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

`package org.acme.getting.started;`
`import javax.ws.rs.GET;`
`import javax.ws.rs.Path;`
`import javax.ws.rs.Produces;`
`import javax.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:

`$ ./mvnw compile quarkus:dev`
`[INFO] --------------------< org.acme:getting-started >---------------------`
`[INFO] Building getting-started 1.0.0-SNAPSHOT`
`[INFO] --------------------------------[ jar ]---------------------------------`
`[INFO]`
`[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ getting-started ---`
`[INFO] Using 'UTF-8' encoding to copy filtered resources.`
`[INFO] skip non existing resourceDirectory /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] Changes detected - recompiling the module!`
`[INFO] Compiling 2 source files to /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: 5005`
`2019-02-28 17:05:22,347 INFO  [io.qua.dep.QuarkusAugmentor] (main) Beginning quarkus augmentation`
`2019-02-28 17:05:22,635 INFO  [io.qua.dep.QuarkusAugmentor] (main) Quarkus augmentation completed in 288ms`
`2019-02-28 17:05:22,770 INFO  [io.quarkus] (main) Quarkus started in 0.668s. Listening on: http://localhost:8080`
`2019-02-28 17:05:22,771 INFO  [io.quarkus] (main) Installed features: [cdi, resteasy]`

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


使用 注入
=====

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

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

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

package org.acme.getting.started; import javax.enterprise.context.ApplicationScoped; @ApplicationScoped public class GreetingService { public String greeting(String name) { return "hello " + name; } }

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

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

开发模式
====

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

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

  

![下一代云原生-第一个Quarkus应用程序](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d77d29f114d04e6c8d5a0cbac4fe272d~tplv-k3u1fbpfcp-zoom-1.image)

测试
==

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

```
`<dependency>`
 `<groupId>io.quarkus</groupId>`
 `<artifactId>quarkus-junit5</artifactId>`
 `<scope>test</scope>`
`</dependency>`
`<dependency>`
 `<groupId>io.rest-assured</groupId>`
 `<artifactId>rest-assured</artifactId>`
 `<scope>test</scope>`
`</dependency>`
```

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

```
`<plugin>`
 `<artifactId>maven-surefire-plugin</artifactId>`
 `<version>${surefire-plugin.version}</version>`
 `<configuration>`
 `<systemPropertyVariables>`
 `<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>`
 `<maven.home>${maven.home}</maven.home>`
 `</systemPropertyVariables>`
 `</configuration>`
`</plugin>`
```

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

生成的项目包含一个简单的测试。编辑  
src/test/java/org/acme/getting/started/GreetingResourceTest.java以匹配以下内容:

```
`package org.acme.getting.started;`
`import io.quarkus.test.junit.QuarkusTest;`
`import org.junit.jupiter.api.Test;`
`import java.util.UUID;`
`import static io.restassured.RestAssured.given;`
`import static org.hamcrest.CoreMatchers.is;`
`@QuarkusTest`
`public class GreetingResourceTest {`
 `@Test` 
 `public void testHelloEndpoint() {`
 `given()`
 `.when().get("/hello")`
 `.then()`
 `.statusCode(200)` 
 `.body(is("hello"));`
 `}`
 `@Test`
 `public void 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运行这些:

```
./mvnw test
```

打包并运行应用程序
=========

该应用程序使用打包./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。