欢迎访问我的GitHub

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

本篇概览

  • 本文是《quarkus实战》系列的第六篇,咱们来掌握一个常用知识点:配置
  • 如同SpringBoot中的application.properties文件,对一个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"
  • 用下面这段代码来演示配置是否生效,可见用了一个配置项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,咱们就用它来验证各种配置方式是否生效

配置方式一览

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

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

方式一:System properties

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

方式二:Environment variables

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

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

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

方式三:.env file

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

  • 这种配置方式有个问题要注意:.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启动应用,浏览器访问接口,如下图,可见环境变量已生效:

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

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

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

方式六:MicroProfile Config configuration file

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

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

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

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

  • 注意: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<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
  • 至此,输入配置的常规操作已经讲完了,接下来的文章与本篇是配套的,会详细说明如何在代码中使用这些配置

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

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

quarkus实战之六:配置的更多相关文章

  1. [原创].NET 业务框架开发实战之六 DAL的重构

    原文:[原创].NET 业务框架开发实战之六 DAL的重构 .NET 业务框架开发实战之六 DAL的重构 前言:其实这个系列还是之前的".NET 分布式架构开发实战 ",之所以改了 ...

  2. kubebuilder实战之六:构建部署运行

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  3. AI应用开发实战 - 从零开始配置环境

    AI应用开发实战 - 从零开始配置环境 与本篇配套的视频教程请访问:https://www.bilibili.com/video/av24421492/ 建议和反馈,请发送到 https://gith ...

  4. Zookeeper C++编程实战之配置更新

    CZookeeperHelper:https://github.com/eyjian/libmooon/blob/master/include/mooon/net/zookeeper_helper.h ...

  5. webpack4 中的最新 React全家桶实战使用配置指南!

    最新React全家桶实战使用配置指南 这篇文档 是吕小明老师结合以往的项目经验 加上自己本身对react webpack redux理解写下的总结文档,总共耗时一周总结下来的,希望能对读者能够有收获, ...

  6. 9.Spring Boot实战之配置使用Logback进行日志记录

    转自:https://blog.csdn.net/meiliangdeng1990/article/details/54300227 Spring Boot实战之配置使用Logback进行日志记录 在 ...

  7. MyBatis实战之配置

    MyBatis最重要的配置也就两个,一个是mybatis-config.xml,又称MyBatis的全局配置,另一个就是XXXDao.xml或XXXMapper.xml映射配置. mybatis-co ...

  8. vue项目实战, webpack 配置流程记录

    vue项目实战记录,地址在这 购物车单界面 npm install npm run dev 跑起来可以看到界面效果 这里简单记录一下webpack的编译流程 入口 package.json " ...

  9. 基于SpringCloud的Microservices架构实战案例-配置文件属性内容加解密

    使用过SpringBoot配置文件的朋友都知道,资源文件中的内容通常情况下是明文显示,安全性就比较低一些.打开application.properties或application.yml,比如mysq ...

  10. spring4.1.8扩展实战之六:注册bean到spring容器(BeanDefinitionRegistryPostProcessor接口)

    本章是<spring4.1.8扩展实战>系列的第六篇,目标是学习如何通过自己写代码的方式,向spring容器中注册bean: 原文地址:https://blog.csdn.net/boli ...

随机推荐

  1. C51笔记-郭天祥-第二章 从点灯大师开始

    第2章  Keil软件的使用及流水灯设计 Keil的用法:用Keil建立工程: 工程配置: C51单片机程序软件仿真.单步.全速.断点设置和变量查看等: 用一个完整的C51程序操控LED亮灭: 调用库 ...

  2. 【总结】浅刷leetcode,对于位运算提高性能的一些总结

    目录 什么是位运算? 位运算技巧 1. 判断奇偶性 2. 交换两个数 3. 判断一个数是否是2的幂次方 4. 取绝对值 5. 计算平均数 结论 位运算技巧是计算机科学中非常重要的一部分,它可以用来解决 ...

  3. 加速 AI 训练,如何在云上实现灵活的弹性吞吐

    AI 已经成为各行各业软件研发的基础,带来了前所未有的效率和创新.今天,我们将分享苏锐在AWS量化投研行业活动的演讲实录,为大家介绍JuiceFS 在 AI 量化投研领域的应用经验,也希望为其他正在云 ...

  4. 特性介绍 | MySQL 测试框架 MTR 系列教程(二):进阶篇 - 内存/线程/代码覆盖率/单元/压力测试

    作者:卢文双 资深数据库内核研发 序言: 以前对 MySQL 测试框架 MTR 的使用,主要集中于 SQL 正确性验证.近期由于工作需要,深入了解了 MTR 的方方面面,发现 MTR 的能力不仅限于此 ...

  5. 深入浅出 OkHttp 源码解析及应用实践

    作者:vivo 互联网服务器团队- Tie Qinrui OkHttp 在 Java 和 Android 世界中被广泛使用,深入学习源代码有助于掌握软件特性和提高编程水平. 本文首先从源代码入手简要分 ...

  6. AcWing 423. 采药

    辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师. 为此,他想拜附近最有威望的医师为师. 医师为了判断他的资质,给他出了一个难题. 医师把他带到一个到处都是草药的山洞里对他说:"孩子 ...

  7. 如何使用Map处理Dom节点

    本文浅析一下为什么Map(和WeakMap)在处理大量DOM节点时特别有用. 我们在JavaScript中使用了很多普通的.古老的对象来存储键/值数据,它们处理的非常出色: const person ...

  8. flutter填坑之旅(widget原理篇)

    Flutter 的跨平台思路快速让他成为"新贵",连跨平台界的老大哥 "JS" 语言都"视而不见",大胆的选择 Dart 也让 Flutte ...

  9. Linux服务器设置虚拟内存

    cd /usrsudo mkdir swapcd swapsudo dd if=/dev/zero of=/usr/swap/swapfile bs=1M count=4096du -sh /usr/ ...

  10. 尚医通day01-【项目环境搭建和医院设置详细步骤】(内附源码)

    第01章-项目介绍 1.课程介绍 项目名称:尚医通预约挂号统一平台 项目原型:https://www.114yygh.com 北京市预约挂号统一平台 项目技术栈:前后端分离 后端技术:SpringBo ...