配置一个Quarkus应用程序的详细指南

372 阅读5分钟

在这篇博文中,我将向你展示如何使用特定的application.properties文件以及Microprofile ConfigAPI来**配置Quarkus**应用程序(查看我的另一篇关于使用profile配置的文章)。把它分成更多的细节,你将会学到:

  • 如何配置Quarkus应用程序并为开发和测试提供单独的值
  • 如何使用Microprofile配置来注入数值
  • 如何配置日志
  • 如何传递系统属性

使用案例

在这个例子中,我们有一个REST端点,它使用一个资源库来持久化和检索数据库中的书籍:

  • BookResource:一个JAX-RS端点,有一组方法可以使用BookRepository获取、POST、UPDATE和DELETE一本书。
  • BookRepository:与EntityManager打交道的事务性资源库,用于持久化、检索、更新和删除关系数据库中的数据。
  • 书。JPA实体,代表一本书
  • application.properties:我们配置Quarkus应用程序的属性文件。
  • BookResourceTest:Quarkus测试类,使用RESTAssured来测试BookResource。
  • 开发中使用Postgres,测试中使用H2。

就业务逻辑而言,这是个简单的应用。这篇博文的目的是向你展示Quarkus如何根据环境(开发与测试)或通过注入外部值来配置这个应用程序。

配置应用程序

默认情况下,Quarkus通过读取位于src/main/resources目录下的application.properties文件来读取一个应用程序的配置。事实上,你的应用程序的大部分属性都可以放在这个文件中。如果你有带有META-INF/persistence.xml或beans.xml的遗留代码,Quarkus将检测这些文件并使用它们的配置。但你也可以摆脱XML部署描述符,只使用application.properties文件(这是Quarkus推荐的)。

回到我们的用例,我们需要告诉Quarkus为我们的开发环境使用一个Postgres数据库。为此,Quarkus有一套已经定义好的属性,你只需要在application.properties文件中设置:

quarkus.datasource.db-kind=postgresql
quarkus.datasource.username=cdbookstoreDB
quarkus.datasource.password=h2g2
quarkus.datasource.jdbc.url=jdbc:postgresql://localhost:5432/cdbookstoreDB

在我们的测试环境中,我们想使用一个H2数据库。要使用不同的数据库,你可以在 src/test/resources 下创建一个新的 application.properties 文件,并覆盖需要的属性(这里是 H2 驱动和 URL)。Quarkus将使用适当的application.properties,这取决于我们是在开发还是测试:

quarkus.datasource.db-kind=h2
quarkus.datasource.jdbc.url=jdbc:h2:mem:cdbookstoreDB

注入一个配置值

通常我们需要根据我们刚才看到的环境(测试,开发,生产......)来配置我们的应用程序的各个部分,但也取决于部署(例如,一个业务规则根据国家的不同而改变)。为此,Quarkus使用MicroProfile配置来注入应用程序中的配置。注入使用@ConfigProperty注解(你甚至不需要写@Inject @ConfigProperty)。下面,我们为ISBN前缀注入一个值,我们在持久化一本书时使用这个值:

@ApplicationScoped
@Path("books")
public class BookResource {

  @ConfigProperty(name = "isbn.prefix")
  String isbnPrefix;

  @POST
  @Consumes(MediaType.APPLICATION_JSON)
  public Response create(Book book, @Context UriInfo uriInfo) {

    String isbn = isbnPrefix + "-" + (int) (Math.random() * 1000);
    book.setIsbn(isbn);

    final Book created = bookRepository.create(book);

    URI createdURI = uriInfo.getAbsolutePathBuilder().path(String.valueOf(created.getId())).build();
    return Response.created(createdURI).build();
  }
}

ISBN前缀的值是在application.properties中定义的:

isbn.prefix=DEV

当然,这个值可以在测试环境中被重写(也可以通过系统属性,你会在下面看到):

isbn.prefix=TEST

配置日志

我们都面临的另一个用例是配置日志。在Quarkus上有一个关于配置日志的完整指南。Quarkus支持几个日志API。JUL (java.util.logging), JBoss Logging, SLF4J 和 Apache Commons Logging。在下面的代码中,我使用了JBoss Logging,因为你可以注入它:

@ApplicationScoped
@Path("books")
public class BookResource {

  @Inject
  Logger log;

  @GET
  @Produces(MediaType.APPLICATION_JSON)
  public Response findAll() {
    log.debug("Getting all the books");
    return ok(bookRepository.findAll()).build();
  }
}

因为BookResource是在org.agoncal包下的,如果我想在开发中把日志变成INFO,只需要在application.properties中设置正确的值就可以了:

quarkus.log.category."org.agoncal".level=INFO

正如你现在可能已经猜到的,你可以在测试环境中使用不同的日志级别,只要覆盖它的值即可:

quarkus.log.category."org.agoncal".level=DEBUG

使用系统属性进行配置

Microprofile配置还允许你通过传递系统属性(也包括环境变量)来配置应用程序。你可以在HotSpot上运行时这样做(通过向JVM传递变量,如java -Disbn.prefix=PROD)或向可执行二进制文件传递属性。让我们这样做吧。

Quarkus的优点之一是,由于Graal VM的存在,它可以用来构建本地代码。要做到这一点,你需要安装Graal VM,设置GRAALVM_HOME变量。然后,让Maven和Quarkus插件完成其余工作,只需执行mvn clean package -Pnative命令。最终在目标文件夹中出现一个二进制文件(在本例中,该文件为52Mb,名为configuration-1.0-runner)。然后你可以用-D来执行这个二进制文件,传递属性。正如你在下面看到的,我们覆盖了isbn.prefix属性:

$ ./configuration-1.0-runner
$ ./configuration-1.0-runner -Disbn.prefix=PROD
$ ./configuration-1.0-runner -Disbn.prefix=PROD -Dquarkus.log.category.\"org.agoncal\".level=DEBUG

当配置日志的时候,确保你在把它作为一个系统属性传递的时候转义了日志的类别(这里是org.agoncal)。

总结

配置一个应用程序是非常重要的,Quarkus在这方面接受了Microprofile配置。它更进一步将所有的配置集中到一个文件中(application.properties),而不是将配置分散到几个部署描述符中(persistence.xml, web.xml, beans.xml...)。配置是一个丰富的主题,由Microprofile Config涵盖。你可以根据配置文件进行配置,你可以编写你的自定义配置源、转换器,甚至优先考虑这些转换器。

下载代码,试一试并留下一些评论。

参考资料