乐趣区

关于后端:quarkus实战之六配置

欢送拜访我的 GitHub

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

本篇概览

  • 本文是《quarkus 实战》系列的第六篇,咱们来把握一个罕用知识点:配置
  • 如同 SpringBoot 中的 <font color=”blue”>application.properties</font> 文件,对一个 quarkus 利用来说,配置是其重要的组成部分,web 端口、数据库这些重要信息都放在配置中,咱们在编码时也会将一些业务参数做成配置,而不是硬编码(hard code)
  • 与配置无关的知识点不少,本文重点是如何设置,下一篇会具体阐明如何应用配置
  • 本篇要学习和把握的内容:先实际六种具体的配置形式,例如通过在零碎变量、application.properties 中去设置配置项,它们都是不同的配置形式,而后,再一起去理解配置文件中能够输出什么样的内容,除了常见的 key&value,还有哪些类型能够用来配置
  • 将本篇的内容整顿如下所示:

    graph LR
    
    B(quarkus 配置) --> C1(配置形式) 
    B(quarkus 配置) --> C2(配置内容) 
    C1 --> D1(System properties) 
    C1 --> D2(Environment variables) 
    C1 --> D3(.env file) 
    C1 --> D4(config 目录下的 application.properties) 
    C1 --> D5(src/main/resources 目录下的 application.properties) 
    C1 --> D6(MicroProfile Config configuration file) 
    C2 --> D7(惯例) 
    C2 --> D8(援用其余配置) 
    C2 --> D9(UUID) 
    C2 --> D10(数组) 

演示代码

  • 创立一个 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 + "]";
    }
}
  • 写好演示代码后,执行以下命令,将我的项目构建成繁多 jar 文件,用于稍后的验证操作
mvn clean package -U -DskipTests -Dquarkus.package.type=uber-jar
  • 构建胜利后,在 target 目录下生成文件 <font color=”blue”>hello-quarkus-1.0-SNAPSHOT-runner.jar</font>,咱们就用它来验证各种配置形式是否失效

配置形式一览

  • 官网给出一张图,阐明了所有配置形式以及它们的优先级

  • 接下来挨个试试这些配置形式

形式一:System properties

  • 最常见的是启动利用时候通过 <font color=”blue”>-D</font> 参数指定环境变量,例如上面的命令
java -Dgreeting.message="from system properties" -jar hello-quarkus-1.0-SNAPSHOT-runner.jar
  • 如下图,能够胜利获取属性值

形式二:Environment variables

  • 在设置环境变量时,要留神转换规则:全大写、点号变下划线,因而 <font color=”blue”>greeting.message</font> 在环境变量中应该写成 <font color=”red”>GREETING_MESSAGE</font>
  • 关上控制台,执行以下命令,即可在以后会话中设置环境变量:
export GREETING_MESSAGE="from Environment variables"
  • 在同一个控制台执行 <font color=”blue”>java -jar hello-quarkus-1.0-SNAPSHOT-runner.jar</font> 启动利用,浏览器拜访接口,如下图,可见环境变量已失效:

形式三:.env file

  • 为了防止之前的操作带来的影响,请 <font color=”red”> 从新关上一个控制台 </font>
  • 在 pom.xml 文件所在目录新建文件 <font color=”blue”>.env</font>,内容如下:
GREETING_MESSAGE=from .env file
  • 执行 <font color=”blue”>java -jar hello-quarkus-1.0-SNAPSHOT-runner.jar</font> 启动利用,浏览器拜访接口,如下图,可见环境变量已失效:
  • 这种配置形式有个问题要留神:<font color=”red”>.env 中的配置,在代码中应用 System.getenv(String) 无奈获得 </font>
  • 官网倡议不要将.env 文件提交到 git、svn 等版本控制工具中

形式四:config 目录下的 application.properties

  • 为了防止之前的操作带来的影响,请删除方才创立的 <font color=”blue”>.env</font> 文件
  • 于 <font color=”blue”>hello-quarkus-1.0-SNAPSHOT-runner.jar</font> 文件所在目录,新建文件夹 <font color=”red”>config</font>
  • 在 <font color=”blue”>config</font> 文件夹下新建文件 <font color=”red”>application.properties</font>,内容如下:

    greeting.message=from config/application.properties
  • 执行 <font color=”blue”>java -jar hello-quarkus-1.0-SNAPSHOT-runner.jar</font> 启动利用,浏览器拜访接口,如下图,可见环境变量已失效:

形式五:src/main/resources 目录下的 application.properties

  • 为了防止之前的操作带来的影响,请删除方才创立的 <font color=”blue”>config</font> 文件夹(外面的文件也删除)
  • src/main/resources 目录下的 application.properties,这个配置置信您应该很相熟,SpringBoot 也是这样配置的:
  • 运行利用试试,配置失效了

形式六:MicroProfile Config configuration file

  • 为了防止之前的操作带来的影响,请将 src/main/resources/application.properties 文件中的 <font color=”red”>greeting.message</font> 配置项删除
  • MicroProfile 是一个 Java 微服务开发的根底编程模型,它致力于定义企业 Java 微服务标准,其中的配置标准有如下形容:
  • 上图红框指出了 MicroProfile 规定的配置文件地位,咱们来试试在此地位搁置配置文件是否能失效
  • 如下图红框,在工程的 <font color=”blue”>src/main/resources/META-INF</font> 目录下新建文件 <font color=”red”>microprofile-config.properties</font>,内容如黄框所示

  • 运行利用试试,配置失效了
  • 留神:microprofile-config.properties 文件所在目录是 <font color=”blue”>src/main/resources/META-INF</font>,不是 <font color=”red”>src/main/resources/META-INF/resources</font>
  • 至此,六种配置形式及其实例验证都实现了,您能够依照本人的理论状况灵便抉择

配置内容:惯例

  • 当初咱们晓得了通过何种路径将配置信息传给利用,接下来要看的是配置信息自身:咱们能够在配置文件中输出哪些内容呢?
  • 最罕用的当然是字符串类型的键值对了,如下所示,方才始终在用的,就不赘述了:

    greeting.message=from config/application.properties

    配置内容:援用其余配置

  • 配置项的值能够援用其余配置项,如下所示,<font color=”blue”>greeting.message</font> 的值由两局部拼接而成:固定的 <font color=”red”>hello, </font>、以及配置项 <font color=”blue”>greeting.name</font> 的值,表达式的格局是 <font color=”green”>${配置项名称: 配置项找不到时的默认值}</font>,<font color=”red”>:xxxxxx</font> 的意思是如果找不到配置项 <font color=”blue”>greeting.name</font>,就用字符串 <font color=”red”>xxxxxx</font> 代替

    greeting.name=Will
    greeting.message=hello, ${greeting.name:xxxxxx}
  • 运行代码,浏览器收到响应如下,合乎预期,greeting.message 的值能够援用 greeting.name 配置项的值:
  • 当初去掉配置项 <font color=”blue”>greeting.message</font>,看看默认值 <font color=”red”>xxxxxx</font> 是否失效,如下图,在找不到配置项 <font color=”blue”>greeting.message</font> 的时候,咱们配置的默认值曾经失效了

    配置内容:UUID

  • 当同一个利用同时在多个机器上运行时,如何让每个过程有个独立的身份?
  • quarkus 提供了一个生成 UUID 的形式,能够低成本解决上述问题,如下所示,利用启动时,<font color=”blue”>${quarkus.uuid}</font> 会生成一个 UUID,此时的 greeting.message 的值也是惟一的

    greeting.message=hello, ${quarkus.uuid}
  • 运行利用试试,如下图,UUID 胜利生成了
  • 多刷几次浏览器,UUID 始终不变,看来此 UUID 在整个过程存活期间都不会扭转
  • 重启利用,再用浏览器拜访,如下图,UUID 已更新,看来过程身份的唯一性能够通过此配置来保障

    配置内容:汇合

  • 汇合类型的配置也是常见需要,上面是惯例的汇合配置

    my.collection=dog,cat,turtle
  • 对应的代码如下,可见只有被 ConfigProperty 润饰的成员变量是汇合类型就行

    @Path("/actions")
    public class HobbyResource {@ConfigProperty(name = "my.collection")
      List<String> message;
    
      @GET
      @Produces(MediaType.TEXT_PLAIN)
      public String hello() {return "Hello RESTEasy," + LocalDateTime.now() + "," + message + "";
      }
    }
  • 浏览器拜访此接口,响应如下,合乎预期
  • 还能够将汇合中的每个元素离开写,如下所示,代码不变,成果和后面的配置一样

    my.collection[0]=dog
    my.collection[1]=cat,turtle
    my.collection[2]=turtle
  • 至此,输出配置的惯例操作曾经讲完了,接下来的文章与本篇是配套的,会具体阐明如何在代码中应用这些配置

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

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

退出移动版