quarkus实战之八:profile

这篇具有很好参考价值的文章主要介绍了quarkus实战之八:profile。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

欢迎访问我的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.portquarkus.http.port都无效
  • 启动应用验证,我这是用mvn quarkus:dev命令启动的,如下图红框:
    quarkus实战之八:profile
  • 浏览器访问地址http://localhost:8081/actions,服务正常,配置项greeting.message的值也符合预期:
    quarkus实战之八:profile
  • 再试试另一种配置,先在application.properties文件中删除配置项quarkus.profile=dev,再改用mvn quarkus:dev -Dquarkus.profile=production启动应用,这次生效的配置项是%production.quarkus.http.port,如下图:
    quarkus实战之八:profile
  • 访问地址也变成了http://localhost:8082/actions
    quarkus实战之八:profile

需要大写的场景

  • 在《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.profile=dev -jar hello-quarkus-1.0-SNAPSHOT-runner.jar

不指定profile时的默认值

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

每个profile对应一个配置文件

  • 如果您希望每个profile都有自己的配置文件,quarkus也支持,如下所示,src/main/resources/目录下同时存在两个配置文件:application.propertiesapplication-staging.properties
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,如mvn quarkus:dev -Dquarkus.profile=staging,此时只有application-staging.properties文件生效,如下图

quarkus实战之八:profile

  • 还要注意一点:此时如果指定一个不存在的profile,例如mvn quarkus:dev -Dquarkus.profile=xxxxxxx,此时生效的是application.properties文件生效,如下图

quarkus实战之八:profile

Parent Profile

  • parent profile解决的问题是:假设当前profile是aaa,那么配置项xxx对应的配置名应该是%dev.aaa,如果找不到%dev.aaa,就去找它的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. 对于配置项quarkus.http.port,由于没找到%dev.quarkus.http.port,就去找parent profile的配置,于是找到了%common.quarkus.http.port,所以值为9090
  4. 对于配置项quarkus.http.ssl-port,由于找到了%dev.quarkus.http.ssl-port,所以值为9443
  5. 对于配置项quarkus.http.port,如果%dev.quarkus.http.port%common.quarkus.http.port都不存在,会用quarkus.http.port,值为8080

修改默认profile

  • 前面曾说到,启动的时候如果不指定profile,quarkus会指定默认的profile:将应用制作成jar,以java -jar命令启动时,profile会被设置为prod
  • 如果您想让默认值从prod变为其他值,可以在构建的时候用-Dquarkus.profile去改变它,例如下面这个命令,jar包生成后,启动的时候默认profile是prod-aws
mvn clean package -U -Dquarkus.package.type=uber-jar -Dquarkus.profile=prod-aws
  • 启动jar的时候不指定profile,如下图,profile已被设定为prod-aws

quarkus实战之八:profile

三个关键注意事项(重要)

  • quarkus官方给出了三个重点注意事项
  1. 应用在运行时,只会有一种profile生效
  2. 如果想在代码获取当前的profile,可以用此API
io.quarkus.runtime.configuration.ProfileManager#getActiveProfile
  1. 用注解的方式获取profile是无效的,下面这段代码无法得到当前的profile
 @ConfigProperty("quarkus.profile")
 String profile;

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

学习路上,你不孤单,欣宸原创一路相伴...文章来源地址https://www.toymoban.com/news/detail-608762.html

到了这里,关于quarkus实战之八:profile的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • quarkus实战之七:使用配置

    这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本文是《quarkus实战》系列的第七篇,前文讲述了如何在将配置信息传入quarkus应用,今天要练习的是如何使用这些配置信息 整篇文章由以下内容构成: 创建工程,作为演示使用配置项操作的代码 演

    2024年02月15日
    浏览(29)
  • quarkus实战之四:远程热部署

    将本地的改动极速同步到远程服务端,并自动生效,掌握此技能,开发调试会更高效 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本文是《quarkus实战》系列的第四篇,如标题所示,今天的任务是完成远程热部署实战 作为一名Java程序员,以下场

    2024年02月16日
    浏览(37)
  • quarkus实战之五:细说maven插件

    quarkus的maven插件非常重要,管理和构建工程时都离不开,本篇就来一起了解和掌握它 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本文是《quarkus实战》系列的第五篇,一起去熟悉quarkus的maven插件(就是下图红框中的那个plugin),用好它可以使

    2024年02月16日
    浏览(35)
  • quarkus实战之二:应用的创建、构建、部署

    这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本文是《quarkus实战》系列的第二篇,目标是开发HelloWorld应用,让我们对quarkus有最基本的了解,写好的代码会在以下几种场景运行,这应该覆盖了大部分运行情况,绿色背景的表示具体的运行方式,

    2024年02月16日
    浏览(29)
  • quarkus实战之三:开发模式(Development mode)

    这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 前文咱们曾提到过几种启动方式,有一种用maven命令启动的,可以进入开发模式,命令如下: 当时只提到此模式能看到详细系统信息,并未展开说明更多信息,实际上,此模式下还有很多实用的功能

    2024年02月16日
    浏览(29)
  • nginx启动后访问服务器显示centos欢迎界面

    nginx启动后访问服务器显示centos欢迎界面 步骤一:修改nginx配置文件 /etc/nginx/nginx.conf 修改前会访问/usr/share/nginx/html目录下的index.html 步骤二:重启nginx

    2024年02月13日
    浏览(61)
  • 解决nginx已配置但访问依旧跳转到nginx的欢迎页面

    1、确定nginx.conf配置没有问题 2、确保修改了nginx.conf文件后重启了nginx,nginx -s reload 3、查看是否有两个nginx在运行,如果有两个nginx运行,则停止nginx再重新启动         查看nginx运行:ps -ef | grep nginx         停止nginx:nginx -s stop         启动nginx:nginx 重新访问页面,

    2024年02月02日
    浏览(44)
  • 构建新一代的K8s原生Java微服务+Quarkus实战

    送书第一期 《用户画像:平台构建与业务实践》 送书活动之抽奖工具的打造 《获取博客评论用户抽取幸运中奖者》 送书第二期 《Spring Cloud Alibaba核心技术与实战案例》 送书第三期 《深入浅出Java虚拟机》 送书第四期 《AI时代项目经理成长之道》 送书第五期 《Kubernetes原生

    2024年02月08日
    浏览(44)
  • Android Compose UI实战练手----Google Bloom欢迎页

    在之前的博客中,我已经介绍了Compose 的基础UI和布局组件,现在我们就利用这些基础UI和布局组件去做一个实战项目。Bloom是Google提供的一个假想产品,我们可以作为练手项目使用,这个产品的详细UI设计稿大家可以自行去百度下,个人决定这里主要是熟练去使用Compose UI,不

    2024年02月09日
    浏览(40)
  • ruoyi项目服务器重启后台报:欢迎使用RuoYi后台管理框架,当前版本:v3.8.1,请通过前端地址访问。

    阿西,真的想骂人,不会耶,根本不会,咱就不明白了,怎么好好的项目在服务器上运行的好好的,不就是服务器到期了停了一下子再续上重启,再进去跟后台系统,就欢迎使用RuoYi后台管理框架,当前版本:v3.8.1,请通过前端地址访问。,真的好烦,不是自己写的代码,也

    2024年02月04日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包