先思考一个问题。

假如我们有一个数百万用户正在用的网站,网页文件部署在几台服务器上。那现在我们要开发上线一个新功能,应该怎么做呢?

老弟小阿巴问:写好代码后,直接更新服务器上的网页文件么?

我一巴掌抽过去:那万一你的代码有 Bug,不就影响到线上用户的使用了么?

老弟思考了下:那写好代码后,在本地测试运行没有问题后,再发布上线?

我:思路不错,但问题在于,如果本地和线上运行项目时,连接的是同一个数据库,那么当你在本地测试向数据库中插入乱七八糟的假数据、或者修改数据库表结构时,不就会影响到线上的数据了么?

老弟一拍手:对哦,那如何让本地的测试不影响到线上项目呢?

这就需要 多环境 。根据实际需要,将同一个项目(或同一套代码)按照一定方法进行区分,并将所需资源和项目本身部署到不同的机器上。不同环境的项目可以有 不同的行为 ,且能够 同时存在、互不影响

举个例子,可以给线上项目搭建一套开发环境,开发环境的数据存储在独立的开发数据库,并且为了调试方便,不需要登录也能够访问所有的用户数据:

这样一来,本地和线上的项目就完全隔离开了,开发者在本地想怎么折腾就怎么折腾!这便是多环境的好处。

多环境听起来虽然挺爽的,但事实上,环境不是区分的越多越好!

一方面是搭建多环境需要额外的工作量;另一方面是项目依赖的资源越多,成本就越高,而且维护起来也更麻烦。

因此,企业中常用的环境也就那么几种,都快成为一种约定俗成的规范了,下面给大家介绍一下。

不同团队区分环境的方式可能不同,仅供参考。

一般用 local 标识,是指前端或后端独立开发、自主测试的环境。通常就是让项目和依赖在我们自己的电脑上运行,比如数据库、缓存、队列等各种服务,可能需要自己在本地搭建。

一般用 dev 标识,是指前端和后端(或者多个程序员)一起协作开发、联调的环境。通常将项目和依赖放在员工电脑可以直接访问的开发机上,不用自己搭建,直接跑起来项目,提高开发和协作效率。

对规模不大的团队来说,开发和本地环境其实有一套就够了,毕竟本地也可以连接公用的数据库等服务。

一般用 test 标识,是指前端和后端开发和联调完成,做出完整的新功能后,交给测试同学去找 Bug 的环境。

通常在测试环境需要有独立的测试数据库和其他服务,让测试同学大显身手。每次修改完 Bug 后,也都要再次发布项目到测试环境,让测试同学重新验证。

预发布环境

一般用 pre 标识,这是和线上项目最接近的环境,一般是测试验证通过、产品经理体验过后,才能将项目发布到这个环境。

实际上,预发布环境的项目调用的后端接口、连接的数据库、服务等都 和线上项目一致 ,和线上唯一的区别就是前端访问的域名不同。

正因如此,预发布环境看到的都是真实的用户数据,可以发现更多测试环境因为数据不足而没查出来的 Bug。

一般用 prod 标识,又叫线上环境,是给所有真实用户使用的环境。

因此不能随意修改,且发布项目到该环境时必须格外小心。线上的数据库、机器等资源一般也是由专业的运维来负责,想要登录机器、修改配置,都需要经过严格审批。

如何实现?

最后再介绍下多环境的实现方式,其实大同小异,遵循 3 个步骤:抽象配置类 + 配置文件化 + 注入环境参数,就能轻松实现~

抽象配置类

将项目代码中需要根据环境的变化而更改的变量整理到一个或多个配置类中,集中管理。

举个例子,连接数据库时,我们需要数据库 IP、端口、配置等信息,代码如下:

// 数据库基本信息
DB db = new DB();
db.setIp("10.0.0.1");
db.setPort(3306);
// 数据库连接配置
DBConnection c = new DBConncetion();
c.setTimeout(1000);

我们可以将这些代码中写死的值全部替换成变量,将同类变量放到一个类中:

// 数据库配置类
class DBConfig {
  String ip = "10.0.0.1";
  int port = 3306;
  long timeout = 1000L;

然后从这个类中读取变量的值:

DB db = new DB();
DBConfig cf= new DBConfig() 
// 从类中获取
db.setIp(cf.getIp());
db.setPort(cf.getPort());
DBConnection c = new DBConncetion();
c.setTimeout(cf.getTimeout());

这样的好处是,如果代码中还有其他地方用到了这些变量,也都可以从同一个类去获取,而不是把 死值 重复写多次,难以维护。

配置文件化

我们可以用专门的配置文件来维护配置,从而让用户修改配置更方便,不用再去找代码、改代码。

常见的配置文件格式有 propertiesyamlymljson 等,比如新建一个数据库配置文件 db.properties

db.ip=10.0.0.1
db.port=3306
db.timeout=1000

接下来在初始化数据库时,就可以将配置文件中的值加载到上一步写好的配置类中,然后读取啦:

// 从文件读取配置的值
DBConfig cf = new DBConfig("db.properties");
db.setIp(cf.getIp());
db.setPort(cf.getPort());
...

其实只不过是把配置的值从代码中移到了文件中而已~

但这样一来,我们想加载哪个配置文件就能加载哪个!

比如要搞一套测试环境的配置,只需再新建一个 db-test.properties 文件(文件名中加个环境名称),就能在这个文件中编写独立的配置了,然后在代码中加载该文件即可:

new DBConfig("db-test.properties");

无论是前端还是后端,大部分的多环境实现都是这个原理 —— 搞多套配置,所以总能在项目中看到类似的配置文件:

注入环境参数

到目前为止,其实我们还是在代码中写了 死值 ,来告诉程序应该加载哪个名称的配置文件。

比如在本地开发时,加载 db-dev.properties ,开发完成后、正式上线前,再改代码为加载 db-prod.properties

但这样不仅麻烦,而且可能忘了修改,把开发环境的项目发布到了线上。

最理想的效果应该是:无论项目要切换到哪个环境,整个项目都完全不用修改。

因此,我们可以将 指定环境 这件事放到最后,在通过命令去打包或者启动项目时,将环境参数写进去。

举个例子,我们在启动 java 项目时,给 env 系统变量传递不同参数:

# 测试环境
java -jar -Denv=test dist.jar
# 生产环境
java -jar -Dend=prod dist.jar

然后在程序中读取该参数,加载对应的配置即可:

// 读取 env 参数
String env = System.getProperty("env");
new DBConfig("db-" + env + ".properties");

同理,对于前端项目,可以在打包构建时传入环境变量,然后自己在代码中读取,或者交给 Webpack 之类的打包工具处理:

{  "scripts": {    "serve": "env=dev serve",    "build:test": "env=test build"    "build": "env=prod build"  } }

OK,以上就是多环境的分享。其实在企业中,多环境比这复杂的多!除了代码中要区分环境,流水线、镜像、容器也通通要区分。不过原理都是一样的~

最近整理了我原创的 140 篇编程经验和技术文章,欢迎大家阅读,一起成长!

指路:https://t.1yb.co/ARnD

我是鱼皮,学到的朋友求个 点赞 ,这将是我持续创作的动力 ❤️

来回的修改配置会很麻烦,而 SpringBoot 给开发者提供了多环境的快捷配置,需要切换环境时只需要改一个配置即可。不同类型的配置文件多环境开发的配置都不相同,接下来对不同类型的配置文件进行说明 yaml文件 在 application.yml 中使用 --- 来分割不同的配置,内容如下 上面配置中 spring.profiles 是用来给不同的配置起名字的。而如何告知 SpringBoot 使用哪段配置呢?可以使用如下配置来启用都一段配置 综上所述,application.yml...
在实际项目开发过程中,我们往往需要区分开发,测试,预发布,生产等环境,而这几个环境的配置也会有些不同。今天我给大家介绍下用spring实现这种需求,常见几种方法: 一.使用yml文件进行区分 这种方法又可以细分为两种方法: 1.使用application.yml 配置共同的参数,并确定当前运行环境(也可以在启动部署包时指定,例如:java -jar test.jar --spring.profil...
我最后用的npx管理,下面的方法后面弄着弄着yarn始终下载不了 yarn报“文件名、目录名或卷标语法不正确”错误的解决方案 这里主要是因为我的yarn目录和安装的模块不在相同的硬盘分区里导致的。首先查看 yarn 命令的目录以及 yarn 的全局安装位置: yarn global bin yarn global dir 如果发现两个位置不一致,那么就修改 yarn 的全局安装位置和缓存位置。 yarn config set global-folder "D:\[选择路径]\yarn\glo
Profile为在不同环境下使用不同的配置提供了支持(开发环境下的配置和生产环境下的配置肯定是不同的,例如,数据库的配置)。 bean: public class ProfileBean { private String content; public void setContent(String content) { this.content = content; Springboot在不同的阶段运行,所使用的环境可能不一样 比如在开发阶段、测试阶段、生产阶段,应用阶段 可能这些阶段Springboot项目运行的环境都不同,所以可以提前设置多种环境,根据场景的不同进行选择使用 多环境设置使用 在yml配置文件中提前写好多种配置,然后选择调用哪个 这个方法也适用于后缀名为prperties的配置文件 每种环境设置一个配置文件,然后再写一个主配置文件,在主配置文
在python开发或者部署项目的时候,经常需要多个python版本共存,而这时,你将面临不同python版本的依赖冲突,与系统自带的python版本冲突导致系统工具不可用,以及各个项目需要的Python版本冲突等情况。 这里将为你介绍众多的工具,为你解决上述问题,实现python多环境隔离。
profile是Spring对不同环境提供不同配置功能的支持,可以通过激活不同的环境版本,实现快速切换环境; 我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml , 用来指定多个环境版本; application-test.properties 代表测试环境配置 application-dev.properties 代表开发环境配置 但是Springboot并不会直接启动这些配置文件,它默认使用application.pr
博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W+粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台的优质作者。通过长期分享和实战指导,我致力于帮助更多学生完成毕业项目和技术提升。 技术范围: 我熟悉的技术领域涵盖SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等方
多传感器融合环境配置是指将多个传感器的数据进行融合,以提高环境感知的准确性和可靠性。在实际应用中,多传感器融合环境配置可以应用于智能家居、智能交通、智能制造等领域。 为了实现多传感器融合环境配置,需要考虑以下几个方面: 1. 传感器选择:需要根据具体应用场景选择合适的传感器,例如温度传感器、湿度传感器、光照传感器、声音传感器等。 2. 数据采集:需要对传感器采集到的数据进行处理和分析,以提取有用的信息。 3. 数据融合:需要将不同传感器采集到的数据进行融合,以提高环境感知的准确性和可靠性。 4. 系统设计:需要设计一个合理的系统架构,以实现数据采集、处理和融合等功能。