优秀的编程知识分享平台

网站首页 > 技术文章 正文

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

nanyue 2024-09-03 16:36:26 技术文章 5 ℃

先决条件

  • 一个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

  • Maven结构
  • org.acme.getting.started.GreetingResource暴露于的资源/hello
  • 相关的单元测试
  • http://localhost:8080启动应用程序后可访问的登录页面
  • 和中的模式的示例Dockerfile文件nativejvmsrc/main/docker
  • 应用程序配置文件

查看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批注(ApplicationScopedRequestScoped,等)。

运行应用程序

现在,我们准备运行我们的应用程序。使用方法./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


测试

在生成的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 packagetargetnamed下的新目录quarkus-app

您可以使用来运行该应用程序java -jar target/quarkus-app/quarkus-run.jar

  • 为了成功运行产生的jar,您需要具有quarkus-app目录的全部内容。如果缺少任何文件,则该应用程序将无法启动或无法正常运行。
  • 该fast-jar包装导致创建启动快一点,消耗略少的内存比遗留Quarkus罐子,因为它有哪些相关性JAR包含的类和资源索引信息,神器。因此,在加载类或资源时,它可以避免在旧版jar必需的类路径上查找潜在的每个jar。

配置标语

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

最近发表
标签列表