搞不定Serverless?让你秒懂掌握Profiling让一份程序优雅自适应
NodeJS 后端开发09 多环境Profiling优雅根据不同环境自适应
学委好久没有更新NodeJS专栏,还以为NodeJS冷门,没想到最近看到几个读者留言问怎么优雅的管理多环境的配置。
太忙了,写篇短文简单展示一下原理。正好基于前篇 【NodeJS 后端开发 07 MySQL数据库连接池开发生产应用 】简单尝试了mysql库来连接数据库。
本篇尝试一个更加优雅的方式,通过环境变量来控制程序动态加载不同的配置。
这个搞Java的同学最清楚,比如我们开发springboot应用的时候会放置多个application.yml。
然后部署的时候通过环境变量来选择配置。
这个用NodeJS来做就更加简单了
NODE_ENV=process.env.NODE_ENV
console.log('NODE_ENV:', NODE_ENV)
直接贴在node REPL 终端查看:
process对象为Node上下文的内置对象,可以直接获取,这个对象管理了node进程相关的数据。
比如 process.env就是我们获取环境变量设置的入口了(读者可以自行打印查看更多信息)。
配置一个环境变量,重试代码
export NODE_ENV=雷学委
打开node的终端
这里我们看到,设置的环境变量被进程内部读取到了。
继续根据环境自适应的profiling。
上面展示了设置不同变量代码中能够获取到该环境变量的值。
安照这个机制,我们可以把配置文件按照下面进行命名,让程序加载不同的文件名,比如下面:
- config.dev.json
- config.testing.json
- config.prod.json
然后只需要写一份应用代码:
复制下面代码保存为app.js
//雷学委Demo代码
const NODE_ENV=process.env.NODE_ENV || 'dev'
console.log('NODE_ENV:', NODE_ENV)
//定位当前目录下的config.<环境类型>.json
const configPath = __dirname + '/config.' + NODE_ENV + '.json'
console.log('configPath:', configPath)
//加载并打印数据库的配置细节
const dbConfig = require(configPath)
console.log('dbConfig:', dbConfig)
我们直接来看效果;
运行代码在这:
#开发环境启动应用
node app.js
#测试环境启动应用
export NODE_ENV=testing && node app.js
#生产环境启动应用
export NODE_ENV=prod && node app.js
很轻松吧,一份代码根据不同的环境适配了。
实际运行应用app.js的服务器,上面会配置环境变量NODE_ENV为对应的dev/testing/prod值。
上面代码仅为原理展示。
好了到这里读者应该能够懂得profling如何做了。(可以三连了)
下面看看为什么。
为啥搞这么多外部配置,直接写在代码里面根据主机名字加载不好么?
一般企业会有大量的服务器,然后会把服务器划分为几类,比较典型的划分为:
很多中大公司会有下面这样一个划分:
这样能够把一个应用层层把关提拔到最上层的生产环境(production)。
学委想对小白说的: 比如说一个游戏的新功能,往往会经过开发机器调试,然后大量测试,把大量的潜在的重要的bug解决了,提拔到预发布,最后到生产环境。这个过程通过一些列的自动化测试,回归测试,可以大大保证系统的质量。还有一种高端玩法就是灰度发布,加上这个制度,这就是我们常说产品平滑上线的流程了。
这好像扯远了,产品发布这一套能再写亿篇!
我们回到主题,通常就是只开发一份代码,发布到不同环境之后,程序动态的连接到正确的数据库,加载对应的数据,数据虽不同但是程序在任意环境的行为要绝对一致。
这里配置外部化考量是:配置外部化可以减少代码跟环境的耦合
而不是发布一个类型的环境,就得修改代码。
特别是互联网/金融项目都会有严苛的质量把关,哪怕是修改一个标点符号,整个产品提升的过程都得从开发环境重新来过。
因此,配置外部化很有必要。
那么,应用能否跟外部环境毫无关联?
比较有经验的朋友,可能会想匿名函数,或者亚马逊的lamda,或者serverless app(无服务器应用)
如果业务没有任何环境区分,那就可以做到程序跟环境没有耦合,这就充分的说明了serverless的一个优点!(没有耦合,意味着随便拿一个云服务器部署,即可轻松实现弹性伸缩了,但这并非此文出发点,有机会再说)
对了,学委还有这个可以关注长期阅读 =>雷学委趣味编程故事汇编
或者=> 雷学委NodeJS系列
持续学习持续开发,我是雷学委!
编程很有趣,关键是把技术搞透彻讲明白。
创作不易,请多多支持,点赞收藏支持学委吧!
更多代码可以查看/Star: LearnNodeJS代码下载
搞不定Serverless?让你秒懂掌握Profiling让一份程序优雅自适应相关推荐
- 【程序员】区区英语算什么,还搞不定了?
内容简介 [程序员]区区英语算什么,还搞不定了? 必须学好英语,做社会主义好程序员 经常听到学编程的朋友抱怨英语难学:烦,头痛,不开心,愁死宝宝了,不学又不行不舒服斯基~~ 话说大多数程序员是男同胞吧 ...
- 大神,快来救救我,我搞不定啊
着分享的精神混在IT圈,至今没名没利,之前有童鞋为我什么很多人都不愿意回答我们提的问题,其实不是我们不想回答,而是我们不是神,我们回答的越勤快,你的惰性也就越大,真心为你,却无人理解. 节奏一:大神, ...
- 焦头烂额一个上午还是搞不定,跪地相求大家,朋友帮忙啊。。。
焦头烂额一个上午还是搞不定,跪地相求大家,朋友帮忙啊... Delphi / Windows SDK/API http://www.delphi2007.net/DelphiDB/html/delph ...
- 怎样让AI完成人类搞不定的任务?OpenAI提出迭代扩增法给AI设目标
李林 编译整理 量子位 出品 | 公众号 QbitAI 人类:AI啊,给北京设计一套不堵车的交通系统吧! AI:想不堵车,只好-- 想让AI去完成这种庞大复杂的任务,怎样训练.怎样指导,是个非常严峻的 ...
- java书籍_还搞不定Java多线程和并发编程面试题?你可能需要这一份书单!
点击蓝色"程序员书单"关注我哟 加个"星标",每天带你读好书! 在介绍本书单之前,我想先问一下各位读者,你们之前对于Java并发编程的了解有多少呢.经过了1 ...
- 阿里阿里,搞不定政企
如果我们问一位关注科技产业,或者关注云计算.AI技术的朋友,4月11日的阿里云北京峰会上讲了什么.他应该马上会说,发布了通义千问啊. 这话确实没错.但仔细观察这场会,却会发现一个问题:嘉宾好像不太对. ...
- PDF编辑搞不定?迅读PDF大师,了解一下?
工欲善其事,必先利其器.初入职场,想要快速提升自己的业务能力,专业知识必牢牢掌握,但常规的"职场基本功"也不可懈怠,比如Word.Excel.PPT.PDF等.不同岗位用到这些办公 ...
- 21考研 为啥看了那么多经验贴,还是搞不定考研?
hello~~各位研宝们,大家晚上好呀~ 今天的大家又博学了吗? 为了让自己更加博学,掌握更过的考研知识和技巧,相信很多21考研er已经开始在网上搜罗经验贴了~~ 很聪明哦,看往届学长学姐的经验,的确 ...
- linux怎么打印xhci日志,原来linux里的xhci-hcd搞不定fl1000是这 - 精华区 - 优秀的Free OS(Linux)版 - 北大未名BBS...
发信人: ILBSD (XMaster), 信区: Linux 标 题: 原来linux里的xhci-hcd搞不定fl1000是这原因 发信站: 北大未名站 (2011年05月09日14:10:52 ...
最新文章
- 瑞丽噪声与信噪比的关系_演出扩声系统的噪声与接地
- 数学篇(二) 方差、标准差、协方差
- flink的DAG可视化使用(visualizer的使用)
- 微信小程序把玩(二十一)switch组件
- linux 提取日志字段,记一次Linux下提取MySQL日志关键字段
- 关于idea的git账号与电脑的git账号不一致的问题。已解决!
- (操作系统题目题型总结)第二章:处理器管理
- 【李宏毅机器学习】Logistic Regression 逻辑回归(p11) 学习笔记
- linux的awk命令如何用?
- python调用r语言加载包错误_Python中调用R语言包指南.docx
- DataGridView 设置行不可见时,与货币管理器的位置关联的行不能设置为不可见
- three相机在模型上_一步步带你实现web全景看房——three.js
- 转专业申请麦吉尔大学计算机,我在麦吉尔大学学习数学专业……
- IFI Claims:2018年中国企业在美国申请专利数量7298件
- MapReduce优缺点
- android四大组件
- autoJS for 快手极速版 可运行
- Dockerfile文件解释
- NCBI参考序列RefSeq
- word调整页脚距离 顶端和低端的距离(叫页边距)