“NodeJS在大搜車” 之 應用部署篇

jopen 9年前發布 | 21K 次閱讀 NodeJS
 

上次寫了篇文章,有同學評價說講的東西太基礎了,好吧,貌似是有些基礎的,不過在編程領域,“基礎”這個詞表達意思太模糊,在我看來,有時候技 術是越基礎越好,當一個技術能夠完美解決問題,又能基礎的每個人都能快速上手,都能理解活用的時候,它就“基礎”的完美了,例如jQuery什么的。可能 是不同的思考角度吧,有些同學覺得研究別人搞不懂的技術才算牛逼,而有的人則覺得不斷解決別人解決不了的問題才算厲害,有些同學每天研究如何解放生產力, 有些同學研究如何改進流程,有些同學研究如何讓大家的開發工作變得”簡單基礎“,各司其職,不能夠互相輕薄哈~~

不過,有時候我想想,這系列文章好像主要是給前端轉NodeJS的同學看的,的確有些基礎,大家湊合看哈。

今天這篇文章主要講講咱們大搜車如何部署NodeJS,可能還是有些基礎,不過希望對不太清楚的同學有所幫助。

第一章:工具

簡單的說,線上用PM2,測試用Forever,本地用nodemon。簡單分別介紹下為什么。

關于PM2和forever,一個重而大,一個小而輕,為什么線上用pm2測試用forever?

  1. PM2更穩定一些,forever偶爾經常會莫名其妙進程就沒了,出現幾率不大,但是有幾率,具體原因不明。
  2. PM2會占用端口,即使你delete,stop了一個進程,它的端口還是占著,除非你把所有的list都kill,如果你的服務器上跑 了好幾個服務,那就很悲劇了。線上環境還好,不會經常重啟,也不會調整端口。但是測試環境就不一樣了,一臺機器上跑10來個node服務,端口經常還要變 一變(不同分支)。用pm2簡直就是個大悲劇,這時候forever反而派上了用場,一個服務對應一個進程,更靈活易控制。

nodemon 這個東西,可能很多人也都知道,用來本地開發自動重啟的,這里只是提一下,以后不需問”如何不重啟進程讓node代碼生效“之類的問題額,重啟還是要重啟的,用個工具就方便多了。(一個原則,不要在node進程里保存狀態,進程是可以隨時被重啟的)。

forever和pm2的基本用法就不詳述了,文檔里都有,pm2有很多強大功能,大家可以多研究下,雖然不一定用得到。

第二章:環境

我們木有搭建私有的NPM庫,目前暫時所有模塊都是在項目中的,還沒有正規的服務化出來,這些都是需要人力成本的,到了一定階段肯定要做。

關于開發環境,我們目前有測試環境,預發環境,線上環境三個部分。

測試環境只有一臺機器,但是上面跑了不少git分支,分別對應不同的業務,也對應不同的端口。大部分分支是”開發分支“,也就是不保證穩定,用 來做開發聯調的時候用的,但是在測試機器上會有一個穩定的端口(通常是8001),這個端口跑主干分支的代碼,一直穩定存在,用來對接其他后臺系統或者客 戶端的穩定分支環境。測試服務器進程用forever管理,工程師在開發的時候需要自己去服務器拉取代碼,配置環境,暫時沒有自動化部署的機制。不過公司 正在研究docker,用于java,ruby之類的部署,后面可以考慮引入node的測試部署,應該會方便很多。

預發環境,是一個真實的環境,只是沒有訪問入口而已,在每次發布前,把代碼從分支合到主干(聯調前,從主干往分支合一次),然后從主干發布到預 發環境,用一個指向預發環境的客戶端對各個功能進行回歸,回歸完畢后再發布到線上環境。這個環境連接的是線上的數據庫,線上的緩存,線上的依賴服務。

正式環境,4臺機器+一臺定時任務的機器。服務器是阿里云的ECS,負載均衡用的是阿里云的SLB,mysql用阿里云的RDS,緩存用阿里云 的OCS,運維基本上是都不需要擔心了,現在的云服務已經非常完善了,其實我們用阿里云的服務非常多,大概有20多個類型的服務,感謝阿里云。

現在想起來,作為一個一邊管理著前端,一邊做著后端的工程師,大部分架構思維都是以前從一些接觸到的后臺開發項目里看到的一瞥,其實很多想法還是不夠成熟的,需要不斷磨練和提升。

第三章:部署方式。

這里主要是闡述我們線上服務的部署方式。

其實PM2也提供了一種自動部署的方式,有興趣的可以去研究下,支持多機自動部署,寫個配置文件,然后執行一個命令即可,這里就不展開啦。詳見文檔: https://github.com/Unitech/PM2/blob/master/ADVANCED_README.md#deployment

我們的部署腳本是自己(bash)寫的,這里簡單說下部署流程:

git pull -> npm install -> 整體打包成tar包 -> scp上傳到目標服務器 -> 解壓 -> 生成一份備份 -> 覆蓋線上文件 -> pm2 restart

大體就是這樣,然后部署這個動作是在預發服務器上執行的。通過阿里云內網ip,自動挨個服務器部署,每臺服務器中間有10秒鐘間隔,由于負載均衡的存在,這樣可以保證部署的時候,線上服務不會訪問不到,每次只有一臺機器在被部署。

目前我們還沒有類似于灰度發布這樣的體系,這個操作其實對于大規模應用也是常見的,這里就不講啦。

小結

我們的應用部署方式還在不斷進化中,畢竟我們在業界算起來其實玩的并不是非常好的那一批,還有很大的提升空間。而且隨著公司業務飛速發展,目前 很多方面都會出現很多挑戰,例如多環境自動部署,IO瓶頸的優化,業務邏輯實現方式的優化等,很多事情在前面等著我們。以后我們有任何進展會及時跟大家分 享噠,希望NodeJS界的風氣越來越沉穩下來,落到實際業務中去,并且大家多交流分享,整個世界都會變得美美噠。

下面還會有其他一系列文章,事先預告下:

  1. 存儲,緩存,云服務 方面的一些最佳實踐和經驗。

  2. NodeJS服務性能監測,調優,調試,監控報警,應急處理方面的話題。

  3. NodeJS MVC 基本要素( http://www.html-js.com/article/Front-team-search-car-front-team-NodeJS-in-search-car-MVC-basic-structure%202985)

歡迎大家持續關注我們的專欄。

另外,我們的NodeJS服務端開發團隊也在招聘小伙伴一起加入工作學習研究。關于我們公司,這里就不多介紹啦,C輪剛過的二手車解決方案互聯 網企業,坐標杭州,300人團隊,大概100名開發產品設計,我的團隊現在大概16人,分為前端和NodeJS兩部分,都缺人,各種求才。簡歷直接發我郵 箱即可:sunxinyu@souche.com

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!