分享技术,用心生活


前言:很多项目在开发,提测,上线时都会提前手动改一些配置文件来适应对应环境,麻烦不说了,而且也容易出错;生产环境的配置也容易暴露。基于此,我们基于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种环境文件。

  1. 配置变量
<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>
  1. 配置资源目录

大家思考下,为什么会有这一步呢?

前面提到过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目录下存在国际化文件propertiesapplication bootstrap文件且都需要构建到target,所以我们配置如下:

3 演示效果

配置完毕后,我们就可以在IDEA的maven面板处看到我们配置的profiles

  1. 在IDEA中选择local环境

  2. 启动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环境,启动

第一个预期目标达成!

  1. 校验是否只加载了local配置文件

切换回local,在maven面板找到m图标,左侧编写命令,右侧选择gateway



回车执行,等待打包完成,查看target目录

完美的只加载了bootstrap-local.yaml文件,第二个预期目标达成!

最后,我们在切换环境时,最好点一下maven面板中的reload按钮,防止切换不生效。

微服务下使用maven做多环境配置的更多相关文章

  1. 微服务下 Spring Boot Maven 工程依赖关系管理

    单体 Spring Boot Maven 工程 最基本的 pom.xml 包含工程信息.Spring Boot 父工程.属性配置.依赖包.构建插件 <?xml version="1.0 ...

  2. 微服务下的契约测试(CDC)解读

    1. 前言 有近两周没有在公众号中发表文章了,看过我之前公众号的读者都知道,公众号中近期在连载<RobotFramework接口自动化系列课程>,原本计划每周更新一篇,最近由于博主在带一个 ...

  3. Spring Boot + Spring Cloud 构建微服务系统(九):配置中心(Spring Cloud Config)

    技术背景 如今微服务架构盛行,在分布式系统中,项目日益庞大,子项目日益增多,每个项目都散落着各种配置文件,且随着服务的增加而不断增多.此时,往往某一个基础服务信息变更,都会导致一系列服务的更新和重启, ...

  4. 探索解析微服务下的RabbitMQ

    概览 本文主要介绍如何使用RabbitMQ消息代理来实现分布式系统之间的通信,从而促进微服务的松耦合. RabbitMQ,也被称为开源消息代理,它支持多种消息协议,并且可以部署在分布式系统上.它轻量级 ...

  5. 【新书推荐】《ASP.NET Core微服务实战:在云环境中开发、测试和部署跨平台服务》 带你走近微服务开发

    <ASP.NET Core 微服务实战>译者序:https://blog.jijiechen.com/post/aspnetcore-microservices-preface-by-tr ...

  6. Windows7+VS2012下OpenGL 4的环境配置

    系统环境 Windows 7 Ultimate x64,Visual Studio Ultimate 2012 Update 4,和一块支持OpenGL 4.x的显卡. 准备工作 首先用GPU Cap ...

  7. Android 服务端开发之开发环境配置

    Android 服务端开发之开发环境配置 这里是在Eclipse的基础上安装PhpEclipse插件方法,PHPEclipse是Eclipse的 一个用于开发PHP的插件.当然也可以采用Java开发a ...

  8. AspNetCore微服务下的网关-Kong(一)

    Kong是Mashape开源的高性能高可用API网关和API服务管理层.它基于OpenResty,进行API管理,并提供了插件实现API的AOP.Kong在Mashape 管理了超过15,000 个A ...

  9. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_4-2.微服务下登录检验解决方案 JWT讲解

    笔记 2.微服务下登录检验解决方案 JWT讲解     简介:微服务下登录检验解决方案 JWT讲解 json wen token 1.JWT 是一个开放标准,它定义了一种用于简洁,自包含的用于通信双方 ...

  10. 小D课堂 - 新版本微服务springcloud+Docker教程_2_04微服务下电商项目基础模块设计

    笔记 4.微服务下电商项目基础模块设计     简介:微服务下电商项目基础模块设计 分离几个模块,课程围绕这个基础项目进行学习             小而精的方式学习微服务 1.用户服务       ...

随机推荐

  1. 2021年蓝桥杯C/C++大学B组省赛真题(路径)

    题目描述: 小蓝学习了最短路径之后特别高兴,他定义了一个特别的图,希望找到图中的最短路径. 小蓝的图由2021 个结点组成,依次编号1 至2021. 对于两个不同的结点a, b,如果a 和b 的差的绝 ...

  2. 【python基础】变量

    1.初识变量 编程本质就是通过一定的规则,去操纵数据,变量作为数据的载体,在程序中经常会被用到.与变量相联系的还有一个名词叫数据类型,我们可以举一个生活中的例子,来理解数据类型-变量-数据三者之间的关 ...

  3. 2023-05-26:golang关于垃圾回收和析构函数的选择题,多数人会选错。

    2023-05-26:golang关于垃圾回收和析构的选择题,代码如下: package main import ( "fmt" "runtime" " ...

  4. odoo开发教程十七:controller

    一:controller简述 odoo里面的controller相似于springMVC,也是根据url来控制请求,把请求处理映射到具体某个方法上的. 类比于springmvc中,根据请求,在请求处理 ...

  5. Vue3从入门到精通(一)

    Vue3简介 Vue3是Vue.js的最新版本,于2020年9月18日正式发布.Vue3相比Vue2有很多改进和优化,包括但不限于: 更快的渲染速度:Vue3通过使用Proxy代理对象和优化虚拟DOM ...

  6. mysql索引优化-01

    1.1索引是什么?   mysql官方对于索引的定义:可以帮助mysql高效的获取数据的数据结构.   mysql在存储数据之外,数据库系统中还维护着满足特定查找算法的数据结构,这些数据结构给以某种引 ...

  7. 自己动手实现rpc框架(一) 实现点对点的rpc通信

    自己动手实现rpc框架(一) 实现点对点的rpc通信 1. 什么是rpc? RPC是远过程调用(Remote Procedure Call)的缩写形式,其区别于一个程序内部基本的过程调用(或者叫函数/ ...

  8. DevChat:将 GPT-4 无缝融入 VS Code,极致提升你的编程体验

    目录 一.絮絮叨叨 1.1 缘起 1.2 嫌弃 1.3 征服 二.认真聊聊 2.1 老板给了少年一个任务 2.2 少年祭出了 DevChat 2.3 让 DevChat 帮着选 web 框架 2.4 ...

  9. 怎么把 session 中的实体类转换回来

    例子 : 如上比如user user1=new user(): user1.id=1: user1.name="张三": session["user1"]=us ...

  10. 统信UOS系统开发笔记(八):在统信UOS上编译搭建mqtt基础环境(版本使用QMQTT::Clinet)

    前言   统信uos使用到mqtt开发,需要重新编译mqtt,本篇描述统信uos20上的mqtt源码编译和环境搭建.   注意   这里下载的mqtt版本与其他几篇文章的不同,这里是使用QMQTT:: ...