网易智慧企业 Node.js 实践(3)| 灰度环境和应用监控
灰度環(huán)境
?
首先說下為什么需要灰度環(huán)境。隨著業(yè)務(wù)的復(fù)雜度以及技術(shù)復(fù)雜度的上升,導(dǎo)致在測試環(huán)境可能有些問題無法全面復(fù)現(xiàn),以及復(fù)雜度上升可能帶來的某些配置的不同步等等原因,會(huì)導(dǎo)致測試環(huán)境看起來是沒有問題的需求,到了線上反而出現(xiàn)了的問題,為了盡早發(fā)現(xiàn)這些問題,以及降低這些問題帶來的影響,就需要一個(gè)和線上環(huán)境幾乎一樣的環(huán)境來做最后的質(zhì)量把控。
?
為什么不是預(yù)發(fā)環(huán)境?其實(shí)我之前的項(xiàng)目中很多都是使用預(yù)發(fā)環(huán)境的,而且業(yè)界使用預(yù)發(fā)環(huán)境的企業(yè)也不在少數(shù),那我們?yōu)槭裁词褂脤?shí)現(xiàn)難度更大的灰度環(huán)境呢?肯定是有好處的啊!第一,從開發(fā)的角度,使用預(yù)發(fā)環(huán)境要么使用預(yù)發(fā)域名,要么使用預(yù)發(fā)機(jī)器 IP 綁定,操作起來比較麻煩,對非開發(fā)同學(xué)不友好。第二,灰度環(huán)境可以讓真正的用戶進(jìn)行使用,也可以作為A/B Test 使用??偨Y(jié)下就是預(yù)發(fā)環(huán)境能做的灰度環(huán)境基本都能做,預(yù)發(fā)環(huán)境不能做的灰度環(huán)境也能做。所以我們使用灰度環(huán)境。
?
既然要用灰度環(huán)境,首先要確定的是通過什么方式來區(qū)分用戶進(jìn)入灰度或正式環(huán)境。網(wǎng)易互客作為一個(gè) toB 的產(chǎn)品,當(dāng)然希望是同一個(gè)公司的所有員工能夠得到同樣的使用體驗(yàn)和功能。所以我們通過企業(yè) ID 來控制用戶進(jìn)入灰度或正式環(huán)境。
?
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 【示意圖】
?
確定方案之后就是技術(shù)實(shí)現(xiàn)了,我們之前的網(wǎng)關(guān)只能通過請求的 path 來區(qū)分請求,來控制流量轉(zhuǎn)發(fā)到 Java 或 Node 應(yīng)用?,F(xiàn)在我們需要網(wǎng)關(guān)能夠區(qū)分請求中的企業(yè) ID,所以需要對網(wǎng)關(guān)進(jìn)行升級,于是我們使用新的技術(shù)方案 Eureka(Netflix開發(fā)的服務(wù)發(fā)現(xiàn)框架),這里不對 Eureka 做過多介紹,主要說下 Node 端要實(shí)現(xiàn)的 **Eureka Client**,用來完成服務(wù)注冊及維持。
?
npm 中已經(jīng)有了 eureka-node-client 來實(shí)現(xiàn) Node 端的服務(wù)注冊功能,但是要結(jié)合 Egg.js,以及平滑發(fā)布的理念,還是需要進(jìn)一步的開發(fā),以實(shí)現(xiàn)一個(gè)更完善的工具,所以我們實(shí)現(xiàn)了 `pp-eureka` 這個(gè) Egg.js 插件。
?
考慮到 Egg.js 的多進(jìn)程模型,為了防止一臺(tái)機(jī)器多次注冊,我們通過擴(kuò)展 agent 來實(shí)現(xiàn)這個(gè)插件的功能。主要代碼如下:
?
```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 || '啟動(dòng)成功!');
? });
}
```
?
如果僅僅是這樣倒也能實(shí)現(xiàn)灰度的需求,但是損失了上文提到的平滑發(fā)布,所以又增加了一個(gè) middleware 來監(jiān)聽發(fā)布系統(tǒng)的上下線請求,然后通過 `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 || '啟動(dòng)成功!');
? });
?
? agent.messenger.on(OFFLINE, data => {
??? eureka_client.stop();
? });
}
```
?
Agent 收到下線通知后會(huì)讓 Eureka 停止注冊服務(wù)的心跳,這樣 Eureka 注冊中心就會(huì)把這臺(tái) Node 機(jī)器踢掉,流量就不會(huì)轉(zhuǎn)發(fā)進(jìn)來,以免在發(fā)布過程中導(dǎo)致請求失敗。插件開發(fā)好之后怎么用呢?首先是在 config 目錄下增加 config.gray.js 灰度環(huán)境配置文件,里面添加 pp-eureka 的配置,如下:
?
```json
eureka: {
??? eureka: {
????? serviceUrls: {
??????? default: [
????????? 'url'
??????? ]
????? }
??? },
??? instance: {
????? app: 'huke',
????? port: { '$': 7001, '@enabled': true },
????? metadata: {
??????? ysf_app: 'huke',
??????? ysf_env: 'gray'
????? }
??? }
}
```
?
同時(shí)線上環(huán)境也增加對應(yīng)的配置,只是 `eureka.instance.metadata.ysf_env = 'prod'` ,通過這個(gè)配置來區(qū)分是灰度環(huán)境還是線上環(huán)境。這樣就完成灰度環(huán)境工程相關(guān)的部分,剩下就是把所有的請求都默認(rèn)帶上當(dāng)前企業(yè)的 ID 就完成了。
?
自此應(yīng)用發(fā)布相關(guān)的問題都已基本解決,剩下的就是要隨時(shí)了解自己的應(yīng)用的運(yùn)行狀態(tài)了。
?
應(yīng)用監(jiān)控
?
應(yīng)用上線之后,為了了解應(yīng)用的運(yùn)行狀態(tài)、服務(wù)是否穩(wěn)定、有沒有潛在問題,我們需要應(yīng)用監(jiān)控,有了應(yīng)用監(jiān)控以后能幫我們解決以下問題:
?
?
關(guān)于網(wǎng)易內(nèi)部的工具我就不多介紹了,主要介紹下可以使用的第三方平臺(tái)或工具。
?
首先說下 Sentry,它是一個(gè)實(shí)時(shí)事件日志記錄和聚合平臺(tái)。我們之前使用它來做前端代碼的錯(cuò)誤監(jiān)控以及關(guān)鍵數(shù)據(jù)的統(tǒng)計(jì)。因?yàn)樗材苤С?Node 端,所以我們就順便接入進(jìn)來了,同時(shí)實(shí)現(xiàn)了 `pp-sentry` Egg.js 插件。使用的時(shí)候只需要在 config 中配置 sentry project 的 dsn 即可捕獲 Node 中代碼錯(cuò)誤。
?
還有阿里開源的Pandora.js,是一個(gè) Node.js 應(yīng)用監(jiān)控管理器。它集成了多種類型的能力諸如:監(jiān)控、鏈路追蹤、調(diào)試、進(jìn)程管理等等。
?
另外就是阿里云的 Node.js 性能平臺(tái),如果使用 Egg.js 框架的話,接入非常方便,使用官方提供的 egg-alinode,參考 [Egg 集成部署_部署 runtime 與 agenthub_用戶指南_Node.js 性能平臺(tái)-阿里云](https://help.aliyun.com/document_detail/60907.html?spm=a2c4g.11186623.6.555.41d676bfwLNpaH) 這個(gè)文檔即可,功能全面,關(guān)鍵是免費(fèi)。如果還有對日志更高的要求,可以使用阿里云的日志服務(wù)。
?
利用好上面的工具能對解決應(yīng)用中出現(xiàn)的問題提供很大的幫助,另外在代碼需要的地方打上日志也是非常必要的,Egg.js 提供了非常完善的日志功能,使用好它對了解應(yīng)用的運(yùn)行狀態(tài)以及排查問題都有很好的幫助。
?
總結(jié)
?
至此我要分享的關(guān)于智慧企業(yè) Node.js 接入實(shí)踐已經(jīng)結(jié)束,但是要開發(fā)好 Node 應(yīng)用要考慮的還有很多。首先在開發(fā)思路上要和寫前端代碼有個(gè)區(qū)分,要具備服務(wù)端開發(fā)的思考能力,對性能、穩(wěn)定、健壯等的考慮要更多。另外要養(yǎng)成良好的打日志習(xí)慣,這個(gè)非常重要。還有單元測試也是非常重要的,寫單元測試是服務(wù)端開發(fā)的基本要求。Node 端開發(fā)對運(yùn)維能力也有一定的要求,不像前端代碼,發(fā)上 CDN 之后基本就不需要關(guān)注了,但是做 Node 開發(fā),代碼上線之后也要時(shí)刻關(guān)注應(yīng)用的狀態(tài),以及會(huì)不會(huì)有報(bào)錯(cuò)等,要具備快速定位、解決問題的能力,將可能出現(xiàn)的問題導(dǎo)致的損失降到最小。Node的接入整體上對開發(fā)效率的提升還是很顯著的,而且通過 Node 前端可以做的更多,讓前端發(fā)揮更大
與50位技術(shù)專家面對面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的网易智慧企业 Node.js 实践(3)| 灰度环境和应用监控的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网易智慧企业 Node.js 实践(2)
- 下一篇: 链路追踪技术的应用及实践