欢迎访问我的GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本篇概览
- 本文是《quarkus实战》系列的第八篇,经过前面的学习,咱们对配置有了足够了解,但问题也随之而来:如何让应用以最小的改动同时运行在不同环境(如本地、测试、生产等)
- 举个例子,下面是个简化版配置文件,有两个配置项,第一个固定不变,第二个随环境变化各不相同:
# 这个配置信息在各个环境中都是相同的
greeting.message=hello
# 这个配置信息在各个环境中都不一样
quarkus.http.port=9090
- 在实际部署的时候,如何达到要求呢?quarkus.http.port的值随着环境变化
- 不同环境用不同配置文件是一种方法,但会导致配置文件数量上升,并且greeting.message在各环境都是一样的,这就出现了冗余,除了维护成本增加,在管理过程中容易出错
- 除了多个配置文件,还有种方法可以满足要求,并且不需要多个配置文件,这就是今天要聊的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"
- 用下面这段代码来演示配置是否生效,可见用了一个配置项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 + "]";
}
}
- 配置文件是hello-quarkus/src/main/resources/application.properties
# 这个配置信息在各个环境中都是相同的
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的格式是%{profile-name}.config.name
- 以刚才的配置为例,quarkus.http.port配置项共出现三次,前两次带有前缀,格式是百分号+profile名称+点号,如下所示
# 指定当前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等于dev,会使用不同配置项%dev.quarkus.http.port,也就是说服务端口是8081,另外两个配置%production.quarkus.http.port和quarkus.http.port都无效
- 启动应用验证,我这是用mvn quarkus:dev命令启动的,如下图红框:
- 浏览器访问地址http://localhost:8081/actions,服务正常,配置项greeting.message的值也符合预期:
- 再试试另一种配置,先在application.properties文件中删除配置项quarkus.profile=dev,再改用mvn quarkus:dev -Dquarkus.profile=production启动应用,这次生效的配置项是%production.quarkus.http.port,如下图:
- 访问地址也变成了http://localhost:8082/actions
需要大写的场景
- 在《quarkus实战之六:配置》一文中,曾提到过配置方式有六种,有几种要求配置项大写,例如在.env中的配置,此时格式变成了_{PROFILE}_CONFIG_KEY=value,举例如下
# 这个配置信息在各个环境中都是相同的
GREETING_MESSAGE=hello
# 如果profile为dev,就是用此配置
_DEV_QUARKUS_HTTP_PORT=8081
# 如果profile为production,就是用此配置
_PRODUCTION_QUARKUS_HTTP_PORT=8082
# 如果不指定profile,就使用此配置
QUARKUS_HTTP_PORT=8080
- 注意,实测发现在.env中配置QUARKUS_PROFILE=dev无效,也就是说不能在.env中指定profile,此时应该在启动命令中指定profile,例如:
java -Dquarkus.p