Node.js 這一次再也不錯過

學習新知識新事物,我以爲得知道她的一些屬性,好比是什麼,能解決什麼問題,來自哪裏等等。沒有最好的,只有最合適的。接下來的日子或者說歲月裏,就來淺談 Nodejs。前端

是什麼

正如 Node.js 官方所說 Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. 即 Node.js 是一個基於 Chrome V8 引擎的 JavaScript 運行環境。能夠看出 Node.js 不是一門新的編程語言,而是 JavaScript 的運行環境(服務端的運行環境,之如客戶端的瀏覽器環境),而 Nodejs 的編程語言指的是 JavaScript(這之間的關係仍是要梳理清楚)。node

2009 年以前,當時的 JavaScript 仍是一個在瀏覽器環境裏的一門腳本語言,實現前端頁面交互和一些動態特效。時間的分水嶺就在這裏,Javascript 就不僅運行於瀏覽器,還能夠運行於服務端,彷彿打通了先後端的任督二脈,這要歸功於 Node.js 之父 Ryan Dahl。數據庫

爲何選 Javascript

JavaScript 是一個單線程的語言,單線程的優勢是不會像 Java 這些多線程語言在編程時出現線程同步、線程鎖問題,同時也避免了上下文切換帶來的性能開銷問題。想象一下多線程對同一個 DOM 進行操做會怎樣?不是亂套了嗎?可能你會想一個問題:單線程是否是前面一個執行不完,後面就被卡住了?編程

JavaScript 是一種採用了事件驅動、異步回調的模式(主線程是單線程)。JavaScript 在虛擬機上因爲有了 Chrome V8 的支持,使得 JavaScript 成爲了 Node.js 的首選語言。因此,Node.js 使用了一個事件驅動、非阻塞式 I/O 的模型,使其輕量又高效。後端

架構

首先,Node.js 由 Libuv、Chrome V八、一些核心 API 構成,如圖所示:瀏覽器

  • Node Standard Library:Node.js 的標準庫,對外提供的 JavaScript 接口,如 http、buffer、fs、stream 等;
  • Node bindings:是 JavaScript 與 C++ 鏈接的橋樑,對下層模塊進行封裝,向上層提供基礎的 API 接口;
  • V8:Google 開源的高性能 JavaScript 引擎,使用 C++ 開發,應用於谷歌瀏覽器;
  • Libuv:是一個跨平臺的支持事件驅動的 I/O 庫,使用 C 和 C++ 語言開發;
  • C-ares:一個異步 DNS 解析庫;
  • Low-Level Components:提供了 http 解析、OpenSSL、數據壓縮(zlib)等功能;

特色

跨平臺

最初 Node.js 只運行於 Linux 平臺,V0.6.0 版本後在 Libuv 的加持下可運行在 Windows 平臺服務器

單線程

使用單線程運行,不像 Apache HTTP 之類的服務器,每發生一個請求就產生一個線程。這種方法避免了 CPU 上下文切換和內存中的大量執行堆棧,解決了 Nginx 和其它服務器的 「上一個 10 年,著名的 C10K 併發鏈接問題」。多線程

非阻塞 I/O

避免了等待輸入或輸出(文件系統、Web服務器、數據庫等)響應形成的 CPU 時間損失,得益於 Libuv 的異步 I/O。架構

事件驅動

事件與回調在 JavaScript 中家常便飯,是一種高性能的服務模型,對於習慣同步思路編程的同窗一時很難理解。Node.js 與 Nginx 均是基於這種方式,只是 Nginx 採用 C 編寫,適用於 Web 服務器,Node.js 是可擴展、高性能的平臺。併發

場景

I/O 密集型場景

Node.js 的特色就是事件驅動,非阻塞異步 I/O,只開一個主線程,不會每一個請求都去建立一個線程,從而節省資源開銷。

Resutful API

使用 Node.js 來作爲中間層,整合數據並提供 API 接口,這些數據源通常來自第三方接口或者數據庫,後端就能夠更專一於業務開發。推薦一個去哪兒開源的 API 管理工具 YAPI,就是使用的 Node.js 進行開發的。

BFF

Backend For Frontend(服務於前端的後端),邏輯上的分層並非新技術。可作一些資源的整合。場景是:原先須要從多個地方獲取數據,有了這一層(作個聚合),統一處理以後返回一個數據源,同時後期也不會由於後端數據遷移而重構。

RPC

Remote Procedure Call(遠程過程調用)。當今微服務模式下,主要是針對功能或業務進行服務化,服務間的通訊常見的模式都是經過 HTTP 實現,HTTP 屬於應用層協議,若是經過 TCP 的方式(傳輸層),那豈不是更高效。RPC 服務就是採用的 TCP,好比 Google 的 gRPC、阿里的 Dubble。

基礎工具

好比編譯器、構建工具、搭建腳手架等,咱們知道的 Gulp、Webpack 就是成功案例。

論壇社區

Nodeclub 是使用 Node.js 和 MongoDB 開發的社區系統,界面優雅,功能豐富,小巧迅速,已在Node.js 中文技術社區 CNode 獲得應用,但你徹底能夠用它搭建本身的社區。

Serverless

無服務器架構,開發者只需關注於業務自己,不須要去關心運維、流量處理這些工做。咱們知道 JavaScript 中函數是一等一的公民,寫個函數就實現一個 API 接口給到前端,對開發工做減輕不少(函數即服務)。

MicroServices

微服務,小型服務、以獨立進程運行、可以使用不一樣語言。根據業務形態來選擇不一樣的語言實現,Node.js 自己也是很輕量級的,實現起來也很快。最好的打不過合適的!

你能夠...

下一篇:Node.js 之 Module 模塊

相關文章
相關標籤/搜索