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

news2025/1/17 15:55:57

本文将向大家介绍在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: dev
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        username: nacos
        password: nacos
        namespace:
      config:
        server-addr: 127.0.0.1:8848
        username: nacos
        password: nacos
        namespace:
        file-extension: yaml

---
# 测试环境
spring:
  config:
    activate:
      on-profile: test
  cloud:
    nacos:
      discovery:
        server-addr: 测试环境参数
        username:  测试环境参数
        password:  测试环境参数
        namespace:  测试环境参数
      config:
        server-addr:  测试环境参数
        username:  测试环境参数
        password:  测试环境参数
        namespace:  测试环境参数
        file-extension: yaml
---
# 正式环境
spring:
  config:
    activate:
      on-profile: prod
  cloud:
    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.NullPointerException
      matching-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 builder

ARG profile
ENV work_dir /home/code

WORKDIR ${work_dir}

ADD ./xx.jar ./xx.jar

FROM java:8u111-jre-alpine

ARG profile
ENV work_dir /home/code

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

WORKDIR ${work_dir}

COPY --from=builder ${work_dir}/xx.jar ./xx.jar

ENTRYPOINT ["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.coloradmin.cn/o/1628213.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux c++ onvif客户端开发(8):GetServices

本文是Linux c onvif客户端开发系列文章之一&#xff1a; Linux c onvif客户端开发(1): 根据wsdl生成cpp源文件Linux c onvif客户端开发(2): 获取摄像头H264/H265 RTSP地址Linux c onvif客户端开发(3): 扫描设备Linux c onvif客户端开发(4): 扫描某个设备是否支持onvifLinux c…

2021 年全国职业院校技能大赛高职组“信息安全管理与评估”赛项 A 卷 第二阶段任务书

第二阶段任务书 一、赛项第二阶段时间180 分钟。 信息安全管理与评估 网络系统管理 网络搭建与应用 云计算 软件测试 移动应用开发 任务书&#xff0c;赛题&#xff0c;解析等资料&#xff0c;知识点培训服务 添加博主wx&#xff1a;liuliu5488233 三、注意事项 赛题第二阶段请…

BUUCTF--web(1)

1、[极客大挑战 2019]Http1 1.http报文请求&#xff1a; 1、请求行&#xff1a; 第一部分是请求方法&#xff0c;常见包括GET、POST、OPTIONS&#xff08;我目前还没有见过我是菜鸡&#xff09; 第二部分是url 第三部分是HTTP协议(http(Hypertext transfer protocol)超文本传…

CMakeLists.txt中如何添加编译选项?

1. 引子 编译器有多种可供选择&#xff0c;如g、c、clang等&#xff0c;如下以c作为示例。 2. 使用CMAKE_CXX_FLAGS添加编译选项 在Makefile中可能用类似如下的指令来添加编译选项&#xff1a; /usr/bin/c -Wall -Wextra -Wno-sign-compare -Wno-unused-variable -Wno-unuse…

网络基础(day3)

【 理论重点】 网络是什么&#xff1f; &#xff08;网络是载体&#xff0c;目的是传输互联网中的数据&#xff0c;数据是终端产生<手机、电脑、服务器等>。&#xff09; 如何组件网络&#xff08;良性网络架构&#xff09;&#xff1f;有网络架构思维&#xff0c;得按层…

C 函数递归

目录 什么是递归 递归的限制条件 递归的例子 1、用递归求n的阶乘 递归扩展学习 1、青蛙跳台阶 思路 代码实现 2、汉诺塔问题​ 思路 代码实现 总结 什么是递归 递归&#xff1a;“递推” “回归” 在C语言中&#xff0c;函数递归就是&#xff1a;函数自己调用自…

【docker】安装openjdk

查看可用的 openjdk版本 docker hub 查看地址&#xff1a;https://hub.docker.com/_/openjdk 此图片已被正式弃用&#xff0c;建议所有用户尽快找到并使用合适的替代品。其他官方形象替代品的一些例子&#xff08;按字母顺序列出&#xff0c;没有有意或暗示的偏好&#xff09;…

Python语言在地球科学交叉领域中的应用

Python是功能强大、免费、开源&#xff0c;实现面向对象的编程语言&#xff0c;Python能够运行在Linux、Windows、Macintosh、AIX操作系统上及不同平台&#xff08;x86和arm&#xff09;&#xff0c;Python简洁的语法和对动态输入的支持&#xff0c;再加上解释性语言的本质&…

羊大师分析,羊奶相伴五一畅享自然时光

羊大师分析&#xff0c;羊奶相伴五一畅享自然时光 羊奶相伴&#xff0c;五一畅享自然时光&#xff0c;这是一句富有诗意和生活气息的语句。羊奶&#xff0c;作为一种营养丰富、易于消化的饮品&#xff0c;不仅为人们提供了优质的蛋白质、矿物质和维生素&#xff0c;还因其独特…

vue echarts 柱状图 堆叠柱状图

echarts堆叠柱状图&#xff08;效果图在文章末尾&#xff09; 1、默认只显示 月度的 数据&#xff0c;手动点击 legend 季度的 数据才会显示&#xff1b; 2、监听左侧菜单栏的宽度变化&#xff0c;图表宽度自适应展示 <template><div><div id"barChart&q…

01数学建模 -线性规划

1.1线性规划–介绍 翻译翻译什么叫惊喜 1.2线性规划–原理 拉格朗日乘数法手算 最值化 f ( x , y ) , s . t . g ( x , y ) c , 引入参数 λ &#xff0c;有&#xff1a; F ( x , y , λ ) f ( x , y ) λ ( g ( x , y ) − c ) 再将其分别对 x , y , λ 求导&#xff0c…

MySQL第一次作业

解压完安装包 以管理员进入命令行 初始化并记住初始随机密码 创建服务名称 启动mysql 使用随机密码登录 修改密码 退出并重登服务器 MySQL创建数据库和表 创建数据库 创建表 1.进入数据库 创建表 向表中插入数据

服务器数据恢复—ESXi无法识别数据存储和VMFS文件系统如何恢复数据?

服务器数据恢复环境&#xff1a; 一台某品牌服务器&#xff0c;通过FreeNAS来做iSCSI&#xff0c;然后使用两台同品牌服务器做ESXi虚拟化系统。 FreeNAS层为UFS2文件系统&#xff0c;使用整个存储建一个稀疏模式的文件&#xff0c;挂载到ESXi虚拟化系统。ESXi虚拟化系统中有3台…

吴恩达2022机器学习专项课程(一)7.2 逻辑回归的简化成本函数课后实验 Lab5

问题预览/关键词 二分类问题的训练集&#xff08;多特征&#xff09;绘制训练集数据的散点图自定义plot_data() Python实现逻辑回归的成本函数自定义sigmoid() 调用成本函数不同的w&#xff0c;b&#xff0c;绘制逻辑回归模型的决策边界验证哪条决策边界效果好总结 二分类问题的…

【科学研究】农村出身:一种复杂的情感结构

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

前后缀分离,CF1209 C. Maximal Intersection

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 1029C - Codeforces 二、解题报告 1、思路分析 线段相交具有可…

【网络安全】HTTP协议 — 特点

专栏文章索引&#xff1a;网络安全 有问题可私聊&#xff1a;QQ&#xff1a;3375119339 目录 学习目标​ 一、请求与响应 1.服务器和客户端 二、不保存状态 1.不保存状态的协议 三、资源定位 1.URI&#xff08;统一资源标识符&#xff09; 四、请求方法 1.请求方法 五…

LangChain4j

文章目录 关于 LangChain4j特性2 levels of abstractionLibrary StructureTutorials (User Guide)Integrations and Models免责声明 Highlights定义由LLM提供支持的声明性 AI Services&#xff1a;使用 LLM 分类从非结构数据中提取结构化信息 Getting started兼容性 支持的 LLM…

[NSSCTF]prize_p5

前言 之前就学过反序列化的字符串逃逸 但是没怎么做题 补一下窟窿 题目 <?phperror_reporting(0);class catalogue{public $class;public $data;public function __construct(){$this->class "error";$this->data "hacker";}public functi…

Midjourney之利用tile进行图像拼粘,壁纸和纹理生成无缝拼图

hello 小伙伴们&#xff0c;我是你们的老朋友——树下&#xff0c;今天分享Midjourney提示词常用参数——tile&#xff0c;这个参数的主要作用是用来生成平铺图案&#xff0c;话不多说&#xff0c;直接开始~ 如果你想要各种图案的壁纸或者需要一些图案参考去制作织物&#xff…