开发经验:如何正确设置开发环境与生产环境的配置参数

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 开发经验:如何正确设置开发环境与生产环境的配置参数

摄影:产品经理下厨:kingname

我们写代码时,一般会先在自己电脑上进行开发,然后把代码部署到服务器上。如果一段代码涉及到读写数据库,或者访问某些其他的线上服务接口,那么在开发时,为了不影响线上环境,我们一般会把测试环境的数据库和线上环境的数据库分开。

例如,我们的程序需要访问 MongoDB 和 Redis,于是,在代码里面,我们可能会这样写:

import pymongo
import redis
handler = pymongo.MongoClient('mongodb://username:password@127.0.0.1:27017').db.col
client = redis.Redis(host='127.0.0.1', port=6379, password='xxxx')

等你要把程序部署到线上环境的时候,你手动把代码里面的MongoDB 连接参数、Redis连接参数修改成线上环境的参数。然后把代码提交到 Git上,并在服务器拉下最新代码并部署。

然而当你想修改一个新功能,要重新测试时,你在自己电脑上又要把这些连接参数修改成测试环境的参数。如果你忘记修改直接就运行,可能会把脏数据写入到线上环境中。

于是,可能有人会使用环境变量来控制读取的参数,例如:

import os
import redis
import pymongo
if os.getenv('env', 'prod'):  # 线上环境 
    MONGODB_URI = 'mongodb://username:password@xx.xx.xx.xx:27017'
    REDIS_PARAMS = {'host': 'xx.xx.xx.xx', 'port': 6379, 'password': 'xxxx'}
else:  # 测试环境
    MONGODB_URI = 'mongodb://username:password@127.0.0.1:27017'
    REDIS_PARAMS = {'host': '127.0.0.1', 'port': 6379, 'password': 'xxxx'}
handler = pymongo.MongoClient(MONGODB_URI).db.col
client = redis.Redis(**REDIS_PARAMS)

这样一来,你不需要手动修改数据库的连接参数,只要把线上环境的环境变量env设置为prod,那么程序部署到线上环境,它自动就会使用线上数据库的参数。只要 其他地方,例如你电脑上,环境变量env不为prod或者干脆不存在这个环境变量,那么自动就会使用开发环境的参数。

这样做,确实避免了忘记修改参数导致的问题,但还有另一个问题:如果其他人也有这个 Git 源的访问权限,那么他们就会知道怎么连接线上环境的数据库。甚至擅自操作线上环境的数据,造成安全隐患或者隐私泄露。

所以,更安全的做法,是专门使用一个文件来存放这些配置参数,程序去这个固定的位置读取参数。线上环境这个文件放线上参数,开发环境,这个文件写开发参数。这个配置文件不上传到 Git中。

例如,我们创建一个 config.json 文件,它的内容为:

{
    "MONGODB_URI": "mongodb://username:password@127.0.0.1:27017",
    "REDIS_PARAMS": {"host": "127.0.0.1", "port": 6379, "password": "xxxx"}
}

然后我们的代码这样修改:

import os
import json
import redis
import pymongo
CONFIG_PATH = '/etc/config/config.json'
if not os.path.exists(CONFIG_PATH):
    print('配置文件不存在,自动使用测试环境参数!')
    MONGODB_URI = 'mongodb://username:password@127.0.0.1:27017'
    REDIS_PARAMS = {'host': '127.0.0.1', 'port': 6379, 'password': 'xxxx'}
else:
    with open(CONFIG_PATH, encoding='utf-8') as f:
        config = json.load(f)
        MONGODB_URI = config['MONGODB_URI']
        REDIS_PARAMS = config["REDIS_PARAMS"]
handler = pymongo.MongoClient(MONGODB_URI).db.col
client = redis.Redis(**REDIS_PARAMS)

这样一来,只有能够访问线上服务器的人,才能知道线上环境的服务器连接参数,保证了数据的安全性。同时,开发人员在开发时,也不用担心不小心忘记改参数导致写入了脏数据。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
2月前
|
网络协议 关系型数据库 应用服务中间件
【项目场景】请求数据时测试环境比生产环境多花了1秒是怎么回事?
这是一位粉丝(谢同学)给V哥的留言,描述了他在优化系统查询时遇到的问题:测试环境优化达标,但生产环境响应时间多出1秒。通过抓包分析,发现MySQL请求和响应之间存在500毫秒的延迟,怀疑是网络传输开销。V哥给出了以下优化建议:
|
7月前
|
Java 测试技术 数据库
java SpringBoot 切换不同的运行环境(生产环境、开发环境、测试环境)SpringBoot配置多个不同运营环境【多文件版本】
java SpringBoot 切换不同的运行环境(生产环境、开发环境、测试环境)SpringBoot配置多个不同运营环境【多文件版本】
103 0
|
存储 安全 Linux
linuxnfs服务安装与配置实践
linuxnfs服务安装与配置实践
224 1
|
前端开发
前端基础 - HTML简介及开发环境
前端基础 - HTML简介及开发环境
151 0
|
Java
[BlocklyNukkit入门]#1配置开发环境
这里用PowerNukkit举例
108 0
|
SQL 消息中间件 算法
智能排班系统 【后端项目结构介绍+开发环境介绍+项目启动】
智能排班系统 【后端项目结构介绍+开发环境介绍+项目启动】
205 0
|
Oracle IDE Java
最详细的Android开发环境配置经验分享(包含配置过程中可能出现的问题及解决办法。繁琐的配置步骤是否是你头疼呢,详细配置步骤你值得拥有!)
最详细的Android开发环境配置经验分享(包含配置过程中可能出现的问题及解决办法。繁琐的配置步骤是否是你头疼呢,详细配置步骤你值得拥有!)
444 0
最详细的Android开发环境配置经验分享(包含配置过程中可能出现的问题及解决办法。繁琐的配置步骤是否是你头疼呢,详细配置步骤你值得拥有!)
|
IDE Unix 编译器
C++基础(1)之设置 C++ 开发环境
C++ 是一种通用编程语言,如今广泛用于竞争性编程。它具有命令式、面向对象和通用编程特性。C++ 可以在许多平台上运行,如 Windows、Linux、Unix、Mac 等。 C++ 是一种通用编程语言,如今广泛用于竞争性编程。它具有命令式、面向对象和通用编程特性。 C++ 可以在 Windows、Linux、Unix、Mac 等许多平台上运行。在我们开始使用 C++ 编程之前。我们需要在本地计算机上设置一个环境,以成功编译和运行我们的 C++ 程序。如果你不想设置本地环境,你也可以使用在线 IDE 来编译你的程序。
219 0
【Django | 开发】分离上线环境与开发环境(多settings配置)
【Django | 开发】分离上线环境与开发环境(多settings配置)
【Django | 开发】分离上线环境与开发环境(多settings配置)
|
JavaScript API
vite配置开发环境和生产环境
vite配置开发环境和生产环境
vite配置开发环境和生产环境