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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
云数据库 Tair(兼容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)

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

目录
相关文章
|
小程序 前端开发 API
一文就知道uniapp等跨端开发的使用场景,学习成本,如何快速使用,基本语法等
uniapp是一个跨平台开发各种各样应用的一套框架。只需要写一套代码,可以适配多达14种产品类型,比如H5移动端、微信小程序及各种其他小程序,ios、安卓等接近原生APP的应用(可以上架到App Store或应用商店)。所以这里的多端,指的并不是PC、平板、手机端,而是移动端优先,开发者可以一次编码,分别编译为小程序和 Android 以及 iOS 应用,实现多端开发
926 0
|
5月前
|
搜索推荐 小程序 开发工具
Gitee推荐项目!埋点+用户分析系统,适合中小团队的开源方案
一款好用的用户行为分析工具,对产品经理、运营人员和开发者来说,都越来越重要。 目前市面上主流的工具,不是价格高昂、数据不透明,就是部署复杂,很难维护。 ClkLog,适合中小团队的开源方案,已经在Gitee上开源,社区也在持续更新中。
|
10月前
|
存储 缓存 自然语言处理
SCOPE:面向大语言模型长序列生成的双阶段KV缓存优化框架
KV缓存是大语言模型(LLM)处理长文本的关键性能瓶颈,现有研究多聚焦于预填充阶段优化,忽视了解码阶段的重要性。本文提出SCOPE框架,通过分离预填充与解码阶段的KV缓存策略,实现高效管理。SCOPE保留预填充阶段的关键信息,并在解码阶段引入滑动窗口等策略,确保重要特征的有效选取。实验表明,SCOPE仅用35%原始内存即可达到接近完整缓存的性能水平,显著提升了长文本生成任务的效率和准确性。
513 3
SCOPE:面向大语言模型长序列生成的双阶段KV缓存优化框架
|
11月前
|
存储 NoSQL Redis
Redis的数据过期策略有哪些 ?
Redis 采用两种过期键删除策略:惰性删除和定期删除。惰性删除在读取键时检查是否过期并删除,对 CPU 友好但可能积压大量过期键。定期删除则定时抽样检查并删除过期键,对内存更友好。默认每秒扫描 10 次,每次检查 20 个键,若超过 25% 过期则继续检查,单次最大执行时间 25ms。两者结合使用以平衡性能和资源占用。
170 11
|
存储 Kubernetes 安全
第四章 Helm仓库介绍配置国内仓库地址
第四章 Helm仓库介绍配置国内仓库地址
5730 2
|
运维 Kubernetes JavaScript
云效产品使用报错问题之流水线发布uniapp的应用失败如何解决
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
存储 定位技术 对象存储
阿里云对象存储OSS外网流出流量异常增多导致费用上升的解决方法
阿里云对象存储OSS外网流出流量异常增多导致费用上升的解决方法
990 2
阿里云对象存储OSS外网流出流量异常增多导致费用上升的解决方法
|
XML JavaScript 前端开发
只使用JS怎么给静态网页添加站内全局搜索功能?
只使用JS怎么给静态网页添加站内全局搜索功能?
243 0
只使用JS怎么给静态网页添加站内全局搜索功能?
|
虚拟化 Docker 容器
Minikube - Kubernetes本地实验环境
为了方便大家本地开发和体验Kubernetes,社区提供了可以在本机部署的Minikube。本文介绍利用阿里云的镜像地址在Windows/Mac/Linux上来部署和配置Minikube
239994 71
Minikube - Kubernetes本地实验环境
|
消息中间件 Java Spring
一文看懂Spring Boot整合Rabbit MQ实现多种模式的生产和消费
一文看懂Spring Boot整合Rabbit MQ实现多种模式的生产和消费
1211 0