当前位置: 首页 > 后端技术 > Node.js

网易智能企业Node.js实践(三)-灰度环境与应用监控

时间:2023-04-03 18:28:40 Node.js

灰度环境首先说一下为什么需要灰度环境。随着业务复杂度和技术复杂度的增加,一些问题在测试环境中可能无法完全复现,一些配置可能因为复杂度的增加不同步等,都会导致测试环境出现没有什么有问题的需求,但是线上出现了一些问题。为了尽快发现这些问题,减少这些问题的影响,最终的质量控制需要一个和线上环境几乎一样的环境。为什么不是预启动环境?其实我之前的很多项目都是用的预发布环境,行业内用预发布环境的公司也不在少数,那为什么要用比较难实现的灰度环境呢?一定有好处!首先,从开发的角度来看,使用预发布环境要么使用预发布域名,要么绑定预发布机器IP,操作繁琐,对非开发者不友好。第二,灰度环境可供真实用户使用,也可以作为A/BTest。综上所述,预发布环境能做的灰度环境基本都能做,预发布环境不能做的灰度环境也能做。所以我们使用灰度环境。既然要使用灰度环境,首先要确定的是如何区分用户是进入灰度环境还是正式环境。网易互客作为一款toB产品,当然希望同一个公司的所有员工都能获得相同的用户体验和功能。所以我们使用企业ID来控制用户进入灰度或正式环境。.现在我们需要网关能够区分请求中的企业ID,所以我们需要对网关进行升级,所以我们采用了新的技术方案Eureka(Netflix开发的服务发现框架),Eureka我就不介绍了这里说的太多了,主要说说Node端。实现的**EurekaClient**用于完成服务注册和维护。npm中已经有一个eureka-node-client来实现Node端的服务注册功能,但是要结合Egg.js和平滑发布的理念,还需要进一步开发来实现更完善的工具,所以我们有实现了`pp-eureka`的Egg.js插件。考虑到Egg.js的多进程模型,为了防止一台机器注册多次,我们通过扩展agent来实现这个插件的功能。主要代码如下:```javascriptconstEureka=require('eureka-node-client');module.exports=agent=>{consteureka_client=newEureka(agent.config.eureka);eureka_client.start(function(error){agent.logger.info(error||'成功启动!');});}```如果只是这样,也能满足灰度要求,但是输了上面提到的顺利发布,所以它增加了一个中间件来监控发布系统的在线和离线请求,然后通过`app.messenger.sendToAgent(OFFLINE,'');`通知代理。agent代码升级后如下:eureka_client.start(function(error){agent.logger.info(error||'启动成功!');});agent.messenger.on(OFFLINE,data=>{eureka_client.stop();});}```Agent在收到下线通知后会让Eureka停止注册服务的心跳,让Eureka注册中心的Node机器会被踢掉,流量不会被转发,以免导致发布过程中请求失败。插件开发好后如何使用?首先是在config目录下添加config.gray.js灰度环境配置文件,在里面添加pp-eureka的配置,如下:```jsoneureka:{eureka:{serviceUrls:{default:['url']}},实例:{app:'huke',端口:{'$':7001,'@enabled':true},元数据:{ysf_app:'huke',ysf_env:'gray'}}}```同时在线环境也添加了相应的配置,只是`eureka.instance.metadata.ysf_env='prod'`,通过这个配置来区分是灰度环境还是在线环境。这样灰度环境项目相关部分就完成了,剩下的就是默认带上当前企业ID的所有请求。至此,应用发布相关的问题已经基本解决,剩下的就是随时了解自己应用的运行状态了。应用监控应用启动后,为了了解应用的运行情况,服务是否稳定,是否存在潜在问题,我们需要进行应用监控。有了应用监控之后,可以帮助我们解决以下问题:1.可以让业务流程调用链可追溯,可以知道一个请求哪里出了问题,便于解决2.可以看懂系统的指标应用,如:Load、CPU、内存、磁盘、网络、TCP等。3.应用状态异常可以及时通知开发者,将影响降到最低关于网易内部的工具我就不多介绍了,但是主要介绍可以使用的第三方平台或工具。先说说Sentry,它是一个实时的事件记录和聚合平台。我们之前用它来做前端代码的错误监控和关键数据的统计。因为它也可以支持Node端,所以我们顺便插入,实现了`pp-sentry`Egg.js插件。使用时只需要在config中配置sentry项目的dsn即可捕获Node中的代码错误。还有阿里开源的Pandora.js,是一个Node.js应用监控管理器。集成了监控、链路跟踪、调试、进程管理等多种能力。另一个是阿里云的Node.js性能平台。如果使用Egg.js框架,访问起来非常方便。使用官方egg-alinode,参考【Egg集成deployment_部署运行时和agenthub_用户指南_Node.js性能平台-阿里云】(https://help.aliyun.com/document_detail/60907.html?spm=a2c4g.11186623.6.555.41d676bfwLNpaH)这个文件就够了,功能全面,关键是免费的。如果你对日志有更高的要求,可以使用阿里云的日志服务。善用以上工具可以为解决应用中的问题提供很大的帮助。另外,在代码需要的地方记录日志是非常有必要的。Egg.js提供了非常完善的日志功能。很好地使用它对于理解应用程序非常重要。运行状态和故障排除非常有帮助。总结至此,我想分享的关于智能企业的Node.js接入实践已经结束,但是要想开发好Node应用,还有很多需要考虑的地方。首先要区分开发思路和前端代码编写。服务端开发要有思考能力,要多考虑性能、稳定性、健壮性。另外,养成良好的记录习惯也很重要。单元测试也很重要。编写单元测试是服务器端开发的基本要求。节点端开发对运维能力也有一定的要求。不像前端代码,放到CDN上之后基本不用关注。但是对于Node开发,要时刻关注代码上线后应用的状态,会不会出错。等等,要有快速定位和解决问题的能力,把可能出现的问题造成的损失降到最低。整体来说,Node的接入极大的提升了开发效率,通过Node前端可以做更多的事情,让前端发挥更大的价值。