前言

我们在日常开发过程中,在新建一个项目中,我们经常会将一个项目按照功能性、模块等将一个项目分成多个子项目,这些子项目都包含在主项目中。

今天老顾就介绍企业应用中,分布式项目如何将配置分为开发环境、测试环境、预演环境、生产环境,对于不同的环境参数配置,如何处理?以及如何规划配置文件?

项目规划

如一个电商系统,内部的核心系统架构,如下图

项目架构如下图

问题

在整个系统中,我们会配置数据库源的相关配置,如:

#============数据源配置================

spring:

  datasource:

    url: jdbc:mysql://127.0.0.1:3306/shop

    username: root

    password: 123456

    driver-class-name: com.mysql.cj.jdbc.Driver

还有dubbo微服务注册中心地址

dubbo:

  registry: 

    address: spring-cloud://127.0.0.1

上面的注册中心采用的是springcloud alibaba的nacos注册中心,这个不是重点

因为整个系统中有很多微服务,都要用到数据源和注册中心地址;那通常做法就是把各个服务application.yml中进行配置,如:业务逻辑项目rb-business也会在它的application.yml中也会用到注册中心地址。那问题来了:

这么多子项目中各自都配置了数据源以及注册中心,显然不合理;万一地址变了,那所有的子项目都要进行更改

那这么进行修改呢?

配置子项目

怎么解决上面的问题?就是再新建一个公共配置的子项目,把公共的配置放在配置子项目中,然后其他子项目引用这个公共配置子项目。我们可以把数据库配置,redis配置参数、oss、sms等共同需要的配置写在里面,我们观察一些配置文件的名字的命名方式application-xxx.properties(也可以yml格式);这个必须要准守,因为我们要利用一下springboot的机制。继续往下看。

spring.profiles.include

小伙伴有没有见过profiles.include呢?好像一直在用profiles.active。SpringBoot能使用application- {你的自定义profile名称myProfileName} .properties模式添加任何你指定配置文件到其属性文件。要加载特定的配置文件属性文件,我们可以使用命令行选项-Dspring.profiles.active = myProfileName。缺省默认SpringBoot是加载application.properties,无需任何-Dspring.profile.active选项。

或使用-Dspring.profiles.active = default来加载。默认属性文件也可以命名为application-default.properties。

默认配置文件application.properties中指定的任何属性将被你指定加载的配置文件中的的属性覆盖。也可以在application.properties中指定激活配置文件。

spring.profiles.active=prod

比如你有三个配置文件:

src/main/resources/application.properties(默认的)

src/main/resources/application-dev.properties(你指定的dev)

src/main/resources/application-prod.properties(你指定的prod)

如果在application.properties中有:

spring.profiles.active=prod

那么SpringBoot将加载application-prod.properties内容。如果你在代码中使用配置文件中的变量:

@Configuration

public class UserBean {

  @Value("${app.name}")

  private String name;

  @Value("${app.age}")

  private int age;

如果application-prod.properties和application.properties都有app.name和app.age,那么以prod中配置的值为主。 spring.profile.include属性在application-prod.properties还可以加入:spring.profiles.include=redis,db这是无条件地添加活动配置文件(以逗号分隔)。此属性添加的配置文件不会根据某些条件或命令行开关决定是否添加,而是始终无条件添加它们。上述配置是就加载了:

src/main/resources/application-redis.properties

src/main/resources/application-db.properties

这两个配置文件中的内容。即使这些文件在其他子项目resources中,也可以被加载 我们只需要在rb-user-server、rb-goods-server等引用项目中引用rb-common-config这个子项目。并且在项目中的application.yml配置文件中,加入:

spring:   

  profiles:

    include:

    - redis

    - db

    - nacos 

就可以引用rb-common-config中的配置文件了。有些细心的小朋友会问,那个rb-common-config项目的配置文件是在resources目录下的config文件夹下的哦,怎么也会加载呢?

配置文件目录

SpringBoot配置文件可以放置在多种路径下,不同路径下的配置优先级有所不同可放置目录(优先级从高到低)

file:./config/ (当前项目路径config目录下); file:./ (当前项目路径下); classpath:/config/ (类路径config目录下); classpath:/ (类路径config下).

优先级由高到底,高优先级的配置会覆盖低优先级的配置SpringBoot会从这四个位置全部加载配置文件并互补配置;我们可以从ConfigFileApplicationListener这类便可看出,其中DEFAULTSEARCHLOCATIONS属性设置了加载的目录:所以之前的配置文件在config目录中也照样有效,而且优先级高一级哦。到这里为止,我们很好的把公共的配置项,转移到子项目rb-common-config文件下了,其中的关键点就是,在引用项目加入spring.profiles.include配置。

多环境配置

在开发过程中,我们都会区分开发环境,测试环境,预演环境,生产环境等;不同环境的配置参数是不一样的。分布式项目中如何应用呢?网上大多数介绍是针对单个项目工程的,利用上面介绍的spring.profiles.active配置来进行区分不同的环境:

src/main/resources/application.properties(默认的)

src/main/resources/application-dev.properties(开发环境)

src/main/resources/application-prod.properties(生产环境)

想要什么环境,在启动的时候

java -jar xxx.jar --spring.profiles.active=prod

上面就是应用了生产环境了。 这种方式是否可以应用到分布式多项目中,也是可以的,我们可以把rb-common-config中也配置多个配置文件,如:

src/main/resources/config/application-devDB.properties(开发环境)

src/main/resources/config/application-devRedis.properties(开发环境)

src/main/resources/config/application-prodDB.properties(生产环境)

src/main/resources/config/application-prodRedis.properties(生产环境)

然后在引用项目中如rb-user-server中 application-dev.properties加入

spring.profiles.include=devDB,devRedis

application-prod.properties加入

spring.profiles.include=prodDB,prodRedis

启动rb-user-server.jar

java -jar rb-user-server.jar --spring.profiles.active=prod

这样就做到了区分多环境的目的。

多环境配置问题总结

在上面的多环境配置中,我们需要在各个项目中,新建多个properties文件,区分不同的环境,这个是比较麻烦的事情,而且不够优雅。遗留问题一:那有没有一种方案,不需要建那么多的配置文件,每个项目只需要必须的配置文件就行了呢?遗留问题二:上面的方案中,涉及到了开发环境,测试环境,预演环境,生产环境,我们把各自环境的参数配置到各自的配置文件中。这里就出现了安全问题数据库的连接地址,用户名与密码等直接暴露在开发人员面前;开发与测试环境安全要求低,还能接受;但是生产环境的相关服务器参数直接暴露在开发人员面前,那是很不安全的。那怎么处理呢?上面遗留的问题,老顾在下一篇文章中,进行分享介绍,谢谢!!!

·【漫画】谈谈架构中的限流与计数器的实现方式·【漫画】面试经常问到的三个并发工具类·实用!盘点永久关闭电脑弹窗广告的几种方式·字节跳动面试官金口玉言,收藏党的春天来了

点击在看,驱动原创

application.properties引用其他文件_企业级SpringBoot应用多个子项目配置文件规划、多环境支持(一)...相关推荐

  1. application.properties引用其他文件_金橙智能 | C语言头文件组织与包含原则,你知道吗?...

    点击蓝字 关注我们 同学们知道C语言中头文件的组织与包含原则吗?如果你还不知道,那么小橙来给你讲解一下,希望同学可以认真学习. 头文件的作用 程序执行在预处理阶段,编译器会把源文件包含的头文件中的内容 ...

  2. dubbo protocol port 消费者端_企业级 SpringBoot 与 Dubbo 的并用

    点击上方"匠心零度",选择"设为星标" 做积极的人,而不是积极废人 作者:SimpleWu cnblogs.com/SimpleWu/p/10833555.ht ...

  3. springboot 上传文件_基于SpringBoot的文件上传

    在实际的企业开发中,文件上传是最常见的功能之一,SpringBoot集成了SpringMVC常用的功能,当然也包含了文 件上传的功能,实现起来没有太多的区别. 下面我们来讲解一下,使用SpringBo ...

  4. eclipse spring boot项目搭建_基于Spring-boot的kettle调度项目

    介绍 基于Spring-boot的kettle调度项目,参考了zhaxiaodong9860的代码并引用了其中的页面管理,后台代码自行参考了API进行工具化编写,方便使用 在原代码的基础上加入以下功能 ...

  5. SpringBoot之yaml语法、配置文件、多环境切换

    SpringBoot Banner生成网站:https://www.bootschool.net/ascii 在SpringBoot项目的resource目录下,新建一个banner.txt文件,将自 ...

  6. Java多线程读取excel文件_解决springboot 多线程使用MultipartFile读取excel文件内容报错问题...

    springboot项目开启多线程 启动类加注解开启 @EnableAsync,实现类方法加注解 @Async 前端页面 报错信息 java.io.FileNotFoundException: C:\ ...

  7. mysql怎么引用别的文件_用source语句引用mysql文件的细节注意

    今天在使用 mysql数据库的时候,创建 数据表的时候出现了很多的小问题,今天一天花费了大量的时间去解决这些问题.首先就是一些小的细节,在文本编辑器上编辑好了SQL语句,然后转移到mysql的命令行中 ...

  8. eclipse java读取文件_在eclipse完成对Java_web项目里面资源文件的读取

    Java_web项目的资源文件一般有两种: 一种是存放数据之间有联系的文件,使用xml文件 另一种是存放数据之间没有联系的文件,使用properties文件 这里我们对properties文件读写做示 ...

  9. springboot项目层次结构_【SpringBoot】多模块项目结构搭建

    前言: 必需学会SpringBoot基础知识 简介: Takes an opinionated view of building production-ready Spring application ...

最新文章

  1. Zuul上传文件,中文文件名乱码解决办法
  2. [Codeforces Round #162 (Div. 2)]A. Colorful Stones (Simplified Edition)
  3. 两个点击事件共用一个方法_杭州淘宝直播代运营:一个简单的方法,提升直播间封面图点击率!...
  4. 视频 + PPT | 突破“十面埋伏”,银行业玩转数字化运营
  5. 在linux下安装db2全过程
  6. iOS XMPP Framework 中文概述
  7. 微型计算机硬件性能取决于什么,微型计算机硬件系统的性能主要取决于
  8. 纯js实现瀑布流布局及ajax动态新增数据
  9. 软件设计师考试内容纲要
  10. 苹果机查看macOS版本号
  11. 手把手带你开发豆瓣FM(vue)
  12. html网页设计实验原理,网页设计实验报告
  13. 文后参考文献著录规则
  14. FPGA 可编程性与布局布线原理探究
  15. MFC:应用程序无法正常启动(0xc0150002)
  16. 《数学之美》知识点详细总结
  17. python3 flask 使用Mysql数据库
  18. 第2章 变量、数据类型、运算符
  19. Win10彻底永久关闭自动更新的四种方法介绍
  20. android app文件夹,android app文件目录结构

热门文章

  1. day33 java的多线程(5)
  2. Python统计TXT词云
  3. java微信内h5调起支付_java微信支付--------公众号内H5调起支付
  4. springBoot+mybaits+达梦数据库
  5. 后台运行linux程序,后台运行Linux程序的方法
  6. java标识符和关键字相关概念
  7. android lru进程队列,Android缓存机制——LruCache
  8. Java摇骰子比大小_还在摇骰子比大小?这几款火热的KTV喝酒游戏你值得收藏
  9. 【快速入门Linux】7_Linux命令—使用su命令切换用户出现认证失败
  10. 【windows】下Anaconda详细安装过程