关于后端:quarkus实战之八profile

37次阅读

共计 6291 个字符,预计需要花费 16 分钟才能阅读完成。

欢送拜访我的 GitHub

这里分类和汇总了欣宸的全副原创 (含配套源码):https://github.com/zq2599/blog_demos

本篇概览

  • 本文是《quarkus 实战》系列的第八篇,通过后面的学习,咱们对配置有了足够理解,但问题也随之而来:如何让利用以最小的改变同时运行在不同环境(如本地、测试、生产等)
  • 举个例子,上面是个简化版配置文件,有两个配置项,第一个固定不变,第二个随环境变动各不相同:

    # 这个配置信息在各个环境中都是雷同的
    greeting.message=hello
    # 这个配置信息在各个环境中都不一样
    quarkus.http.port=9090
  • 在理论部署的时候,如何达到要求呢?<font color=”blue”>quarkus.http.port</font> 的值随着环境变动
  • 不同环境用不同配置文件是一种办法,但会导致配置文件数量回升,并且 <font color=”blue”>greeting.message</font> 在各环境都是一样的,这就呈现了冗余,除了保护成本增加,在治理过程中容易出错
  • 除了多个配置文件,还有种办法能够满足要求,并且不须要多个配置文件,这就是明天要聊的 profile

    演示代码

  • 创立一个 demo 工程,参考上面的命令,这样的工程会自带一个 web 服务类 HobbyResource.java

    mvn "io.quarkus:quarkus-maven-plugin:create" \
    -DprojectGroupId="com.bolingcavalry" \
    -DprojectArtifactId="hello-quarkus" \
    -DprojectVersion="1.0-SNAPSHOT" \
    -DclassName="HobbyResource" \
    -Dpath="actions"
  • 用上面这段代码来演示配置是否失效,可见用了一个配置项 <font color=”blue”>greeting.message</font>,所以咱们须要配置它的值才行

    package com.bolingcavalry;
    
    import org.eclipse.microprofile.config.inject.ConfigProperty;
    
    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;
    import java.time.LocalDateTime;
    
    @Path("/actions")
    public class HobbyResource {@ConfigProperty(name = "greeting.message")
      String message;
    
      @GET
      @Produces(MediaType.TEXT_PLAIN)
      public String hello() {return "Hello RESTEasy," + LocalDateTime.now() + "[" + message + "]";
      }
    }
  • 配置文件是 <font color=”blue”>hello-quarkus/src/main/resources/application.properties</font>

    # 这个配置信息在各个环境中都是雷同的
    greeting.message=hello

设定 profile

  • profile 本人是个一般的配置项,例如在 application.properties 文件中,是这样设置 profile 的

    # 这个配置信息在各个环境中都是雷同的
    quarkus.profile=dev
    
    # 如果不指定 profile,就应用此配置
    quarkus.http.port=8080
  • 也能够在 System properties 中设置,如下所示,如此以来,不同环境只有启动命令不同,配置文件能够齐全不必批改:

    java -Dquarkus.profile="dev" -jar hello-quarkus-1.0-SNAPSHOT-runner.jar

    同一个配置项在不同 profile 时的值

  • profile 的格局是 <font color=”blue”>%{profile-name}.config.name</font>
  • 以方才的配置为例,<font color=”red”>quarkus.http.port</font> 配置项共呈现三次,前两次带有前缀,格局是 <font color=”blue”> 百分号 +profile 名称 + 点号 </font>,如下所示

    # 指定以后 profile
    quarkus.profile=dev
    
    # 这个配置信息在各个环境中都是雷同的
    greeting.message=hello
    
    # 如果 profile 为 dev,就是用此配置
    %dev.quarkus.http.port=8081
    # 如果 profile 为 production,就是用此配置
    %production.quarkus.http.port=8082
    # 如果不指定 profile,或者 profile 既不是 dev 也不是 production,就应用此配置
    quarkus.http.port=8080
  • 应用上述配置后,因为 profile 等于 <font color=”blue”>dev</font>,会应用不同配置项 <font color=”blue”>%dev.quarkus.http.port</font>,也就是说服务端口是 <font color=”red”>8081</font>,另外两个配置 <font color=”blue”>%production.quarkus.http.port</font> 和 <font color=”blue”>quarkus.http.port</font> 都有效
  • 启动利用验证,我这是用 <font color=”blue”>mvn quarkus:dev</font> 命令启动的,如下图红框:
  • 浏览器拜访地址 <font color=”blue”>http://localhost:</font><font color=”blue”>8081</font><font color=”blue”>/actions</font>,服务失常,配置项 greeting.message 的值也合乎预期:
  • 再试试另一种配置,先在 application.properties 文件中删除配置项 <font color=”blue”>quarkus.profile=dev</font>,再改用 <font color=”red”>mvn quarkus:dev -Dquarkus.profile=production</font> 启动利用,这次失效的配置项是 <font color=”blue”>%production.quarkus.http.port</font>,如下图:
  • 拜访地址也变成了 <font color=”blue”>http://localhost:</font><font color=”blue”>8082</font><font color=”blue”>/actions</font>

须要大写的场景

  • 在《quarkus 实战之六:配置》一文中,曾提到过配置形式有六种,有几种要求配置项大写,例如在 <font color=”blue”>.env</font> 中的配置,此时格局变成了 <font color=”red”>\_{PROFILE}_CONFIG_KEY=value</font>,举例如下

    # 这个配置信息在各个环境中都是雷同的
    GREETING_MESSAGE=hello
    
    # 如果 profile 为 dev,就是用此配置
    _DEV_QUARKUS_HTTP_PORT=8081
    
    # 如果 profile 为 production,就是用此配置
    _PRODUCTION_QUARKUS_HTTP_PORT=8082
    
    # 如果不指定 profile,就应用此配置
    QUARKUS_HTTP_PORT=8080
  • 留神,实测发现在.env 中配置 <font color=”blue”>QUARKUS_PROFILE=dev</font> 有效,也就是说不能在.env 中指定 profile,此时应该在启动命令中指定 profile,例如:

    java -Dquarkus.profile=dev -jar hello-quarkus-1.0-SNAPSHOT-runner.jar

    不指定 profile 时的默认值

  • 不指定 profile 的时候,quarkus 会给 profile 设置默认值,有三种可能:dev、test、prod,具体逻辑如下:
  • 如果启动命令是 <font color=”blue”>mvn quarkus:dev</font>,profile 等于 <font color=”red”>dev</font>,如下图,大家应该见过屡次了:
  • 单元测试期间,例如执行命令 <font color=”blue”>mvn test</font>,profile 等于 <font color=”red”>test</font>
  • 以上两种场景之外,profile 等于 <font color=”red”>prod</font>,例如用命令 <font color=”blue”>java -jar hello-quarkus-1.0-SNAPSHOT-runner.jar</font> 启动利用

每个 profile 对应一个配置文件

  • 如果您心愿每个 profile 都有本人的配置文件,quarkus 也反对,如下所示,<font color=”blue”>src/main/resources/</font> 目录下同时存在两个配置文件:<font color=”red”>application.properties</font> 和 <font color=”red”>application-staging.properties</font>
resources
├── META-INF
│   └── resources
│       └── index.html
├── application-staging.properties
└── application.properties
  • application.properties 内容如下
greeting.message=hello
quarkus.http.port=8080
  • application-staging.properties 内容如下
greeting.message=hello
quarkus.http.port=8081
  • 如果启动命令指定了 profile,如 <font color=”blue”>mvn quarkus:dev -Dquarkus.profile=staging</font>,此时只有 <font color=”red”>application-staging.properties</font> 文件失效,如下图
  • 还要留神一点:此时如果指定一个不存在的 profile,例如 <font color=”blue”>mvn quarkus:dev -Dquarkus.profile=xxxxxxx</font>,此时失效的是 <font color=”red”>application.properties</font> 文件失效,如下图

Parent Profile

  • parent profile 解决的问题是:假如以后 profile 是 aaa,那么配置项 xxx 对应的配置名应该是 <font color=”blue”>%dev.aaa</font>,如果找不到 <font color=”blue”>%dev.aaa</font>,就去找它的 parent profile 对应的配置项,来看个例子就分明了,假如配置信息如下:
# 指定 profile 的名字
quarkus.profile=dev
# 指定 parent 的名字
quarkus.config.profile.parent=common

%common.quarkus.http.port=9090
%dev.quarkus.http.ssl-port=9443

quarkus.http.port=8080
quarkus.http.ssl-port=8443
  1. 以后 profile 曾经指定为 dev
  2. parent profile 曾经指定为 common
  3. 对于配置项 <font color=”blue”>quarkus.http.port</font>,因为没找到 <font color=”red”>%dev.quarkus.http.port</font>,就去找 parent profile 的配置,于是找到了 <font color=”red”>%common.quarkus.http.port</font>,所以值为 <font color=”blue”>9090</font>
  4. 对于配置项 <font color=”blue”>quarkus.http.ssl-port</font>,因为找到了 <font color=”red”>%dev.quarkus.http.ssl-port</font>,所以值为 <font color=”blue”>9443</font>
  5. 对于配置项 <font color=”blue”>quarkus.http.port</font>,如果 <font color=”red”>%dev.quarkus.http.port</font> 和 <font color=”red”>%common.quarkus.http.port</font> 都不存在,会用 <font color=”red”>quarkus.http.port</font>,值为 <font color=”blue”>8080</font>

批改默认 profile

  • 后面曾说到,启动的时候如果不指定 profile,quarkus 会指定默认的 profile:将利用制作成 jar,以 <font color=”blue”>java -jar</font> 命令启动时,profile 会被设置为 <font color=”red”>prod</font>
  • 如果您想让默认值从 prod 变为其余值,能够在构建的时候用 <font color=”blue”>-Dquarkus.profile</font> 去扭转它,例如上面这个命令,jar 包生成后,启动的时候默认 profile 是 <font color=”red”>prod-aws</font>
mvn clean package -U -Dquarkus.package.type=uber-jar -Dquarkus.profile=prod-aws
  • 启动 jar 的时候不指定 profile,如下图,profile 已被设定为 <font color=”blue”>prod-aws</font>

三个要害注意事项(重要)

  • quarkus 官网给出了三个重点注意事项
  • 利用在运行时,只会有一种 profile 失效
  • 如果想在代码获取以后的 profile,能够用此 API

    io.quarkus.runtime.configuration.ProfileManager#getActiveProfile
  • 用注解的形式获取 profile 是 <font color=”red”> 有效的 </font>,上面这段代码无奈失去以后的 profile

     @ConfigProperty("quarkus.profile")
     String profile;

欢送关注思否:程序员欣宸

学习路上,你不孤独,欣宸原创一路相伴 …

正文完
 0