本文由 Shaw 發表在 ScalaCool 團隊博客。前端
響應式編程是一種基於數據流以及傳播數據變化的編程範例。例如,考慮表 1.1 中所表示的電子表格。react
單元格 C1 以以下的方式來定義:web
C1 = A1 * B1數據庫
若是咱們在電子表格中運行上述例子,一旦 A1 或者 B1 的值發生改變,那麼 C1 的結果將相應地做出改變。所以電子表格背後的編程語言容許咱們定義數據之間的關係,那些數據將會在電子表格中傳播變化。apache
爲了實現一個實時的電子表格應用程序,好比 Google Drive 中的電子表格,咱們將會利用一些底層的概念(諸如事件)去進行構建:當用戶改變單元格 A1 的值時,會觸發一個事件。而後全部與 A1 有關的單元格,好比包含咱們表達式的單元格 C1就會對該事件作出響應,該單元格將會從新計算自身的值而後將新的值顯示出來。這個過程將徹底對用戶隱藏,由於用戶只關心單元格中值之間的關係。編程
在 Web 應用程序開發方面,這種技術愈來愈多地用於前端應用程序的開發。好比 KnockoutJS、AngularJS、Meteor 以及 React.js 等工具都使用了這種模式。開發者不須要關心在特定 DOM 元素上聲明的監聽器的細節,他們只須要描述數據的變化是如何經過用戶界面進行傳播的就能夠了。採用這種模式使得如何去實現響應式用戶界面變得簡單化了。咱們將在第8章中探討響應式用戶界面。安全
在服務端也能找到相似的抽象,其中事件起着關鍵性的做用。好比「響應式流」,她旨在爲 JVM 上的異步流處理提供一個標準接口。關於這種新的方式咱們將會在第9章詳細討論。服務器
這些年來出現了許多技術和框架,她們都有一些共同點,根據這些共同點,咱們能夠將其歸爲響應式技術。可是開發響應式應用並不只僅是簡單地使用響應式技術,這點將會在後面介紹。可是所採用的技術必須知足許多先決條件用以支持響應式的行爲,尤爲是異步和事件驅動代碼執行的能力。app
微軟的 Reactive Extensions (Rx; rx.codeplex.com/)是一個用於編寫基於異步以及事件驅動程序的類庫。你能夠在 .NET 平臺以及其餘平臺(例如 JavaScript)上使用它。在 Node.js(nodejs.org)上使用 JavaScript 去構建異步的、基於事件驅動的應用程序現已很是流行。一樣,在 JVM 上也有大量的類庫支持異步以及事件驅動,好比 Apache MINA (https:// mina.apache.org) 以及 Netty(netty.io)。
這些底層技術都提供了構建異步和事件驅動應用程序的基本工具,可是要使一個 Web 應用達到一種成熟完備的狀態還須要作不少工做。一個成熟的應用程序必需要可以兼顧許多方面,好比代碼組織、視圖模板、客戶端資源(例如樣式表和 JavaScript 文件)的引入和組織。還有數據庫的鏈接以及系統的安全性等。當下有許多所謂的全棧式 Web 應用框架,其中還有少部分採用了響應式技術,可是隻有極少部分擁抱了響應式技術的原理和核心,她們經過採用響應式技術來從根本上去構建 Web 框架。
全棧式框架關注一個應用程序在構建以及部署過程當中所涉及到的全部層面:客戶端UI技術(或集成方式),服務器端業務邏輯,身份驗證,數據庫訪問集成以及各類通用模塊的類庫(如遠程 Web 服務調用)。在響應式應用程序中,全部這些層都必須遵循相同的異步調用和錯誤恢復的原則。
Play 框架是迄今爲止 JVM 上惟一的一個全棧響應式 Web 應用框架。其餘諸如 Lift (http://liftweb .net)的全棧式框架爲 web 應用程序的開發提供了一個很好的選擇。可是她們沒有將異步,故障恢復能力和可伸縮性做爲主要的目標來設計。
Play 是基於 Netty 來構建的,並經過使用「響應式流」所提供的異步流處理來支持其響應式行爲(如圖 1.1)。
Play 經過使用 sbt 構建工具來處理 web 應用程序開發的典型問題,例如客戶端資源處理、項目的編譯和打包。而且 sbt 還提供了許多有用的類庫來解決諸如 JSON 處理和 Web 服務訪問之類的常見問題。另外她還提供了許多插件來實現對數據庫的訪問。在本書的剩餘部分中,你將學習到如何利用 Play 的高效性來構建響應式 web 應用。
如今咱們來進一步瞭解 web 應用程序是如何工做的,以及如何去利用計算機資源來理解爲何響應式 web 應用程序的異步、事件驅動的行爲是必要的。