【Java系列】SpringCloudAlibaba 实现在不修改配置文件情况下适配不同环境部署

本文将向大家介绍在SpringCloudAlibaba微服务架构中,如何实现多个微服务在不修改各自配置文件的情况下适配不同环境进行部署。

作者:后端小肥肠

1. 前言

在现代软件开发过程中,随着敏捷开发和持续集成的普及,开发团队越来越需要在多个环境中快速部署应用。这种需求促使开发者寻找更为灵活和高效的部署方案。尤其是在使用Spring Cloud Alibaba框架的项目中,如何在不修改配置文件的情况下实现环境的快速切换,成为了提高开发效率和降低环境导致的错误的关键。

2. 实现思路

2.1. SpringCloudAlibaba加载配置文件的顺序

Spring Cloud 通过 bootstrap.ymlapplication.yml 文件来加载应用程序的配置信息。这两个文件在 Spring Boot 应用程序中扮演着不同的角色,其加载顺序和原理如下:

2.1.1. 加载顺序:
  1. bootstrap.yml:首先加载 bootstrap.yml 文件。这里可以定义一些系统级别的配置信息,比如连接远程配置中心的地址、加密/解密相关的配置等。

  2. application.yml:然后加载 application.yml 文件。这里定义的是应用程序级别的配置信息,比如数据库连接信息、端口号等。

2.1.2. 加载的内容:
  1. bootstrap.yml 的加载

    • 当 Spring Boot 应用程序启动时,首先会加载 bootstrap.yml 文件。
    • 这个过程是在 Spring Boot 启动时的一个很早的阶段进行的。
    • bootstrap.yml 主要用于应用程序上下文创建之前需要的一些特殊配置,比如配置中心的地址、加密解密的相关配置等。
  2. application.yml 的加载

    • 一旦 bootstrap.yml 加载完成,接着加载 application.yml 文件。
    • application.yml 文件包含了应用程序的各种配置,比如数据库配置、日志配置等。
    • 这些配置会在应用程序上下文创建后被加载。

2.2. 实现思路讲解

要实现在不修改配置文件情况下适配不同环境部署微服务,那么我们需要有一个common模块,common模块中有一个公共的配置文件,里面存放所有环境的Nacos配置信息:

如上图所示,下游服务只需要读取common模块中当前环境的配置信息,即可实现不修改配置文件的情况下快速适配各种环境进行部署(dev、test、prod)。

3. 开发环境搭建

3.1. 所需版本工具

依赖版本
Spring Boot2.6.3
Spring Cloud

2021.0.1

Java1.8以上
Spring Cloud Alibaba2021.0.1.0
spring-cloud-starter-alibaba-nacos-discovery2021.0.1.0
spring-cloud-starter-alibaba-nacos-config2021.0.1.0
Nacos2.0.4

3.2. pom依赖

common模块依赖:

<dependencies><!--Nacos依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><exclusions><exclusion><groupId>com.netflix.ribbon</groupId><artifactId>ribbon</artifactId></exclusion></exclusions></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>
</dependencies>

下游微服务在pom中引入common模块即可:

  <dependency><groupId>com.geoscene</groupId><artifactId>image-integration-common</artifactId><version>1.0-SNAPSHOT</version></dependency>

4. 技术实践

4.1. common模块配置

在common模块resource文件夹下新增config文件夹,放入公共bootstrap.yml和application.yml:

编写公共bootstrap.yml:

# 本地开发环境
spring:config:activate:on-profile: devcloud:nacos:discovery:server-addr: 127.0.0.1:8848username: nacospassword: nacosnamespace:config:server-addr: 127.0.0.1:8848username: nacospassword: nacosnamespace:file-extension: yaml---
# 测试环境
spring:config:activate:on-profile: testcloud:nacos:discovery:server-addr: 测试环境参数username:  测试环境参数password:  测试环境参数namespace:  测试环境参数config:server-addr:  测试环境参数username:  测试环境参数password:  测试环境参数namespace:  测试环境参数file-extension: yaml
---
# 正式环境
spring:config:activate:on-profile: prodcloud:nacos:discovery:server-addr: 正式环境参数username: 正式环境参数password: 正式环境参数namespace: 正式环境参数config:server-addr: 正式环境参数username: 正式环境参数password: 正式环境参数namespace: 正式环境参数file-extension: yaml

编写公共application.yml: 

spring:mvc:pathmatch:# 该配置解决 Spring Boot 2.6.* 版本以上使用 Swagger 遇到的如下问题# Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerExceptionmatching-strategy: ant_path_matcher

4.2. 下游微服务配置

下游微服务配置分为以下几个步骤:

1. pom中新增模块名称标签:

<name>image-integration-system</name>

2. pom中新增环境配置相关标签:

 <profiles><profile><id>dev</id><properties><spring.profiles.active>dev</spring.profiles.active></properties><!--没有指定其他profile为激活状态时,该profile就默认会被激活--><activation><activeByDefault>true</activeByDefault></activation></profile><profile><id>test</id><properties><spring.profiles.active>test</spring.profiles.active></properties></profile><profile><id>prod</id><properties><spring.profiles.active>prod</spring.profiles.active></properties></profile></profiles>

3.  编写bootstrap.yml

spring:application:name: @project.name@profiles:active: ${spring.profiles.active}

4. 编写application.yml并抽离至Naocs

5. 启动类上新增@EnableDiscoveryClient注解

5. 系统运行

5.1. 本地运行

在本机环境中选择运行环境即可启动微服务

运行程序

 

5.2. 测试环境及生产环境运行(Docker)

编写Dockerfile

FROM java:8u111-jre-alpine as builderARG profile
ENV work_dir /home/codeWORKDIR ${work_dir}ADD ./xx.jar ./xx.jarFROM java:8u111-jre-alpineARG profile
ENV work_dir /home/codeRUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeWORKDIR ${work_dir}COPY --from=builder ${work_dir}/xx.jar ./xx.jarENTRYPOINT ["java","-Dfile.encoding=utf-8","-jar", "-Xmx1536m","./xx.jar", "--spring.profiles.active=${profile}", "-c"]

编写Docker容器启动命令

docker run -id --name 容器名称 -p 端口号:端口号 --env profile=test 镜像名称:v1.0

6. 结语

本文讲解了如何在SpringCloudAlibaba中实现在不修改配置文件情况下适配不同环境部署的具体步骤,有这方面需求的同学可以根据文章进行具体实操,也欢迎在评论区留言进行技术探讨。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/659883.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

水下机器人(ROV)中继器(TMS)究竟是个啥?

前段时间公众号后台有人问释放ROV的装置&#xff0c;由于只用过观察级ROV Valor&#xff0c;博主一直以为他说的是绞车&#xff0c;后来才明白他说的是中继器&#xff0c;在水中用来释放、控制和回收ROV的装置。 中继器TMS的全称是缆绳管理系统Tether Management System&#…

深度解析 Spring 源码:从BeanDefinition源码探索Bean的本质

文章目录 一、BeanDefinition 的概述1.1 BeanDefinition 的定位1.2 BeanDefition 的作用 二、BeanDefinition 源码解读2.1 BeanDefinition 接口的主要方法2.2 BeanDefinition 的实现类2.2.1 实现类的区别2.2.2 setBeanClassName()2.2.3 getDependsOn()2.2.4 setScope() 2.3 Bea…

记录浏览器打开网站拦截提示不安全解决方法

浏览器可能会因为多种原因显示“不安全”的警告,这通常是由于安全设置不当或配置错误造成的。以下是一些常见的原因和解决方法: 1. HTTPS未启用 原因:如果网站使用HTTP而不是HTTPS,浏览器可能会显示不安全的警告。 解决方法:配置SSL/TLS证书并使用HTTPS来加密数据传输…

深度解析:人工智能作画算法的原理与技术

引言 在数字艺术的探索中&#xff0c;人工智能&#xff08;AI&#xff09;作画算法以其独特的创造性和艺术性引起了广泛的兴趣。这些算法不仅仅是简单的图像处理工具&#xff0c;它们背后蕴藏着复杂的神经网络和深度学习模型。本文将深入探讨AI作画算法的原理与技术&#xff0…

CSS的布局模式

前言&#xff1a; 我们可以看到京东的官网上的一些例子&#xff08;如下图&#xff09;&#xff0c;在同一排中能够存在多个div&#xff0c;这是通过布局方式&#xff08;例如浮动&#xff09;来实现的。 CSS传统的布局模式&#xff1a; <1>普通流&#xff08;又称之为标…

Linux学习笔记:进程间的通信.共享内存shm

共享内存shm 什么是共享内存shm共享内存的特点关键函数ftokshmgetshmatshmdtshmctl 代码示例 什么是共享内存shm 进程间通信的前提:必须让不同的进程看到同一份资源,并且这个资源是OS提供的 而共享内存(Share memory)就是在内核共享内存区找一块物理内存空间,并允许多个进程共…

ReentrantReadWriteLock(可重入读写锁)源码解读与使用

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java源码解读-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1. 前言 2. 读写锁是什么 3. ReentrantReadWriteLock是什么 4. 源码解…

公文写作笔记

标题 最后一行的日期&#xff0c;后边占4个格子。两个数字占一格。落款单位在日期的正上方。 格式积累 内容&#xff1a; ①开头&#xff1a;缘由 ②主题&#xff1a;对策&#xff08;别人做得好&#xff0c;就借鉴&#xff09; ③结尾&#xff1a;简单的总结&#xff08;字…

聊聊Mysql的两阶段提交

从图中可看出&#xff0c;事务的提交过程有两个阶段&#xff0c;就是将 redo log 的写入拆成了两个步骤&#xff1a;prepare 和 commit&#xff0c;中间再穿插写入bin log&#xff0c;具体如下&#xff1a; prepare 阶段&#xff1a;将 事务的修改写入到 redo log&#xff0c;同…

GitLab(史上最全GitLab安装使用文章!!!)

GitLab 是一个基于网络的Git仓库管理工具&#xff0c;是开源的。基本每个公司都会有属于自己公司内部的GitLab 官方网站&#xff1a;https://about.gitlab.com/ GitLab文档&#xff1a;https://docs.gitlab.cn/jh/install/requirements.html 安装 所需配置 这里采用Cento…

TMS320F280049 EQEP模块--QWDOG UTIME(4)

QWDOG功能框图 下图是watchdog的功能框图。在WDE使能后&#xff0c;16bit宽的计数器QWDTMR在64分频的时钟下开始计数&#xff0c;在QCLK时会被重置。当QWDTMR到达QWDPRD时会置位WTO并产生WDTOUT事件。 所以该watchdog是用来检测电机是否转动的。假设电机停止转动&#xff0c;则…

stm32 hid自定义接收发送程序开发过程记录

cubleMX配置如下 修改端点描述符一次传输的数据大小 根据cubelMX标准在这里修改 编译错误 直接修改&#xff08;因为没有使用nodef &#xff09;编译通过 修改报告描述符&#xff08;默认的描述符无法传输数据&#xff09; 参考&#xff1a;USB协议详解第10讲&#xff08;USB描…