日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2025/3/8 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 网易智慧企业 Node.js 实践(3)| 灰度环境和应用监控 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

灰度環(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)控以后能幫我們解決以下問題:

?

  • 能夠讓業(yè)務(wù)流轉(zhuǎn)調(diào)用鏈可追蹤,能夠知道一個(gè)請求在哪里出了問題,方便解決
  • 能夠了解應(yīng)用的系統(tǒng)指標(biāo),比如:Load、CPU、內(nèi)存、磁盤、網(wǎng)絡(luò)、TCP 等
  • 能夠在應(yīng)用狀態(tài)異常的時(shí)候及時(shí)發(fā)送通知給開發(fā)者,把影響降到最小
  • ?

    關(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。