• quarkus实战之六:配置


    欢迎访问我的GitHub

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

    本篇概览

    • 本文是《quarkus实战》系列的第六篇,咱们来掌握一个常用知识点:配置
    • 如同SpringBoot中的application.properties文件,对一个quarkus应用来说,配置是其重要的组成部分,web端口、数据库这些重要信息都放在配置中,咱们在编码时也会将一些业务参数做成配置,而不是硬编码(hard code)
    • 与配置有关的知识点不少,本文重点是如何设置,下一篇会详细说明如何使用配置
    • 本篇要学习和掌握的内容:先实践六种具体的配置方式,例如通过在系统变量、application.properties中去设置配置项,它们都是不同的配置方式,然后,再一起去了解配置文件中可以输入什么样的内容,除了常见的key&value,还有哪些类型可以用来配置
    • 将本篇的内容整理如下所示:
    quarkus配置
    配置方式
    配置内容
    System properties
    Environment variables
    .env file
    config目录下的application.properties
    src/main/resources目录下的application.properties
    MicroProfile Config configuration file
    常规
    引用其他配置
    UUID
    数组

    演示代码

    • 创建一个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"
    
    • 用下面这段代码来演示配置是否生效,可见用了一个配置项greeting.message,所以我们需要配置它的值才行
    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目录下生成文件hello-quarkus-1.0-SNAPSHOT-runner.jar,咱们就用它来验证各种配置方式是否生效

    配置方式一览

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

      config sources

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

    方式一:System properties

    • 最常见的是启动应用时候通过-D参数指定环境变量,例如下面的命令
    java -Dgreeting.message="from system properties" -jar hello-quarkus-1.0-SNAPSHOT-runner.jar
    
    • 如下图,可以成功获取属性值

    image-20220305231052913

    方式二:Environment variables

    • 在设置环境变量时,要注意转换规则:全大写、点号变下划线,因此greeting.message在环境变量中应该写成GREETING_MESSAGE

    • 打开控制台,执行以下命令,即可在当前会话中设置环境变量:

    export GREETING_MESSAGE="from Environment variables"
    
    • 在同一个控制台执行java -jar hello-quarkus-1.0-SNAPSHOT-runner.jar启动应用,浏览器访问接口,如下图,可见环境变量已生效:

    image-20220306085525814

    方式三:.env file

    • 为了避免之前的操作带来的影响,请重新打开一个控制台
    • 在pom.xml文件所在目录新建文件.env,内容如下:
    GREETING_MESSAGE=from .env file
    
    • 执行java -jar hello-quarkus-1.0-SNAPSHOT-runner.jar启动应用,浏览器访问接口,如下图,可见环境变量已生效:

    image-20220306090306171

    • 这种配置方式有个问题要注意:.env中的配置,在代码中使用System.getenv(String)无法取得
    • 官方建议不要将.env文件提交到git、svn等版本控制工具中

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

    • 为了避免之前的操作带来的影响,请删除刚才创建的.env文件

    • hello-quarkus-1.0-SNAPSHOT-runner.jar文件所在目录,新建文件夹config

    • config文件夹下新建文件application.properties,内容如下:

      greeting.message=from config/application.properties
      
    • 执行java -jar hello-quarkus-1.0-SNAPSHOT-runner.jar启动应用,浏览器访问接口,如下图,可见环境变量已生效:

    image-20220306094258427

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

    • 为了避免之前的操作带来的影响,请删除刚才创建的config文件夹(里面的文件也删除)
    • src/main/resources目录下的application.properties,这个配置相信您应该很熟悉,SpringBoot也是这样配置的:

    image-20220306094630564

    • 运行应用试试,配置生效了

    image-20220306094943167

    方式六:MicroProfile Config configuration file

    • 为了避免之前的操作带来的影响,请将src/main/resources/application.properties文件中的greeting.message配置项删除
    • MicroProfile是一个 Java 微服务开发的基础编程模型,它致力于定义企业 Java 微服务规范,其中的配置规范有如下描述:

    image-20220306100652974

    • 上图红框指出了MicroProfile规定的配置文件位置,咱们来试试在此位置放置配置文件是否能生效

    • 如下图红框,在工程的src/main/resources/META-INF目录下新建文件microprofile-config.properties,内容如黄框所示

      image-20220306102242975

    • 运行应用试试,配置生效了

    image-20220306102406598

    • 注意:microprofile-config.properties文件所在目录是src/main/resources/META-INF,不是src/main/resources/META-INF/resources

    • 至此,六种配置方式及其实例验证都完成了,您可以按照自己的实际情况灵活选择

    配置内容:常规

    • 现在我们知道了通过何种途径将配置信息传给应用,接下来要看的是配置信息本身:我们可以在配置文件中输入哪些内容呢?
    • 最常用的当然是字符串类型的键值对了,如下所示,刚才一直在用的,就不赘述了:
    greeting.message=from config/application.properties
    

    配置内容:引用其他配置

    • 配置项的值可以引用其他配置项,如下所示,greeting.message的值由两部分拼接而成:固定的hello, 、以及配置项greeting.name的值,表达式的格式是${配置项名称:配置项找不到时的默认值}:xxxxxx的意思是如果找不到配置项greeting.name,就用字符串xxxxxx代替
    greeting.name=Will
    greeting.message=hello, ${greeting.name:xxxxxx}
    
    • 运行代码,浏览器收到响应如下,符合预期,greeting.message的值可以引用greeting.name配置项的值:
      在这里插入图片描述
    • 现在去掉配置项greeting.message,看看默认值xxxxxx能否生效,如下图,在找不到配置项greeting.message的时候,咱们配置的默认值已经生效了
      在这里插入图片描述

    配置内容:UUID

    • 当同一个应用同时在多个机器上运行时,如何让每个进程有个独立的身份?
    • quarkus提供了一个生成UUID的方式,可以低成本解决上述问题,如下所示,应用启动时,${quarkus.uuid}会生成一个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 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
    
    • 至此,输入配置的常规操作已经讲完了,接下来的文章与本篇是配套的,会详细说明如何在代码中使用这些配置

    欢迎关注博客园:程序员欣宸

    学习路上,你不孤单,欣宸原创一路相伴...

  • 相关阅读:
    二叉搜索树问题
    新增富文本单元格和XSS过滤器
    【论文精读8】MVSNet系列论文详解-UCS-Net
    2023年网络安全竞赛—内存取证解析
    【Java】将Base64格式的图片等比伸缩至目标尺寸代码实现
    IOS恢复
    Vue框架分享与总结
    Exch:修复丢失的系统邮箱
    Ajax零基础入门 Ajax零基础入门第一天
    解密序列化:背后的魔法与陷阱
  • 原文地址:https://www.cnblogs.com/bolingcavalry/p/17567294.html