導讀:6 月 1 ~ 2 日,GIAC 全球網際網路架構大會將於深圳舉行。GIAC 是一個面向架構師、技術負責人及高階技術從業人員的技術架構大會。今年的 GIAC 已經有騰訊、阿裡巴巴、百度、今日頭條、科大訊飛、新浪微博、小米、美圖、Oracle、鏈家、唯品會、京東、餓了麼、美團點評、羅輯思維、ofo 等公司專家出席。
在大會前夕,高可用架構採訪了本屆 GIAC大前端技術分論壇 出品人桑世龍,就目大家廣泛關註的前端技術方面的問題進行了訪談。
桑世龍,江湖人稱狼叔(網名i5ting)現為阿裡巴巴前端技術專家,前去哪兒網前端架構師,Node.js 技術佈道者,Node全棧公眾號運營者。目前主要關註技術架構和團隊梯隊建設方向。即將出版《更了不起的Node.js:將下一代web框架Koa進行到底》一書。
高可用架構:狼叔好,很榮幸能有機會來採訪您。首先,眾所周知你是Node JS在國內的佈道師,能否談談目前Node發展的現狀?
桑世龍:目前國內Node.js主要是作為前端基礎設施存在的,但Node.js目前已經橫跨三端:移動端(phonegap/cordova),pc/h5,pc客戶端(electron/nw.js)1)前端提效工具,比如腳手架,構建工具等 2)輔助前端提升效能,比如利用bigpipe提高效能,pwa/amp等 3)開發各種前端相關係統,比如流量統計,日誌,配置中心,管理後臺等。
儼然,Node.js是前端提效最好的工具,但很明顯這和Node.js初衷是違背的,Node.js是為解決並簡化伺服器端程式設計而誕生的。目前Java依然是後端主流開發,任何新型語言都很難佔有很大份額,Node.js也一樣,目前中小公司,創業公司用node做後端的比較多,純前端類的相關係統也是Node.js比較多。這塊在未來會有一定比例份額,在微服務的架構下,任何語言都有機會,只是喜好問題。另外隨著TypeScript的流行,能夠讓更多的後端同學習慣Node.js的。
高可用架構:Node是一門服務端的程式語言,能談談他在效能方面的表現,以及Node當下比較好的應用場景?
桑世龍:Node.js的效能整體來說還是相當不錯的,在誕生之初,因非同步弔打各種語言,一戰成名。但隨著時間的變化,各語言也都在成長,比如ruby、php都有極其明顯的效能提升,甚至Java也能引入了非同步程式設計,所以效能大家都沒有特別明顯的優勢。
一般,後端開髮指的是 Web
應用開發中和檢視渲染無關的部分,但現在架構升級,Node
承擔了前後端分離重任之後,有了更多玩法。從帶檢視的傳統 Web應用
和 面向Api介面應用
,到透過 RPC
呼叫封裝對資料庫的操作,到提供前端 Api
代理和閘道器,服務組裝等,統稱為後端開發,不再是以往只有和資料庫打交道的部分才算後端,這樣,就可以讓前端工程師對開發過程可控,更好的進行調優和效能最佳化。
對Node.js來說,一直沒有在後端取得其合理的佔有率。原因很簡單
-
1)利益分配,已有實現大多是Java或者其他語言,基本是沒法撼動的,重寫的成本是巨大的,另外,如果用Node寫了,那麼那些寫Java的人怎麼辦?搶人飯碗,這是要拼命的。
-
2)Node相對年輕,大家對Node的理解不夠,回呼和非同步流程控制略麻煩,很多架構師都不願意花時間去學習。儘管在Web應用部分處理起來非常簡單高效,但在遇到問題時並不容易排查定位,對開發者水平要求略高。
-
3)開發者技能單一,很多是從前端轉過來的,對資料庫,架構方面知識欠缺,對系統設計也知之不多,這是很危險的,有種麻桿打狼兩頭害怕的感覺。
-
4)Node在科普、培訓、佈道等方面做的並不好,國外使用的非常多,國內卻很少人知道,不如某些語言做得好。
當下來說,伺服器資源已經相當便宜,對我們的挑戰是如何處理開發速度和效能的場景取捨。
-
1)開發速度第一,當然是Ruby、Node類的更好
-
2)在初期,原型驗證等,Node是非常好的
-
3)在特定場景,可以考慮Go來進行增強
Node.js 應用場景非常豐富,比如 Node.js 可以開發作業系統,但一般我都不講的,就算說了也沒多大意義,難道大家真的會用嗎?一般,我習慣將 Node.js 應用場景氛圍7個部分。
-
1)初衷,server端,不想成了前端開發的基礎設施
-
2)命令列輔助工具,甚至可以是運維
-
3)移動端:cordova,pc端:nw.js和electron
-
4)元件化,構建,代理
-
5)架構,前後端分離、api proxy
-
6)效能最佳化、反爬蟲與爬蟲
-
7) 全棧最便捷之路
之前已經講過很多了,這裡再列出一些,以便讀者能夠更好的瞭解 Node.js,
編號 | 場景 | 說明 |
---|---|---|
1 | 反向代理 | Node.js可以作為nginx這樣的反向代理,雖然線上我們很少這樣做,但它確確實實可以這樣做。比如node-http-proxy和anyproxy等,其實使用Node.js做這種請求轉發是非常簡單的,在後面的http章節裡,有單獨的講解。 |
2 | 爬蟲 | 有大量的爬蟲模組,比如node-crawler等,寫起來比python要簡單一些,尤其搭配jsdom(node版本的jQuery)類庫的,對前端來說尤其友好 |
3 | 命令列工具 | 所有輔助開發,運維,提高效率等等可以用cli做的,使用node來開發都非常合適,是編寫命令列工具最簡單的方式,java8以後也參考了node的命令列實現 |
4 | 微服務與RPC | node裡有各種rpc支援,比如node編寫的dnode,seneca,也有跨語言支援的grpc,足夠應用了 |
5 | 微信公眾號開發 | 相關sdk,框架非常多,是快速開發的利器 |
6 | 前端流行SSR && PWA | SSR是伺服器端渲染,PWA是漸進式Web應用,都是今年最火的技術。如果大家用過,一定對Node.js不陌生。比如React、Vuejs都是Node.js實現的ssr。至於pwa的service-worker也是Node.js實現的。那麼為啥不用其他語言實現呢?不是其他語言不能實現,而是使用Node.js簡單、方便、學習成本低,輕鬆獲得高效能,如果用其他語言,我至少還得裝環境 |
高可用架構:移動網際網路時代,服務端更多提供的是API的介面,對API的開發框架,有哪些方面的推薦?他們的優點是哪些?
桑世龍:前端越來越複雜,後端服務化,今日的前端要面臨更多的挑戰。一個典型的場景就是在服務化架構裡,前端面臨的最頭痛的問題是異構API,前後端聯調的時候,多個後端互相推諉,要麼拖慢上線進度,要麼讓前端效能變得極其慢。進度慢找前端,效能差也找前端,但這個鍋真的該前端來背麼?
Node.js 的 Api 中間層應用很好的解決了這個問題。後端不想改的時候,實在不行就前端自己做,更靈活,更能應變。
-
透傳介面,對於內網或者非安全介面,可以採用中間層透傳。
-
聚合介面,對異構API處理非常方便,如果能夠梳理model,應變更容易。
-
Mock介面,透過Mock介面,提供前端開發效率,對流程最佳化效果極其明顯,比如去哪兒開發的yapi就是專門解決這個問題的。
除此之外,前端如果想做一些技術驅動的事兒,SSR(伺服器端渲染)和PWA(漸進式Web應用)也是非常不錯的選擇。這裡主要講一下靜態Api和伺服器端api
1)靜態Api
靜態Api在Node.js世界裡的實現有很多種方式,比如簡單的基於 Express / Koa 這樣成熟的框架,也可以採用專門的靜態Api框架,比如著名的 typicode/json-server,想實現REST API,你只需要編輯db.json,放入你的資料即可。
啟動伺服器
此時訪問網址 http://localhost:3000/posts/1
,即我們剛才仿造的靜態Api 介面,傳回資料如下
2)伺服器端Api
伺服器端Api的要點:穩定,高效,生態完備。選用Node.js的好處就是因為它的簡單高效。基礎框架除了應用最廣泛的主流Web框架Koa外,Fastify也是一直勁敵,作者 Matteo Collina 是 Node.js 核心開發,Stream 掌門,效能最佳化專家。Fastify 基於 Schema 最佳化,對效能提升極其明顯。當然,最值得說明的,我認為是企業級Web開發,這裡簡單介紹3個知名框架。
Egg.js
阿裡開源的企業級 Node.js 框架 Egg 釋出 2.0,基於 Koa 2.x,非同步解決方案直接基於 Async Function。框架層最佳化不含 Node 8 帶來的提升外,帶來 30% 左右的效能提升。
Egg 採用的是 『微核心 + 外掛 + 上層框架』 樣式,對於定製,生態,快速開發有明顯提升,另外值得關註的是穩定性和安全上,也是極為出色的。
Nest
Nest是基於TypeScript和Express的企業級Web框架。
很多人開玩笑說,Nest是最像Java開發方式的,確實,Nest採用TypeScript作為底層語言,TypeScript是ES6超集,對型別支援,面向物件,Decorator(類似於Java裡註解Annotation)等支援。在寫法上,保持Java開發者的習慣,能夠吸引更多人快速上手。
TypeScript支援幾乎是目前所有Node Web框架都要做的頭等大事,在2017年Nest算首個知名專案,值得一提。
ThinkJS
ThinkJS 是一款擁抱未來的 Node.js Web 框架,致力於整合專案最佳實踐,規範專案讓企業級團隊開發變得更加簡單,更加高效。秉承簡潔易用的設計原則,在保持出色的效能和至簡的程式碼同時,註重開發體驗和易用性,為WEB應用開發提供強有力的支援。
ThinkJS是國產老牌Web框架,在2017年10月釋出v3版本,基於Koa核心,在效能和開發體驗上有更好的提升。
整體來看,Node.js在企業Web開發領域日漸成熟,無論微服務,還是Api中間層都得到了非常好的落地。在2017年唯一遺憾的是Node.js在servless上表現的不太好,相關框架實踐偏少。
高可用架構:現在區塊鏈非常火,也有很多專案直接使用Node,也有一些專案支援Node,針對這塊您是否瞭解?也談談您的看法?
桑世龍:對於區塊鏈開發來說,一個主要的方向是以太坊的智慧合約,solidity主要是採用c/c++開發,這對很多開發來說還是有些難度的。於是有了http://truffleframework.com/這樣的Node.js框架,透過Node.js的addon把solidity的c++介面封裝成js api,這樣就極大的簡化了開發。當然,問題也是有的,限於js語言的侷限,還是有很多問題的,比如型別,數值精度等。
我對區塊鏈掌握的有限,但其價值還是相當認可。另外參加Google IO,瞭解到tessorflow的Node.js版本tfjs,具有非常好的效能和易用性,也是假貨的方向。如果有機會,推薦大家使用Node.js來做ai和區塊鏈應用。
高可用架構:眾所周知狼叔是一個牛的全棧工程師,而現在在網際網路行業全棧工程師也非常吃香,您覺得怎樣才能成為一個好的全棧工程師?
桑世龍:每次演講我會都問大家是不是前端,回答“是”的人非常多,我會開玩笑的恭喜大家:“現在的前端就是錢端”,確實,現在前端發展異常的快,而且沒有趨向於類比java裡ssh框架的那種穩定,所以未來很長一段時間,還會增長,持續混亂,這對前端來說是把雙刃劍,一方面有很強的壓迫感,不學習就跟不上時代,另一方它也是機遇,能夠帶給更多機會,包括money。
大家都疑惑的一個問題是如何在這樣巨變的時代能夠透過學習來應變,我可以很負責的告訴大家,沒有捷徑,但透過掌握 Node.js 能夠讓你降低這個學習曲線而已,畢竟Node.js是大前端的基礎設施。大家可以看一下,前端的開發過程,模組化,構建,輔助工具,調優,架構調整,可以說Node.js是無處不在的。
其實,輔助大前端開發只是Node.js的一個非常無心插柳的衍生功能,透過掌握Node.js能夠讓你能做的更多、獲得的更多,甚至可以說有更多自我實現的快樂,這也是我那本書書名字裡“更了不起的”要去闡述的內容。
綜上種種,就是我一直提倡以 JavaScript 語言為中心的 Node全棧
概念的緣由,JavaScript 改寫所有前端,Node.js 擅長做 I/O 密集型的後端,外加輔助開發的各種基礎設施,無疑是工作、學習和成為快速掌握全棧技術最好的途徑。你會的越多,你能做的就更多,你的人生也將會有不一樣的精彩篇章。
全棧核心
-
後端不會的 UI(介面相關)
-
前端不會的 DB(業務相關)
只要打通這2個要點,其他就比較容易了。最怕的是哪樣都接觸點,然後就號稱自己是全棧,建議大家不要這樣做,這就好比在簡歷裡寫精通一樣,基本上都會被問到尷尬。全棧是一種信仰,不是拿來吹牛逼的,而可以解決更多問題,讓自己的知識體系不留空白,享受自我實現的極致快樂。
高可用架構:聽說您在寫一本關於Node的書,能透露下您這邊書的內容,以及寫書的緣由和目的麼?
桑世龍:是在寫一本《更了不起的Node.js》,這個題目有點大,三月已截稿,卻遲遲不敢發,再完善一下。當前Node.js的應用場景和3年前變化極大,是時候給大家來梳理一下具體的知識體系。
《Node.js in action》一書裡說,Node.js 所針對的應用程式有一個專門的簡稱:DIRT。它表示資料密集型實時(data-intensive real-time)程式。因為 Node.js 自身在 I/O 上非常輕量,它善於將資料從一個管道混排或代理到另一個管道上,這能在處理大量請求時持有很多開放的連線,並且只佔用一小部分記憶體。它的設計標的是保證響應能力,跟瀏覽器一樣。
這話不假,但在今天來看,DIRT 還是範圍小了。其實 DIRT 本質上說的 I/O 處理的都算,但隨著大前端的發展,Node.js 已經不再只是 I/O 處理相關,而是更加的“Node”!
Node.js 使用場景主要分為4大類
-
1)跨平臺:改寫你能想到的面向使用者的所有平臺,傳統的PC Web端,以及PC客戶端
nw.js/electron
、移動端cordova
、HTML5、react-native
、weex
,硬體ruff.io
等 -
2)Web應用開發:網站、Api、RPC服務等
-
3)前端:三大框架 React \
Vue
\Angular
輔助開發,以及工程化演進過程(使用Gulp
/Webpack 構建 Web 開發工具) -
4)工具:
npm
上各種工具模組,包括各種前端預編譯、構建工具Grunt
/Gulp
、腳手架,命令列工具,各種奇技淫巧等
下麵列出具體的 Node.js 的使用場景,以模組維度劃分
分類 | 描述 | 相關模組 |
---|---|---|
網站 | 類似於 cnodejs.org 這樣傳統的網站 |
Express / Koa |
Api | 同時提供給移動端,PC,H5 等前端使用的 HTTP Api 介面 |
Restify / HApi |
Api代理 | 為前端提供的,主要對後端Api介面進行再處理,以便更多的適應前端開發 | Express / Koa |
IM即時聊天 | 實時應用,很多是基於 WebSocket 協議的 |
Socket.io / sockjs |
反向代理 | 提供類似於 nginx 反向代理功能,但對前端更友好 |
anyproxy / node-http-proxy / hiproxy |
前端構建工具 | 輔助前端開發,尤其是各種預編譯,構建相關的工具,能夠極大的提高前端開發效率 | Grunt / Gulp / Bower / Webpack / Fis3 / YKit |
命令列工具 | 使用命令列是非常酷的方式,前端開發自定義了很多相關工具,無論是shell命令,node指令碼,還是各種腳手架等,幾乎每個公司\小組都會自己的命令列工具集 | Cordova / Shell.js |
作業系統 | 有實現,但估計不太會有人用 | NodeOS |
跨平臺打包工具 | 使用 Web 開發技術開發PC客戶端是目前最流行的方式,會有更多前端開發工具是採用這種方式的 | PC端的electron、nw.js,比如釘釘PC客戶端、微信小程式IDE、微信客戶端,移動的Cordova,即老的Phonegap,還有更加有名的一站式開發框架Ionicframework |
P2P | 區塊鏈開發、BT客戶端 | webtorrent / ipfs |
編輯器 | Atom 和 VSCode 都是基於 electron 模組的 |
electron |
物聯網與硬體 | ruff.io和很多硬體都支援node sdk | ruff |
高可用架構:本次GIAC大會,您對那些主題比較感興趣? 能稍微透露下您此次大會的分享內容以及您對GIAC大會有哪些期望?
桑世龍:我個人還是對區塊鏈和Ai相關內容更感興趣。當然,作為前端,一下主題也是我非常感興趣的。
-
ReactNative替代方案plato在騰訊課堂App中的實踐,騰訊的朋友講,據說分上下場,應該是非常有趣的異常
-
Nodejs微服務架構之路,是阿裡的朋友講,這部分國內講的不多,算當下最佳實踐,我還是非常希望Nodejs微服務架構可以真正普及,讓更多人受益的。
-
webassembly在全民直播的應用,WA是新技術,將各種語言編譯成js以彌補js的效能問題。在Google IO大會上,也有WA的主題,收益匪淺,相信WA在直播領域的嘗試也是非常有遠見卓識的。
本文采訪編輯朱磊,技術原創及架構實踐文章,歡迎透過公眾號選單「聯絡我們」進行投稿。
本期 GIAC 大會上,大前端部分的精彩議題如下:
參加 GIAC,盤點2018最新技術。點選“閱讀原文”瞭解大會更多詳情。