在翻看不少技術文章時,你們都提到「中間層」,在不少大型企業中,Node確實承擔了「中間層」的角色,那麼,Node爲何被普遍的應用在「中間層」呢? html
要回答這個問題,先來陳述下什麼是中間層。前端
一般咱們把Web領域分爲客戶端和服務端,也就是前端和後端,這裏的後端就包含了網關,靜態資源,接口,緩存,數據庫等。而中間層呢,就是在後端這裏再抽離一層出來,在業務上處理和客戶端銜接更緊密的部分,好比頁面渲染(SSR),數據聚合,接口轉發等等。web
以SSR來講,在服務端將頁面渲染好,能夠加快用戶的首屏加載速度,避免請求時白屏,還有利於網站作SEO,他的好處是比較好理解的。那麼對於數據的聚合,接口轉發來講,這樣作有什麼意義呢?數據庫
Node有個突出的優點,他的開發者能夠是前端。 express
前端對於頁面所須要的數據有更好的理解,每一個頁面要用到哪些接口,每一個接口要用到哪些字段前端是最清楚的。再加上實際業務開發中,前端頁面需求常常會發生變化,須要修改字段或者數據結構,因此對接頁面的這部分接口由前端直接開發很是合適,能夠顯著的減小溝通成本。後端
面向用戶的接口由Node中間層負責之後,真正的服務端能夠專一於提供基於領域模型的對內接口,作微服務。api
好比能夠基於Goods模型,提供全部商品相關的接口;基於Users模型,提供全部用戶相關接口。當一個接口須要商品+用戶信息時,由Node分別查詢組裝。從總體業務代碼維護角度來講,變得更容易,不會由於業務發展使得每一個接口都異常繁雜。瀏覽器
若是僅僅是架構層面的需求,須要有一箇中間層來沉澱業務,那用Java,PHP也能夠作到,爲何說Node更適合作呢? 緩存
由於Node天生異步!性能優化
衆所周知,js是一門單線程語言,因此Node在實現的時候,須要藉助libuv來實現異步。
如圖所示,libuv爲Node提供了線程池,事件池,異步I/O等能力。正是由於其中網絡I/O的異步能力,可讓Node作接口聚合時,可以更高效的異步併發處理。
Node使用js開發,只須要學習簡單的api,前端開發者就能夠無障礙使用,學習成本很低。
並且,Node具備活躍的社區和豐富的模塊池,擁有不少現成的功能實現。框架方面,也有成熟的koa,express等基本框架和egg等二次封裝框架,可根據需求選擇上手也比較方便。
爲何要先後端分離
VIEW層的兩種維護方式
1.前端寫Demo,後端套頁面
問題:後端須要寫HTML,且前端仍然須要確認後端寫的HTML。
2.前端寫View層,後端只管數據
問題:前端須要熟悉後端語言,且前端須要瞭解後端架構。
問題1:前端代碼愈來愈複雜
問題2:先後端依舊高度耦合
問題3:沒法良好的支持跨終端
問題4:高度耦合的先後端分工
接口分離, 後端提供數據, 前端本身搞
業界滿坑滿谷的優秀方案:Backbone, EmberJS, KnockoutJS, AngularJS, React, etc.
先後端職責清晰了
後端 | 前端 |
---|---|
|
|
問題1:各層職責重疊,而且各玩各的
問題2:性能問題
問題3:重用問題
問題4:跨終端問題
問題5:SEO問題
是依照工做職責來劃分的先後端,仍是依照硬體環境劃分的先後端?
傳統認知的先後端(按硬體環境劃分)
從新定義的先後端(按工做指責劃分)
在服務器(JAVA)與瀏覽器(JS)的中間架了一箇中間層(NODEJS)
指責劃分
後端 |
前端 |
|
---|---|---|
服務器 | 瀏覽器 | |
JAVA | NodeJS | JS + HTML + CSS |
|
|
|
在NodeJS端使用Bigpiper技術,合併請求,下降負擔,分批輸出,不影響體驗。
頁面渲染優化
單頁面應用優化
可靠性優化
單元測試,頁面測試,迴歸測試,持續集成。
接口性能優化
拆分大接口爲獨立小接口,併發請求。串行 => 並行,大幅縮短請求時間。
部署優化
一臺NodeJS對多臺JAVA服務器,合理的分配服務器帶來最大的產出。
優化時秉承的思想:接口服務化 代碼模塊化 功能組件化
轉自:
https://2014.jsconfchina.com/slides/herman-taobaoweb/index.html#/