今天我們非常榮幸地宣布 Horizon 第一次正式釋出,一個開源的後端服務,可以幫助開發者建構和擴充實時 web 應用,Horizon 包括:
一個使用 Nodejs 和 RethinkDB 建構的後端伺服器,支援資料持久化,實時流,輸入校驗,使用者認證,還有權限體系
一個 JavaScript 用戶端庫,開發者可以在前端将 json 文檔存儲到資料庫中,執行查詢,以及訂閱實時更新
一個指令行工具,可以生成項目模闆,啟動一個本地的 Horizon 開發伺服器,還能幫助你将自己的 Horizon 應用部署到雲端
Horizon 伺服器是一個完整的後端服務,開發者可以用來驅動他們的應用。它非常适合用來實作快速原型:簡單地通過指令行運作 Horizon 伺服器,利用 Horizon 用戶端庫來提升你前端的使用者體驗。有了 Horizon,前端開發者不寫一行後端代碼就能開發出一個完整的應用。
Horizon 是一個開源軟體,就是說你可以按照自己的喜好使用和修改。開發的時在自己的筆記本上運作一個本地執行個體,之後可以部署到任何你想到部署的地方:低廉的 VPS 主機,公有雲,或者你自己的裸機上。Horizon 依靠 RethinkDB 可靠的叢集,在你使用者增長之後可以很友善地進行擴充。
除了開源的 Horizon 後端,我們還建構了一個可以用來部署,管理和擴充 Horizon 應用的雲服務,Horizon Cloud 管理 Horizon 後端服務和底層的 RethinkDB 資料庫,還能按照需求自動進行擴充。Horizon Cloud 還對備份和恢複,不停機版本更新,監控和其他實用功能提供了内置支援。開發者可以使用 Horizon 指令行工具将自己的應用部署到 Horizon Cloud。Horizon Cloud 目前還處于内測階段,但用不了多久就會和大家見面。
去年在介紹 RethinkDB 1.16 帶來的 changefeeds 時,我們分享了推動實時 web 的計劃。不再需要通過輪詢的方式擷取資料更新,開發者可以告訴資料庫将應用的實時結果作為持續的流推送過來。當我們與使用者分享這一功能時,有個問題翻來覆去地被問起:我可以從浏覽器的 web 應用中直接通路 RethinkDB 的實時更新嗎?
changefeeds 在最開始是為後端開發者設計的 ,由他們決定如何将實時更新傳輸到前端。在我們推出這個功能後不久,我們開始琢磨如果能将實時資料流直接暴露給浏覽器會不會非常牛逼。WebSocket 抽象庫, GraphQL 那樣的新資料檢索技術,以及 RxJS Observables 強大的異步流本源,給前端提供了新的si去檢索和處理資料。Web 應用正在不斷進化,早已超出 REST 和 XMLHttpRequest 所能承載的能力。Horizon 是為未來而生,它用實時資料流貫通資料庫和前端。
Horizon 能減少開發人員在建構和擴充 web 應用時面對的麻煩。它消除了重複的模闆和繁瑣的步驟,就像手寫 CRUD 端點,使用者認證,以及 session 管理。我們緻力于填補資料持久層和前端之間的鴻溝,将開發者從不斷發明輪子的輪回中解脫出來,使其能把更多的時間集中在實作業務邏輯上。
Horizon 用戶端庫提供了簡明的 API,你可以通過鍊式方法表達資料庫查詢。查詢傳回 RxJS Observables,便于你對流查詢結果進行合并和處理。在這背後,Horizon 的資料集合基于 RethinkDB 的表。在開發模式下運作 Horizon 時,伺服器将自動建立所需的表和索引。
下面的例子展示了如何在浏覽器或其他前端環境使用 Horizon 用戶端庫。這段代碼展示了如何将 JSON 文檔存儲在一個 Horizon 集合中,以及從集合記錄中擷取一個過濾後的子集:
如果想不停地執行查詢并獲得實時更新的流資料,隻需要使用 `watch` 方法,接下來的例子便展示了如何通過 Horizon 查詢來實作線上遊戲中的實時排行榜:
上邊的查詢按照使用者的分數倒序排列并給出前五名。每當數值發生變化,`subscribe` 回調将獲得一個包含更新内容的完整數組,它會自動維護排序順序,并根據需要添加和删除使用者。
find, findAll
above, below, limit, order
remove, removeAll
store, upsert, replace
watch, fetch
Horizon 不具有強制性也不會自以為是--它本身就被設計成能與你了解喜愛的 JavaScript 架構配合使用的。Horizon 伺服器具有很強可擴充性,就是說,想定制後端服務的開發者可以根據自己的需要将 Horizon 嵌入到 Node.js 應用中,還可以按照需要添加新功能。你甚至可以将 Horizon 整合到現有的 Node.js 後端應用中,可以和正常的架構比如 Express,Koa,Hapi 等愉快的玩耍。
Horizon 用戶端庫使用一個簡單的基于 WebSocket 的協定與伺服器進行通信,不過我們提供了一個純淨的抽象層,你不必管理持久性連接配接,也不用關心 WebSockets 具體怎麼工作。Horizon 用戶端庫可以很好地搭配任何前端架構使用,如 React,Angular,Ember,以及 vanilla JavaScript(全球最流行的 JavaScript 架構 :)。你還可以與 redux 那樣的前端狀态管理器搭配使用。
我們期待某一天能将 Horizon 用戶端庫搬到移動平台上,我們也在積極的與社群合作,以確定 Horizon JavaScript 用戶端能在 Electron 和 React Native 上正常工作。JavaScript 正在滲透到各個地方,從嵌入式物聯網系統到桌面和移動應用程式。我們相信 Horizon 能提供一些理由讓開發者選擇 JavaScript。
一些主打功能還不夠成熟。權限系統和校驗支援是近期剛加入的,很晚才列入到開發周期中。在我們着手改進這些功能的時候,你可能會遇到一些不完善的地方。
長期規劃仍在不斷壯大,不過下面這個清單,是我們希望在未來的版本中包含的功能:
<a href="http://link.zhihu.com/?target=http%3A//horizon.io/" target="_blank">Horizon: the realtime, open-source JavaScript backend</a>
<a href="http://link.zhihu.com/?target=https%3A//discuss.horizon.io/" target="_blank">Horizon forum</a>
<a href="http://link.zhihu.com/?target=https%3A//github.com/rethinkdb/horizon" target="_blank">GitHub - rethinkdb/horizon: Horizon is a realtime, open-source backend for JavaScript apps</a>
<a href="http://link.zhihu.com/?target=http%3A//slack.rethinkdb.com/" target="_blank">Join RethinkDB on Slack</a>
<a href="http://link.zhihu.com/?target=https%3A//twitter.com/horizonjs" target="_blank">https://twitter.com/horizonjs</a>
我們期待着與你的合作,我們以推進實時 web 的發展為己任。