首页 存档 技术 查看内容

基于Wilddog的实时web架构

2018-3-30 13:00 |来自: 互联网 443 0

摘要: HTML5是一系列标准,目标是让web page变成web app。在web page时代浏览器不具有也不需要具有实时连接的能力。但网页应用不同,不论是网页游戏,实时IM,实时地理位置,实时数据监控都需要实时性。现有的Web架构其实 ...

HTML5是一系列标准,目标是让web page变成web app。在web page时代浏览器不具有也不需要具有实时连接的能力。但网页应用不同,不论是网页游戏,实时IM,实时地理位置,实时数据监控都需要实时性。现有的Web架构其实并不具备实时的能力。因为现有的Web架构基于Http协议,而HTTP协议是基于请求响应的,天然与实时八字不合。所以需要有新的架构来满足实时化web的需求。

Wilddog的优势是强大的实时数据同步,支持多端,离线可用。
在已有系统上集成Wilddog非常简单,只需要在服务端做一点小修改。

其中客户端(浏览器)引入Wilddog SDK,与Wilddog 云端实时同步。用户已有的服务端与Wilddog云端通过RESTFul接口通信。这个架构适应的场景有:

  • 类似微信的实时通信

  • 实时游戏

  • 实时新闻客户端

  • email web 客户端

  • 需要实时监控数据变化的图表,比如股票,地震监测等。

  • 其他几乎任何实时场景

其中用到的Wilddog特性有:

  • WebSocket长连接

  • 数据存储能力和数据同步机制

  • RESTFul接口访问和SSE

  • 基于JWT的跨域认证机制和基于表达式的授权机制

WebSocket 长连接

在Wilddog客户但与Wilddog云端直接主要使用WebSocket作为传输协议。WebSocket协议是HTML5众多协议里的一个,其作用是建立客户端与服务端的长连接。其实在WebSocket之前 伟大的程序员们就进行了各种实时化的尝试,比如:

  • Ajax polling:客户端使用Ajax每隔一定时间向服务端发起一次数据请求。实时性取决于请求的频次,而性能也决定于请求的频次,代价非常昂贵

  • Ajax long polling:跟Ajax polling的方式类似,不同之处是需要服务端keep-alive的支持。客户端不再定时发送数据请求,而是发送一个请求后一直等待,直到这个请求返回数据再发起下一次请求。比起polling进步的一点是可以做到真正的实时,而且性能明显提高,但依然不够高。

Ajax long polling 其实就可以实现真正的实时了,那么WebSocket的优势在哪里?答案就是性能的提升。WebSocket相对Ajax long polling性能的提升不止一点点。原因是WebSocket的传输其实并不依赖于HTTP协议,而且不需要重复建立TCP连接。WebSocket只使用HTTP协议作为握手协议,当长连接建立之后就再也不需要传输庞大的HTTP头了。WebSocket协议头基于二进制,非常小,跟HTTP协议头相比可以忽略不计。对比如图:


Wilddog主要使用WebSocket进行数据传输,在不支持的场景下退化为long polling。

数据存储和实时同步

WebSocket是个优秀的协议。但不能直接用于生产,因为你会面临以下问题:

  • 浏览器兼容性

  • 断线重连,会话维持

  • 服务端逻辑

协议提供的API一般都是最小可用的,而开发者希望拿到的API是好用的!所以需要有第三方的库来封装。幸运的是有一些库是比较好的,其中有代表性的是Socket.io。Socket.io解决了浏览器兼容性问题,提供了会话层,同时有基于Node.js的服务端逻辑。

用户可以用Socket.io来写一些实时应用,不过仍然有部分问题没有解决:

  • 你需要关注数据发给谁

  • 你需要关注连接状态,在线与离线需要两套不同的处理机制

  • 手动处理数据权限问题,Socket.io 是无权限机制的

Wilddog恰好的解决了这些问题,因为有数据存储,所以不需要关注对方的连接状态,只需要修改相应位置的数据就可以,数据同步可以让应用离线可用,而且离线与在线可以共用一套逻辑。关于Wilddog的数据存储和同步机制可以写的东西太多,打算另外单独写一篇介绍。

简单说下结论,同步架构带来的好处是:

  • 离线可用

  • 用户只需要关心本地数据,不需要关注连接和其他客户端。

同步意味着需要有本地存储和云端存储。Wilddog的数据存储格式是基于JSON的,类似MongoDB等NoSQL数据库。JSON的好处是天然与JS语言兼容,前端友好。

比如这段数据:

{ "id":"123", "name":"不知道怎么认真起个名", "age":22, friends:{ "123345":true, "132":true } }

RESTFul接口与SSE

Wilddog数据是可以通过服务端访问的。Wilddog数据库中的数据结构不支持数组,原因是要做到RESTful,数据库中的任何一条数据都能够通过url直接访问到。服务端可以通过HTTP协议访问Wilddog数据库中的所有数据。

假如上面的一段数据存在存在https://YOUR-APP-ID.wilddogio.com/users位置

那么通过HTTP请求

GET https://YOUR-APP-ID.wilddogio.com/users/123/friends.json

你将得到

{ "123345":true, "132":true }

你还可以通过POST,PUT,DELETE,PATCH对数据进行修改。而且还支持SSE,与你的服务端实时数据同步。有一件事情需要注意Wilddog 存储中并没有数组,因为数组是无法通过RESTFul接口来直接访问的,Wilddog数据库设计的原则之一就是所有的数据都能通过RESTFul接口直接访问。那么数组的需求如何处理?

其实非常简单,用对象来代替!

{ 0:"first child", 1:"second child", 2:"3rd child", ... }

通过RESTFul的HTTP协议,你的服务端可以方便的对数据做修改和查询,十分方便。Wilddog还支持另外一种基于HTTP实时协议--SSE。你的服务端可以订阅一部分数据,这部分数据的所有变化都通过SSE推送给你。

到此为止,这个架构中的所有数据都可以打通了,剩下的都是用户认证与权限的打通了。

基于JWT的认证机制和基于表达式的授权机制

Wilddog可以方便的集成到已有的系统中,不只因为其支持RESTFul的数据访问和SSE。其权限机制的集成更加简单。

不论RESTful或SDK的数据同步都是自由的,用户可以自由的访问任何数据。然而在实际中,自由访问所有的数据显然是不允许的。Wilddog的权限控制分两部分,第一部分是用户认证,也就是用户登录。

先说Wilddog的用户认证,用户认证的目标是给一个正在访问的客户端一个身份,并且要保证这个身份可信。针对不同的场景,Wilddog提供这些认证方式。

  • Email,密码登录

  • 微博微信等第三方OAuth登录

  • 匿名登录

  • 第三方帐号登录

今天的主题是在一个已有的系统中加入Wilddog。我们默认这个已有的系统已经存在用户系统了,开发者一定希望使用已有系统中的用户ID来访问Wilddog的数据库。那么可以使用第三方账号登录。

Wilddog的第三方账号登录的方式本质是JWT。这种方式的优点是Wilddog和已有的服务端可以互不访问就建立信任关系。先科普一下JWT的原理:

作者:jackxy

来源:http://blog.jackxy.com/wilddogshi-shi-yao-gui/

推荐阅读↓

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除


路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部