首页 > 其他分享 >微服务下使用maven做多环境配置

微服务下使用maven做多环境配置

时间:2023-07-25 09:47:45浏览次数:40  
标签:xml 服务 配置 环境 maven yaml local gateway

分享技术,用心生活


前言:很多项目在开发,提测,上线时都会提前手动改一些配置文件来适应对应环境,麻烦不说了,而且也容易出错;生产环境的配置也容易暴露。基于此,我们基于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-boot-starter-parent,那么需要使用@@;反之使用${};原因是starter在其中定义了resource-delimiter@

springboot-pom

本文用的是@@来读取变量,使用spring.profiles.active来使对应的配置文件生效

spring:
 profiles:
     active: @env@

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下默认会有如下资源配置

starter-resource

简单来说,就是在构建时,需要copyresources目录下所有文件至target下,其中<includes>下文件需要进行变量替换(filtering为true),关于include exclude深入研究可以查看官网介绍

这个默认配置并不符合我们的要求,因为我们上面在gateway模块下创建了4个环境文件;如果按照默认配置的话我们虽然可以达到多环境的便捷使用效果,但是也同时copy了其他环境的文件。例如我们使用的是dev环境,同时local test prod下的文件也被构建在target下,这不是我们想要的,且仍然有生产环境的配置泄露的风险。

所以,就有了这一步,我们需要自己配置资源目录,来覆盖默认的。

通过配置'bootstrap-${env}.yaml来指定激活相对应的环境配置,这样就不会出现额外的环境配置了

通过上面可以知道gateway模块resources目录下存在国际化文件propertiesapplication bootstrap文件且都需要构建到target,所以我们配置如下:
resources

3 演示效果

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

  1. 在IDEA中选择local环境
    profiles
  2. 启动gateway

从启动日志中可以看到已经加载到正确的文件

run-local

也可以在启动类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环境,启动

run-dev

第一个预期目标达成!

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

切换回local,在maven面板找到m图标,左侧编写命令,右侧选择gateway
mvn-package
回车执行,等待打包完成,查看target目录

target-mulu

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

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

本文由mdnice多平台发布

标签:xml,服务,配置,环境,maven,yaml,local,gateway
From: https://www.cnblogs.com/douzige/p/17578894.html

相关文章

  • ubuntu安装OpenJDK 17,并配置环境变量
    要在Ubuntu上安装OpenJDK17并配置环境变量,请按照以下步骤进行操作:第一步:打开终端(Terminal)。第二步:使用以下命令更新系统软件包列表:sudoaptupdate第三步:安装OpenJDK17:sudoaptinstallopenjdk-17-jdk以上命令将安装OpenJDK17及其相关组件。第四步:验证JDK是否已成功......
  • Maven四种打包方式
    问题Maven可以使用mvnpackage指令对项目进行打包,如果使用java-jarxxx.jar执行运行jar文件,会出现"nomainmanifestattribute,inxxx.jar"(没有设置Main-Class)、ClassNotFoundException(找不到依赖包)等错误。解决方法要想jar包能直接通过java-jarxxx.jar运行,需要满足:1、......
  • 在 Arch 配置 i3-wm 终端模拟器 xterm
    在Arch配置i3-wm终端模拟器xterm关于怎么在Arch安装i3-wm可以查看上一篇文章......
  • 使用emca命令行配置EM并通过浏览器访问EM示例
    EM是OracleEnterpriseManager简称,本文涉及操作及命令:配置EM-创建删除重建:   emca-configdbcontroldb-reposrecreate|drop|create启动、关闭、查看EM状态    emctlstart|stop|statusdbconsole环境:OEL5.7,ORACLE11.2.0.4,VBOX虚拟机配置EM前检查事项:1.确定......
  • 1分布式微服务技术栈-SpringCloud<Eureka,Ribbon,nacos>
    微服务技术栈一、微服务介绍了解1架构结构案例与springboot兼容关系拆分案例拆分服务拆分-服务远程调用2eureka注册中心Eureka-提供者与消费者Eureka-eureka原理分析Eureka-搭建eureka服务Eureka-服务注册Eureka-服务发现3Ribbon组件负载均衡Ribbon-负载均衡原理Ribbon-负载......
  • 【高可用系统架构设计】SLA服务可用性4个9是什么意思?如何保证服务的高可用性 HA(High A
    如何保证服务的高可用性HA(HighAvailability)?高可用HA(HighAvailability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。方法论上,高可用是通过冗余+自动故障转移来实现的。我们都知道,单点是系统高可用的大敌,单点往往是系统高可用最大的......
  • centos 7配置ORACLE动态链接库
    随便在一个目录下解压instantclient-basiclite-linuxx64.zip(一般下最新的就好啦)然后在/etc/ld.so.conf文件添加解压完文件的目录 在执行ldconfig就好了。是不是很简单.ORACLE版本低的时候插入数据也许会报这个错cx_Oracle,cursor.execute(sql)执行的时候编码错误:UnicodeEn......
  • Spring Boot :项目属性配置
        这两天通过查阅了各种资料丰富了之前学习的了SpringBoot的各种东西,浅浅写一篇随笔结合之前学习的基本配置总结下吧。一、SpringBoot的项目属性配置    在之前的学习中很多时候会用到配置的信息,这些信息在测试环境和生产环境中总会有很多不同的配置,在配置完......
  • centos 5 yum安装与配置vsFTPd FTP服务器
    24Comments文章目录[隐藏]什么是vsftpd安装vsftpd配置防火墙配置vsftpd服务器添加ftp用户出现的错误vsftpd作为FTP服务器,在Linux系统中是非常常用的。下面我们介绍如何在centos系统上安装vsftp。 什么是vsftpdvsftpd是一款在Linux发行版中最受推崇的FTP......
  • 【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析
    Redis基本概念Redis(REmoteDIctionaryServer)是由SalvatoreSanfilippo开发的高性能key-value存储系统,完全遵守BSD协议并且开源免费。Redis特点说明Redis具有以下几个特点,使其与其他key-value缓存产品(如memcache)相区别。数据持久化:Redis支持将内存中的数据保存到磁盘中,以便在重新......