灰度环境

首先说下为什么需要灰度环境。随着业务的复杂度以及技术复杂度的上升,导致在测试环境可能有些问题无法全面复现,以及复杂度上升可能带来的某些配置的不同步等等原因,会导致测试环境看起来是没有问题的需求,到了线上反而出现了的问题,为了尽早发现这些问题,以及降低这些问题带来的影响,就需要一个和线上环境几乎一样的环境来做最后的质量把控。

为什么不是预发环境?其实我之前的项目中很多都是使用预发环境的,而且业界使用预发环境的企业也不在少数,那我们为什么使用实现难度更大的灰度环境呢?肯定是有好处的啊!第一,从开发的角度,使用预发环境要么使用预发域名,要么使用预发机器 IP 绑定,操作起来比较麻烦,对非开发同学不友好。第二,灰度环境可以让真正的用户进行使用,也可以作为A/B Test 使用。总结下就是预发环境能做的灰度环境基本都能做,预发环境不能做的灰度环境也能做。所以我们使用灰度环境。

既然要用灰度环境,首先要确定的是通过什么方式来区分用户进入灰度或正式环境。网易互客作为一个 toB 的产品,当然希望是同一个公司的所有员工能够得到同样的使用体验和功能。所以我们通过企业 ID 来控制用户进入灰度或正式环境。

【示意图】

确定方案之后就是技术实现了,我们之前的网关只能通过请求的 path 来区分请求,来控制流量转发到 Java 或 Node 应用。现在我们需要网关能够区分请求中的企业 ID,所以需要对网关进行升级,于是我们使用新的技术方案 Eureka(Netflix开发的服务发现框架),这里不对 Eureka 做过多介绍,主要说下 Node 端要实现的 **Eureka Client**,用来完成服务注册及维持。

npm 中已经有了 eureka-node-client 来实现 Node 端的服务注册功能,但是要结合 Egg.js,以及平滑发布的理念,还是需要进一步的开发,以实现一个更完善的工具,所以我们实现了 `pp-eureka` 这个 Egg.js 插件。

考虑到 Egg.js 的多进程模型,为了防止一台机器多次注册,我们通过扩展 agent 来实现这个插件的功能。主要代码如下:

```javascript

const Eureka = require('eureka-node-client');

module.exports = agent => {

const eureka_client = new Eureka(agent.config.eureka);

eureka_client.start(function (error) {

agent.logger.info(error || '启动成功!');

});

}

```

如果仅仅是这样倒也能实现灰度的需求,但是损失了上文提到的平滑发布,所以又增加了一个 middleware 来监听发布系统的上下线请求,然后通过 `app.messenger.sendToAgent(OFFLINE, '');` 来通知 agent ,agent 代码升级后如下:

```javascript

const Eureka = require('eureka-node-client');

module.exports = agent => {

const eureka_client = new Eureka(agent.config.eureka);

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 的配置,如下:

```json

eureka: {

eureka: {

serviceUrls: {

default: [

'url'

]

}

},

instance: {

app: 'huke',

port: { '$': 7001, '@enabled': true },

metadata: {

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 project 的 dsn 即可捕获 Node 中代码错误。

还有阿里开源的Pandora.js,是一个 Node.js 应用监控管理器。它集成了多种类型的能力诸如:监控、链路追踪、调试、进程管理等等。

另外就是阿里云的 Node.js 性能平台,如果使用 Egg.js 框架的话,接入非常方便,使用官方提供的 egg-alinode,参考 [Egg 集成部署_部署 runtime 与 agenthub_用户指南_Node.js 性能平台-阿里云](https://help.aliyun.com/document_detail/60907.html?spm=a2c4g.11186623.6.555.41d676bfwLNpaH) 这个文档即可,功能全面,关键是免费。如果还有对日志更高的要求,可以使用阿里云的日志服务。

利用好上面的工具能对解决应用中出现的问题提供很大的帮助,另外在代码需要的地方打上日志也是非常必要的,Egg.js 提供了非常完善的日志功能,使用好它对了解应用的运行状态以及排查问题都有很好的帮助。

总结

至此我要分享的关于智慧企业 Node.js 接入实践已经结束,但是要开发好 Node 应用要考虑的还有很多。首先在开发思路上要和写前端代码有个区分,要具备服务端开发的思考能力,对性能、稳定、健壮等的考虑要更多。另外要养成良好的打日志习惯,这个非常重要。还有单元测试也是非常重要的,写单元测试是服务端开发的基本要求。Node 端开发对运维能力也有一定的要求,不像前端代码,发上 CDN 之后基本就不需要关注了,但是做 Node 开发,代码上线之后也要时刻关注应用的状态,以及会不会有报错等,要具备快速定位、解决问题的能力,将可能出现的问题导致的损失降到最小。Node的接入整体上对开发效率的提升还是很显著的,而且通过 Node 前端可以做的更多,让前端发挥更大

网易智慧企业 Node.js 实践(3)| 灰度环境和应用监控相关推荐

  1. 网易智慧企业Node.js实践(1) | Node应用架构设计和React同构

    导读: 近期网易智慧企业在 Node.js(以下简称 Node) 的接入上已输出阶段性成果,特推出此系列文章,希望能与大家分享部分接入过程的方案,从而提供帮助.系列主要包括以下内容. 1. Node ...

  2. 网易智慧企业 Node.js 实践(2)| 平滑发布和前端代码

    健康检查 前文提到我们通过网关把流量转发到 Node 应用,那网关是如何确定 Node 应用的可用性呢? 如果 Node 应用在发布的过程中也把流量转发过来,就会导致请求失败,所以我们的网关会对 No ...

  3. 网易智慧企业亮相TOP 100 Summit,以创新和匠心探索行业前沿

    11月14-17日,网易智慧企业部旗下业务品牌网易云信.网易七鱼受邀参加由麦思博主办的第八届TOP 100全球软件案例研究峰会(TOP 100 Summit).本次峰会围绕 "数字化转型与指 ...

  4. Node.js 框架设计及企业 Node.js 基础建设相关讨论

    大家好,我是若川.19年我写的 lodash源码 文章投稿到海镜大神知乎专栏竟然通过了,后来20年海镜大神还star了我的博客,同时还转发了我的微博.时间真快啊.今天分享这篇Node.js的讨论. 2 ...

  5. 「跨域」利用node.js实践前端各种跨域方式(上)

    前言 常言道,"读万卷书,不如行万里路".技术的学习也是如此,唯有实践才能更清楚的明白原理和加深印象,因此本文会利用node.js对前端的各种跨域方式进行实践,强烈建议一步一步跟着 ...

  6. 网易智慧企业2020年度见面会4大亮点抢先看!

    2020开年遭遇了新冠疫情"黑天鹅",在这个过程中,有的企业实现逆势增长,也有的企业业绩遭遇了断崖式下跌甚至被迫停业. "企业如何危中抢机?" "如何 ...

  7. 经信局推荐 | 网易智慧企业多产品入选《杭州市支持企业远程办公助力复工防疫产品和服务目录》!...

    为落实杭州市疫情防控指挥部<关于数字赋能线上审批服务远程办公的通告>精神,全力支持广大企业和群众实现网上办事.远程办公,助力复工复产和疫情防控,杭州市经信局征集和筛选了一批"支持 ...

  8. 3年营收翻8倍,网易智慧企业业务多品牌战略升级

    5月8日,网易旗下知名TO B产品网易云信和网易七鱼联合宣布一项战略升级,整合内部优质资源,成立网易智慧企业部,并推出面向企业客户的新产品网易云企课.当日在北京举行的战略发布会上,网易智慧企业部总经理 ...

  9. Pomelo:网易开源基于 Node.js 的游戏服务端框架

    Pomelo 是基于 Node.js 的高性能.分布式游戏服务器框架.它包括基础的开发框架和相关的扩展组件(库和工具包),可以帮助你省去游戏开发枯燥中的重复劳动和底层逻辑的开发.Pomelo 不但适用 ...

最新文章

  1. 强行分类提取特征自编码网络例4
  2. js 字符串转成货币格式, js转货币
  3. vscode使用汇总——常用插件、常用配置、常用快捷键
  4. mysql bypass_Bypass MySQL Safedog
  5. 多分类神经网络与原子核
  6. 聊聊单体应用的 4 点不良影响,第 4 点很痛很真实
  7. boost标准库开发环境搭建boost标准库环境搭建以及简单案例介绍
  8. 文献学习(part33)--Clustering by fast search and find of density peaks
  9. 《SAS编程与数据挖掘商业案例》学习笔记之六
  10. java并发调用_Java并发教程–可调用,将来
  11. 【Github开源】一站搞定各种开发文档
  12. mysql租车管理系统_基于java实现租车管理系统
  13. 对于一个指针可以多次使用delete_【C++札记】new和delete
  14. 【转】去掉换行符的几个方法
  15. linux scp 输入密码,Linux scp远程复制数据不需要输入密码
  16. 如何在关闭ssh连接的情况下,让进程继续运行?
  17. 敲重点,数据需要这么做才能成为资产
  18. GIS_GDAL java版下载/环境配置/dll配置/API使用文档
  19. odbc中不显示oracle,oracle:odbc无法提供初始化
  20. 成功解决:[‘‘, ‘‘, __ob__: Observer]

热门文章

  1. Hihocoder-1135-Magic Box
  2. 关于“minSdkdeviceSdk”解决办法
  3. 【转】awk 里的substr函数用法举例
  4. jQuery源码学习第二天--jQuery的extend扩展
  5. ThinkPHP框架使用心得二 CURD操作
  6. C# 多线程,解决处理大数据时窗体(不能拖动等)假死现象
  7. [转]JS中判断鼠标按键判断
  8. infor wms 项目启动_全一,企业物流定制专家——企业客户项目管理流程解析
  9. [Flask+Vue]Books全栈应用
  10. 前端(三)——HTML之表单