主要探讨Node.js框架所带来的价值和对开发同学的影响.
每个团队都会有自己的业务框架,不论是阿里的egg或alinode,还是腾讯Tars-node或TSW.每种框架都有各自的适用场景,选择适合自己业务并且能够掌控它就是最好的.
好的架构离不开文档和代码注释的专业程度,好的架构或者开发范式,可以让不同层次的开发者写出类似水平的服务,这就是体系所体现的价值.
大部分“Node框架“的核心价值是实现开发范式的统一.目前主要是Express和koa引领了2个阶段的潮流,不同团队之间的差异化导致大家都会有自己的开发范式和架构.这样,在项目交接以及协同开发的时候,矛盾就出现了.就像eslint一样,不是说遵守了就一定能保证代码没有BUG,而是大家遵守了一个范式,代码会相对比较同质化,一个团队的成员更好的维护,有助于协同开发.
-
维护一套文件引用的规则包括路由,加载顺序,确保优先级,加入一些定制化的组件;
-
用了cluster模块,需要维护进程间消息通信和常规操作,比如:心跳、重启等;
-
针对不同的开发环境,开发的配置定制化,因此需要维护多套config;
-
调试相关:与不同的服务联调,包括[开发、测试、正式环境]
-
工程化...
-
工具平台...
每个团队需遵守一套相同的规则,比如一个node.js工程目录及作用:
- public: 静态文件;
- assets: 资源文件;
- lib: 公共代码库;
- config: 配置文件;
- app: 业务代码.
从框架角度,以koa洋葱模型来分析,写的业务代码,跟中间件没什么区别,都是放到洋葱里面去执行,只是业务代码在洋葱里面,而框架代码在开始就已经注册进去了.这就是为什么,你可以只写很少的代码,就能做很多事情.很多共性的,基础性的工作,框架都帮你封装好了.
我们平时写一个路由,肯定是需要先require一个文件获得这文件export出来的变量,通过这个变量去调用其中的内容.但是这样的一个过程,虽然只是加载一个文件这么简单的事情,不同的开发者实现的范式就大不相同,因此,把它统一之后,大家的使用范式就一样了,节约了大家协同开发的成本.并且,好的中间件可以沉淀到框架里面,大家就可以共同使用,减少重复写代码的成本.
至于具体的实现在,把文件按照一定规则和优先级先后加载进来,并挂载到app对应的变量上面,如app.lib,app.controller,app.config等.
监控容灾是一个非常大的空间和范围,这里只是描述一个很小子集.
首先看一下心跳检测.业务开启了3个线程.每一秒钟,子进程会通过网络请求去向master上报心跳.这里是通过HTTP请求进行上报,也可以选择进程间通信,都可以进行父子进程的通信.完成子进程是否有效的判断,如果业务进程遇到了类似死锁,没办法跟master进程通信,就会kill然后fork重启.
关于监控上报,其中包括模调上报、业务日志上报.另外,对于外网定位和用户纬度的定位,可以增加一层代理进行染色.输出链路相关的日志.
- 本地开发: 支持业务代码热更新,可以不需要手动执行类似npm run start;
- 测试环境: 远程调试,远程日志
- 调试: 打通本地与测试环境,本地与正式环境的网段隔离,可以搭建一个代理层服务,识别http请求的头部IP和端口进行转发,可以解决多人开发的环境隔离问题,同时也解决产品体验的问题.当然数据源还是一个,比如DB、分布式缓存公用一套.这样可以做到多个人协同开发.
本文介绍Node整个开发、调试阶段所体现的状态,很多时候都是伴随的产品的演进去逐步完善流程和效率的过程,是一个很好的经验沉淀.