微服务下使用maven做多环境配置
分享技术,用心生活
前言:很多项目在开发,提测,上线时都会提前手动改一些配置文件来适应对应环境,麻烦不说了,而且也容易出错;生产环境的配置也容易暴露。基于此,我们基于spring cloud alibaba架构下通过使用maven的profile来实现多环境切换的功能。
1 maven的profile介绍
详细可查阅官网:profile的描述
懒人版本可看下面的总结
1.1 在何处可以配置profile
- 在项目的pom.xml:作用范围仅限当前项目
- 在用户的setting.xml((%USER_HOME%/.m2/settings.xml)):作用范围仅限当前用户
- 在全局的setting.xml((${maven.home}/conf/settings.xml)):作用范围为全部项目
- 在项目的baseDir下的profiles.xml:maven3.0以上已废弃
1.2 激活profile的方式
- 显式激活:直接用命令,比如
mvn groupId:artifactId:goal -P profile-1
- 隐式激活:标签
<activation>
可以配置根据jdk、操作系统、系统属性、文件是否存在等方式,在构建时自动检测这些配置
2 配置profile
本文使用的是在项目的pom.xml
配置,可以实现在IDEA中手动选择环境并构建。
2.1 配置各环境文件
这里用网关module来操作
在resouces
目录下新建local,dev,test,prod文件,分别代表本地,开发,测试,生产环境。
举例dev中的配置内容:主要是加载nacos开发环境的命名空间下的路由配置gateway-route.yaml
,redis连接配置gateway-redis.yaml
,mq连接配置rabbitmq.yaml
你也可以把数据库连接配置也配置上,这样就达到了很好的屏蔽各种连接配置的暴露,尤其是账号密码。
bootstrap-dev.yaml
spring:
cloud:
nacos:
config:
extensionConfigs:
- dataId: gateway-route.yaml
refresh: true
- dataId: gateway-redis.yaml
refresh: true
- dataId: rabbitmq.yaml
refresh: true
file-extension: yaml
namespace: 2076a052-12fb-4ee5-ada1-c9bdcd2a0637
server-addr: 192.168.0.246:8848
discovery:
namespace: 2076a052-12fb-4ee5-ada1-c9bdcd2a0637
server-addr: 192.168.0.246:8848
配置bootstrap.yaml
spring:
profiles:
active: @env@
- 如果你的项目引用了
spring-boot-starter-parent
,那么需要使用@@
;反之使用${}
;原因是starter在其中定义了resource-delimiter
为@
本文用的是@@
来读取变量,使用spring.profiles.active
来使对应的配置文件生效
2.2 pom配置profiles
在gateway
模块下找到上一级support-module
,在其pom.xml
中配置profile,共有4个,对应上面配置的4种环境文件。
- 配置变量
<profiles>
<profile>
<id>dev</id>
<properties>
<env>dev</env>
</properties>
<!--默认环境-->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>local</id>
<properties>
<env>local</env>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<env>test</env>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<env>prod</env>
</properties>
</profile>
</profiles>
- 配置资源目录
大家思考下,为什么会有这一步呢?
前面提到过spring-boot-starter-parent
,它的pom下默认会有如下资源配置
简单来说,就是在构建时,需要copyresources
目录下所有文件至target
下,其中<includes>
下文件需要进行变量替换(filtering
为true),关于include
exclude
深入研究可以查看官网介绍
这个默认配置并不符合我们的要求,因为我们上面在gateway模块下创建了4个环境文件;如果按照默认配置的话我们虽然可以达到多环境的便捷使用效果,但是也同时copy了其他环境的文件。例如我们使用的是dev
环境,同时local
test
prod
下的文件也被构建在target
下,这不是我们想要的,且仍然有生产环境的配置泄露的风险。
所以,就有了这一步,我们需要自己配置资源目录,来覆盖默认的。
通过配置'bootstrap-${env}.yaml
来指定激活相对应的环境配置,这样就不会出现额外的环境配置了
通过上面可以知道gateway模块resources目录下存在国际化文件properties
和application
bootstrap
文件且都需要构建到target
,所以我们配置如下:
3 演示效果
配置完毕后,我们就可以在IDEA的maven面板处看到我们配置的profiles
- 在IDEA中选择
local
环境
- 启动gateway
从启动日志中可以看到已经加载到正确的文件
也可以在启动类Application
中打印环境变量
public static void main(String[] args) {
ApplicationContext applicationContext = SpringApplication.run(GatewayApplication.class, args);
Environment env = applicationContext.getEnvironment();
System.out.println("----run env:"+env.getProperty("spring.profiles.active")+"----");
}
再选择dev
环境,启动
第一个预期目标达成!
- 校验是否只加载了local配置文件
切换回local,在maven面板找到m
图标,左侧编写命令,右侧选择gateway
回车执行,等待打包完成,查看target
目录
完美的只加载了bootstrap-local.yaml
文件,第二个预期目标达成!
最后,我们在切换环境时,最好点一下maven面板中的reload
按钮,防止切换不生效。
微服务下使用maven做多环境配置的更多相关文章
- 微服务下 Spring Boot Maven 工程依赖关系管理
单体 Spring Boot Maven 工程 最基本的 pom.xml 包含工程信息.Spring Boot 父工程.属性配置.依赖包.构建插件 <?xml version="1.0 ...
- 微服务下的契约测试(CDC)解读
1. 前言 有近两周没有在公众号中发表文章了,看过我之前公众号的读者都知道,公众号中近期在连载<RobotFramework接口自动化系列课程>,原本计划每周更新一篇,最近由于博主在带一个 ...
- Spring Boot + Spring Cloud 构建微服务系统(九):配置中心(Spring Cloud Config)
技术背景 如今微服务架构盛行,在分布式系统中,项目日益庞大,子项目日益增多,每个项目都散落着各种配置文件,且随着服务的增加而不断增多.此时,往往某一个基础服务信息变更,都会导致一系列服务的更新和重启, ...
- 探索解析微服务下的RabbitMQ
概览 本文主要介绍如何使用RabbitMQ消息代理来实现分布式系统之间的通信,从而促进微服务的松耦合. RabbitMQ,也被称为开源消息代理,它支持多种消息协议,并且可以部署在分布式系统上.它轻量级 ...
- 【新书推荐】《ASP.NET Core微服务实战:在云环境中开发、测试和部署跨平台服务》 带你走近微服务开发
<ASP.NET Core 微服务实战>译者序:https://blog.jijiechen.com/post/aspnetcore-microservices-preface-by-tr ...
- Windows7+VS2012下OpenGL 4的环境配置
系统环境 Windows 7 Ultimate x64,Visual Studio Ultimate 2012 Update 4,和一块支持OpenGL 4.x的显卡. 准备工作 首先用GPU Cap ...
- Android 服务端开发之开发环境配置
Android 服务端开发之开发环境配置 这里是在Eclipse的基础上安装PhpEclipse插件方法,PHPEclipse是Eclipse的 一个用于开发PHP的插件.当然也可以采用Java开发a ...
- AspNetCore微服务下的网关-Kong(一)
Kong是Mashape开源的高性能高可用API网关和API服务管理层.它基于OpenResty,进行API管理,并提供了插件实现API的AOP.Kong在Mashape 管理了超过15,000 个A ...
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_4-2.微服务下登录检验解决方案 JWT讲解
笔记 2.微服务下登录检验解决方案 JWT讲解 简介:微服务下登录检验解决方案 JWT讲解 json wen token 1.JWT 是一个开放标准,它定义了一种用于简洁,自包含的用于通信双方 ...
- 小D课堂 - 新版本微服务springcloud+Docker教程_2_04微服务下电商项目基础模块设计
笔记 4.微服务下电商项目基础模块设计 简介:微服务下电商项目基础模块设计 分离几个模块,课程围绕这个基础项目进行学习 小而精的方式学习微服务 1.用户服务 ...
随机推荐
- 啊哈C语言案例学习笔记
Hello World #include<stdio.h> /* 技术要点: 初学者在编写程序时,经常会忘记在语句后边添加分号, */ int main() { printf(" ...
- 如何借助Kafka持久化存储K8S事件数据?
大家应该对 Kubernetes Events 并不陌生,特别是当你使用 kubectl describe 命令或 Event API 资源来了解集群中的故障时. $ kubectl get even ...
- nginx: [emerg] https protocol requires SSL support in /usr/local/nginx/conf/nginx.conf:50
最近在nginx中配置一个443端口 一.安装nginx 首先得先安装个nginx 1.安装依赖包 # 一键安装上面四个依赖 [root@dex ~]# yum -y install gcc zlib ...
- 数据科学工具 Jupyter Notebook 教程(二)
Jupyter Notebook 是一个把代码.图像.注释.公式和作图集于一处,实现可读性分析的交互式笔记本工具.借助所谓的内核(Kernel)的概念,Jupyter Notebook 可以同时支持包 ...
- wait_timeout and interactive_timeout 参数
wait_timeout and interactive_timeout 参数 非交互模式连接:通常情况下,应用到RDS实例会采用非交互模式,具体采用哪个模式需要查看应用的连接方式配置,比如PHP通过 ...
- vue 自己实现一套 keepalive 方案
vue自定义keepalive组件 前一阵来了一个新的需求,要在vue项目中实现一个多开tab页面的功能,本来心想,这不简单嘛就是一个增加按钮重定向吗?(当然如果这么简单我就不写这个文章了).很快写完 ...
- 【PAT】 1002 写出这个数 Rust Solution
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式: 每个测试输入包含 1 个测试用例,即给出自然数 n 的值.这里保证 n 小于 10100. 输出格式: 在一行 ...
- 尚医通-day12【token续期和就诊人管理】(内附源码)
页面预览 就诊人管理 就诊人列表 添加就诊人 查看就诊人 ![image-20230225060710 管理员系统用户管理 前面我们完成了用户登录.用户认证与就诊人管理,现在我们需要把这些信息在我们的 ...
- 一次性掌握innodb引擎如何解决幻读和不可重复读
了解mysql的都知道,在mysql的RR(可重复)隔离级别下解决了幻读和不可重复.你知道RR下是怎么解决的吗,很多人会回答是通过MVCC和next-key解决的,具体是怎么解决的,今天来重点分析下. ...
- SpringBoot项目启动 报错:Error executing Maven. end tag name </settings> must match start tag name
SpringBoot项目启动 报错:Error executing Maven. end tag name must match start tag name from line xxx 第一次创建s ...