[译] Introducing Horizon: build realtime apps without writing backend code

简介:
原文: Introducing Horizon: build realtime apps without writing backend code

今天我们非常荣幸地宣布 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 目前还处于内测阶段,但用不了多久就会和大家见面。

为什么是 Horizon

去年在介绍 RethinkDB 1.16 带来的 changefeeds 时,我们分享了推动实时 web 的计划。不再需要通过轮询的方式获取数据更新,开发者可以告诉数据库将应用的实时结果作为持续的流推送过来。当我们与用户分享这一功能时,有个问题翻来覆去地被问起:我可以从浏览器的 web 应用中直接访问 RethinkDB 的实时更新吗?

changefeeds 在最开始是为后端开发者设计的 ,由他们决定如何将实时更新传输到前端。在我们推出这个功能后不久,我们开始琢磨如果能将实时数据流直接暴露给浏览器会不会非常牛逼。WebSocket 抽象库, GraphQL 那样的新数据检索技术,以及 RxJS Observables 强大的异步流本源,给前端提供了新的si去检索和处理数据。Web 应用正在不断进化,早已超出 REST 和 XMLHttpRequest 所能承载的能力。Horizon 是为未来而生,它用实时数据流贯通数据库和前端。

Horizon 能减少开发人员在构建和扩展 web 应用时面对的麻烦。它消除了重复的模板和繁琐的步骤,就像手写 CRUD 端点,用户认证,以及 session 管理。我们致力于填补数据持久层和前端之间的鸿沟,将开发者从不断发明轮子的轮回中解脱出来,使其能把更多的时间集中在实现业务逻辑上。

上手 Horizon

开始使用 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 不具有强制性也不会自以为是--它本身就被设计成能与你了解喜爱的 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 只是一个起点,远不是最终的目标。你会在项目进度中看到新功能和改进。现有功能包括:查询,实时更新,认证,权限体系,以及对静态资源的支持。

一些主打功能还不够成熟。权限系统和校验支持是近期刚加入的,很晚才列入到开发周期中。在我们着手改进这些功能的时候,你可能会遇到一些不完善的地方。

长期规划仍在不断壮大,不过下面这个列表,是我们希望在未来的版本中包含的功能:

你可以关注 Horizon forum 上的日常更新,我们会努力完善这些功能和稳定 Horizon 的代码。

社区参与

我们期待着与你的合作,我们以推进实时 web 的发展为己任。


目录
相关文章
|
开发框架 .NET
Deployment of VC2008 apps without installing anything
If you create a default CRT/MFC application with VS2008, this application will not run on other computers.
1126 0
|
并行计算
Howto: Deploy VC2008 apps without installing vcredist_x86.exe
There are several reasons for xcopy deployment of an application (also known as application local). One main reason is that you are independent of what the target computer has installed.
947 0
|
19天前
|
JSON 小程序 JavaScript
uni-app开发微信小程序的报错[渲染层错误]排查及解决
uni-app开发微信小程序的报错[渲染层错误]排查及解决
271 7
|
18天前
|
小程序 JavaScript 前端开发
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
374 1
|
5天前
|
小程序 数据挖掘 UED
开发1个上门家政小程序APP系统,都有哪些功能?
在快节奏的现代生活中,家政服务已成为许多家庭的必需品。针对传统家政服务存在的问题,如服务质量不稳定、价格不透明等,我们历时两年开发了一套全新的上门家政系统。该系统通过完善信用体系、提供奖励机制、优化复购体验、多渠道推广和多样化盈利模式,解决了私单、复购、推广和盈利四大痛点,全面提升了服务质量和用户体验,旨在成为家政行业的领导者。
|
28天前
|
JavaScript 前端开发 小程序
uniapp一个人开发APP关键步骤和考虑因素
uniapp一个人开发APP关键步骤和考虑因素
94 1
uniapp一个人开发APP关键步骤和考虑因素
|
19天前
|
JavaScript 前端开发 UED
Vue与uni-app开发中通过@font-face巧妙引入自定义字体
Vue与uni-app开发中通过@font-face巧妙引入自定义字体
47 9
|
22天前
|
缓存 小程序 索引
uni-app开发微信小程序时vant组件van-tabs的使用陷阱及解决方案
uni-app开发微信小程序时vant组件van-tabs的使用陷阱及解决方案
120 1
|
2天前
|
机器人
布谷直播App系统源码开发之后台管理功能详解
直播系统开发搭建管理后台功能详解!
|
23天前
|
小程序 JavaScript API
微信小程序开发之:保存图片到手机,使用uni-app 开发小程序;还有微信原生保存图片到手机
这篇文章介绍了如何在uni-app和微信小程序中实现将图片保存到用户手机相册的功能。
358 0
微信小程序开发之:保存图片到手机,使用uni-app 开发小程序;还有微信原生保存图片到手机