原文:Introducing Horizon: build realtime apps without writing backend code前端
今天咱們很是榮幸地宣佈 Horizon 第一次正式發佈,一個開源的後端服務,能夠幫助開發者構建和擴展實時 web 應用,Horizon 包括:程序員
一個使用 Nodejs 和 RethinkDB 構建的後端服務器,支持數據持久化,實時流,輸入校驗,用戶認證,還有權限體系web
一個 JavaScript 客戶端庫,開發者能夠在前端將 json 文檔存儲到數據庫中,執行查詢,以及訂閱實時更新數據庫
一個命令行工具,能夠生成項目模板,啓動一個本地的 Horizon 開發服務器,還能幫助你將本身的 Horizon 應用部署到雲端json
Horizon 服務器是一個完整的後端服務,開發者能夠用來驅動他們的應用。它很是適合用來實現快速原型:簡單地經過命令行運行 Horizon 服務器,利用 Horizon 客戶端庫來提高你前端的用戶體驗。有了 Horizon,前端開發者不寫一行後端代碼就能開發出一個完整的應用。redux
Horizon 是一個開源軟件,就是說你能夠按照本身的喜愛使用和修改。開發的時在本身的筆記本上運行一個本地實例,以後能夠部署到任何你想到部署的地方:低廉的 VPS 主機,公有云,或者你本身的裸機上。Horizon 依靠 RethinkDB 可靠的集羣,在你用戶增加以後能夠很方便地進行擴展。後端
除了開源的 Horizon 後端,咱們還構建了一個能夠用來部署,管理和擴展 Horizon 應用的雲服務,Horizon Cloud 管理 Horizon 後端服務和底層的 RethinkDB 數據庫,還能按照需求自動進行擴展。Horizon Cloud 還對備份和恢復,不停機版本更新,監控和其餘實用功能提供了內置支持。開發者可使用 Horizon 命令行工具將本身的應用部署到 Horizon Cloud。Horizon Cloud 目前還處於內測階段,但用不了多久就會和你們見面。api
去年在介紹 RethinkDB 1.16 帶來的 changefeeds 時,咱們分享了推進實時 web 的計劃。再也不須要經過輪詢的方式獲取數據更新,開發者能夠告訴數據庫將應用的實時結果做爲持續的流推送過來。當咱們與用戶分享這一功能時,有個問題翻來覆去地被問起:我能夠從瀏覽器的 web 應用中直接訪問 RethinkDB 的實時更新嗎?數組
changefeeds 在最開始是爲後端開發者設計的 ,由他們決定如何將實時更新傳輸到前端。在咱們推出這個功能後不久,咱們開始琢磨若是能將實時數據流直接暴露給瀏覽器會不會很是牛逼。WebSocket 抽象庫, GraphQL 那樣的新數據檢索技術,以及 RxJS Observables 強大的異步流本源,給前端提供了新的si去檢索和處理數據。Web 應用正在不斷進化,早已超出 REST 和 XMLHttpRequest 所能承載的能力。Horizon 是爲將來而生,它用實時數據流貫通數據庫和前端。瀏覽器
Horizon 能減小開發人員在構建和擴展 web 應用時面對的麻煩。它消除了重複的模板和繁瑣的步驟,就像手寫 CRUD 端點,用戶認證,以及 session 管理。咱們致力於填補數據持久層和前端之間的鴻溝,將開發者從不斷髮明輪子的輪迴中解脫出來,使其能把更多的時間集中在實現業務邏輯上。
開始使用 Horizon 以前,先要從 NPM 上安裝 Horizon 庫包,其中包含了一個名爲 hz 的命令行工具,你能夠用它來生成和運行你的首個項目。你能夠在Horizon 官網找到詳細安裝說明和簡明教程
Horizon 客戶端庫提供了簡明的 API,你能夠經過鏈式方法表達數據庫查詢。查詢返回 RxJS Observables,便於你對流查詢結果進行合併和處理。在這背後,Horizon 的數據集合基於 RethinkDB 的表。在開發模式下運行 Horizon 時,服務器將自動建立所需的表和索引。
下面的例子展現瞭如何在瀏覽器或其餘前端環境使用 Horizon 客戶端庫。這段代碼展現瞭如何將 JSON 文檔存儲在一個 Horizon 集合中,以及從集合記錄中獲取一個過濾後的子集:
var horizon = Horizon(); var messages = horizon("messages"); messages.store({ sender: "Bob", time: new Date(), text: "Hello, World!" }); messages.findAll({sender: "Bob"}).fetch() .subscribe(m => console.log(m));
若是想不停地執行查詢並得到實時更新的流數據,只須要使用 watch
方法,接下來的例子便展現瞭如何經過 Horizon 查詢來實如今線遊戲中的實時排行榜:
var users = horizon("users"); users.order("score", "descending").limit(5).watch() .subscribe(items => console.log(items))
上邊的查詢按照用戶的分數倒序排列並給出前五名。每當數值發生變化,subscribe
回調將得到一個包含更新內容的完整數組,它會自動維護排序順序,並根據須要添加和刪除用戶。
Horizon 服務器將客戶端的查詢翻譯成 ReQL,即 RethinkDB 的查詢語言。查詢翻譯過程當中利用自動生成的索引,最大限度提升效率和性能。Horizon 查詢語言設計的要比 ReQL 簡單易用,易於開發者學習和進行服務器優化。下面是支持的命令列表:
find, findAll
above, below, limit, order
remove, removeAll
store, upsert, replace
watch, fetch
你能夠查閱 Horizon 文檔 來學習更多關於客戶端庫 API 的用法。咱們正着手一系列的改進,提升查詢語言的能力和表現力,好比一個特性就是可使你將多個查詢組合到模型關係中。
Horizon 不具備強制性也不會自覺得是--它自己就被設計成能與你瞭解喜好的 JavaScript 框架配合使用的。Horizon 服務器具備很強可擴展性,就是說,想定製後端服務的開發者能夠根據本身的須要將 Horizon 嵌入到 Node.js 應用中,還能夠按照須要添加新功能。你甚至能夠將 Horizon 整合到現有的 Node.js 後端應用中,能夠和常規的框架好比 Express,Koa,Hapi 等愉快的玩耍。
Horizon 客戶端庫使用一個簡單的基於 WebSocket 的協議與服務器進行通訊,不過咱們提供了一個純淨的抽象層,你沒必要管理持久性鏈接,也不用關心 WebSockets 具體怎麼工做。Horizon 客戶端庫能夠很好地搭配任何前端框架使用,如 React,Angular,Ember,以及 vanilla JavaScript(全球最流行的 JavaScript 框架 :)。你還能夠與 redux 那樣的前端狀態管理器搭配使用。
你能夠在 Horizon 的官方 Github 倉庫找到一個示例,展現瞭如何把 Horizon 與形形色色的前端和後端的框架整合到一塊兒。React 開發者還能夠去看一下 lovli.js,一個由 Patrick Neschkudla 編寫的實用模板,其中用到了 Horizon,React,以及 Redux。
咱們期待某一天能將 Horizon 客戶端庫搬到移動平臺上,咱們也在積極的與社區合做,以確保 Horizon JavaScript 客戶端能在 Electron 和 React Native 上正常工做。JavaScript 正在滲透到各個地方,從嵌入式物聯網系統到桌面和移動應用程序。咱們相信 Horizon 能提供一些理由讓開發者選擇 JavaScript。
此外,咱們還爲客戶端庫與 Horizon 後端通訊的底層協議編寫了文檔。開發者能夠利用該協議構建其餘語言版本的客戶端庫。該協議包括簡單的JSON文件。它基於 engine.io,一個支持多個網絡傳輸的實時框架。
今天發佈的 Horizon 只是一個起點,遠不是最終的目標。你會在項目進度中看到新功能和改進。現有功能包括:查詢,實時更新,認證,權限體系,以及對靜態資源的支持。
一些主打功能還不夠成熟。權限系統和校驗支持是近期剛加入的,很晚才列入到開發週期中。在咱們着手改進這些功能的時候,你可能會遇到一些不完善的地方。
長期規劃仍在不斷壯大,不過下面這個列表,是咱們但願在將來的版本中包含的功能:
一個內置的管理後臺,配備交互式數據瀏覽器
更好的鏈接生命週期管理器以及斷開鏈接恢復
支持使用 ReQL 和 JavaScript 自定義 Horizon 命令
支持客戶端文件上傳
除了 OAuth 之外,提供常規的密碼認證
內置分頁 API,搭配實時查詢使用
原生支持執行開放式更新
支持關係性的查詢聚合
內置支持 GraphQL 數據查詢
你能夠關注 Horizon forum 上的平常更新,咱們會努力完善這些功能和穩定 Horizon 的代碼。
Horizon: the realtime, open-source JavaScript backend
Horizon forum
GitHub - rethinkdb/horizon: Horizon is a realtime, open-source backend for JavaScript apps
Join RethinkDB on Slack
咱們期待着與你的合做,咱們以推動實時 web 的發展爲己任。
譯者:
一個程序員的命運啊,固然要靠自我奮鬥,但也要考慮到歷史行程,我一個前端工程師,怎麼就忽然關心起數據庫了呢。
這個翻譯也沒有什麼太多內容,大概三件事:
起源,怎麼就作了這麼個東西;
使用,提供了不少好玩的東西;
展望,有好多牛逼的東西要實現。
若是還有一點什麼內容就是鼓勵社區參與,這對後續的發展有很大幫助。但這些都是次要的,主要的就是三件事情,很慚愧,就作了一點微小的工做,謝謝你們。