使用配置文件配置Quarkus应用程序的详细教程

972 阅读5分钟

这篇博文是在我写的关于配置Quarkus应用程序的第一篇博文之后。因此,如果你想知道如何使用统一配置(application.properties文件)、Microprofile配置或系统属性来配置Quarkus应用程序,请参考这篇上一篇文章。在这篇博文中,我将告诉你如何在Quarkus中使用配置文件。

使用案例

我将使用与上一篇文章相同的例子:我们有一个REST端点,使用一个存储库来持久化和检索数据库中的书籍:

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

就业务逻辑而言,这是个简单的应用。这篇博文的目的是向你展示Quarkus如何根据配置文件(dev, test, prod, your own profile...)来配置这个应用程序。

Quarkus配置文件

Quarkus支持Profiles的概念(如果你知道Spring Profile,它有点类似)。这些允许你在同一个application.properties文件中对每个profile进行多个配置。其语法是%{profile}.config.key=value。因此,如果我们的应用程序需要一个叫做isbn.prefix的变量,下面的配置将为所有配置文件设置1234的值,但这个值在配置文件dev和test中被覆盖:

isbn.prefix=1234
%dev.isbn.suffix=DEV
%test.isbn.suffix=TEST

在默认情况下,Quarkus有三个配置文件:

  • dev - 在开发模式下激活(例如:mvn quarkus:dev)
  • test - 在运行测试时激活(即mvn test)
  • prod - 不在开发或测试模式下运行时的默认配置文件。

正如你将在下面看到的,创建你自己的配置文件并使用你自己的配置文件配置构建你的应用程序非常容易。

用配置文件配置应用程序

默认情况下,Quarkus通过读取位于src/main/resources目录下的application.properties文件来配置一个应用程序。在上一篇文章中,我向你展示了如何拥有一个用于开发的application.properties文件和另一个用于测试的文件。但是使用profiles,你不必有单独的application.properties文件:你把所有的配置集中在一个属性文件中,并使用profile来区分开发和测试。

在下面的application.properties文件中,我们有对所有配置文件都可用的全局属性(如isbn.prefix或quarkus.datasource.url),但我们也根据配置文件覆盖一些属性(如%dev.isbn.senix或%test.isbn.senix):

# GLOBAL
isbn.prefix=1234
quarkus.datasource.url = jdbc:postgresql://localhost:5432/cdbookstoreDB
quarkus.datasource.driver = org.postgresql.Driver
quarkus.datasource.username = cdbookstoreDB
quarkus.datasource.password = h2g2

quarkus.hibernate-orm.database.generation=drop-and-create
quarkus.hibernate-orm.log.sql=false

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

# DEV
%dev.quarkus.hibernate-orm.log.sql=true
%dev.quarkus.hibernate-orm.sql-load-script = import-dev.sql

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

%dev.isbn.suffix=DEV

# TEST
%test.quarkus.datasource.url = jdbc:h2:mem:cdbookstoreDB
%test.quarkus.datasource.driver = org.h2.Driver

%test.quarkus.hibernate-orm.database.generation=drop-and-create
%test.quarkus.hibernate-orm.log.sql=true
%test.quarkus.hibernate-orm.sql-load-script = import-test.sql

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

%test.isbn.suffix=TEST

这个单一的application.properties文件通知Quarkus在测试中使用H2数据库(%test.quarkus.datasource.driver = org.h2.Driver),在所有其他配置文件中使用Postgres(quarkus.datasource.driver = org.postgresql.Driver)。

根据配置文件执行SQL

如果你使用Hibernate,你可能知道要在启动时执行一些SQL语句(例如,将数据加载到数据库中),你只需在资源目录的根部添加一个import.sql文件。这种行为已经通过profile进行了扩展。你可以给profile的名字加上后缀,并且有一个文件叫做import-dev.sql,只为开发配置文件提供SQL语句,或者为测试配置文件提供import-test.sql。

创建一个新的配置文件

Quarkus带有3个配置文件(dev, test, prod),但我们可能需要其他的配置文件。这很容易做到,因为Quarkus将简单地使用quarkus-profile系统属性或QUARKUS_PROFILE环境变量。比方说,我们有一个暂存环境,想为这个环境设置一些特定的值。这只是在application.properties中添加这些带有%staging前缀的变量的问题:

# STAGING
%staging.quarkus.log.category."org.agoncal".level=INFO
%staging.isbn.suffix=STAG

然后,你设置系统变量。例如,如果你想使用staging profile进行开发,只需执行:mvn -Dquarkus-profile=staging compile quarkus:dev。

在启动时显示配置文件

如果我们创建了许多配置文件,我们最终可能会迷失方向,不知道某个特定的应用程序是用哪个配置文件构建的。那么,如何在启动时显示当前的配置文件呢?为此,我们可以使用一个漂亮的Quarkus小技巧。Quarkus让我们有能力在应用程序初始化和终止时执行代码。这是因为Quarkus依赖于CDI,我们只需要观察StartupEvent和ShutdownEvent。感谢io.quarkus.runtime.configuration.ProfileManager,这只是一个调用方法来显示活动配置文件的问题:

@ApplicationScoped
public class ApplicationLifeCycle {

  @Inject
  Logger logger;

  void onStart(@Observes StartupEvent ev) {
    logger.info("The application is starting with profile " + ProfileManager.getActiveProfile());
  }
}

用不同的配置文件执行

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属性:

$ mvn compile quarkus:dev

INFO  [io.qua.dep.QuarkusAugmentor] (main) Beginning quarkus augmentation
INFO  [io.qua.dep.QuarkusAugmentor] (main) Quarkus augmentation completed in 658ms
INFO  [ApplicationLifeCycle] (main) The application is starting with profile dev
$ mvn -Dquarkus-profile=staging compile quarkus:dev

INFO  [io.qua.dep.QuarkusAugmentor] (main) Beginning quarkus augmentation
INFO  [io.qua.dep.QuarkusAugmentor] (main) Quarkus augmentation completed in 613ms
INFO  [ApplicationLifeCycle] (main) The application is starting with profile staging

结论

Microprofile Config带来了开箱即用的配置,但Quarkus通过实现profile的概念走得更远。因为我们的应用程序在开发和生产过程中的行为不尽相同,使用的资源也不一样,所以你可以在application.properties文件中为每个profile设置属性。Quarkus带有一个开发、测试和生产配置文件,但你可以创建你自己的。

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

参考资料