Solid Project:重新定义 Web?

版权声明:所有博客文章除特殊声明外均为原创,允许转载,但要求注明出处。

介绍

Solid Logo

Tim Berners-Lee, Web 的奠基人,由于不满互联网日益被少数大公司所垄断的现实,目前致力于开发一个名为 Solid 的新项目,希望能把管理数据和应用的权力重新归还到用户手中。这个消息估计不少人已经听说过了。基于 Web 的开放思想,Solid 项目也一直是在公开与开源的指导原则下进行的,但直到最近,该项目才逐渐从构想转到实现,我们也终于有具体的细节信息可以一探该项目的究竟。

当然,Tim 的大名应该是大多数人关注该项目的主要原因,不过我们也应该明白其产生的客观背景。按照 Tim 原本的设想,网络本应是开放互联的系统,但现实是整个网络的话语权日益掌握在少数几个科技巨头的手中,而它们几乎都在全力营造自己的封闭式系统,力图把用户圈养在自己的领地内。最近发生的一些事情,比如 谷歌现允许用户关掉有争议的Chrome关联登陆功能,说明即便是表面上态度开放的厂商,对这个问题的私心仍然是难以掩盖的。并且,这个时代厂商的一个突出特点是,它们可以不在乎直接的金钱利益(绝大多数互联网产品都是免费的),然而它们对于用户数据的贪婪是前所未见的。可以说,Solid 项目的主要目的就是为了对抗上述现实。

对于 Tim 本人、他所构建的惠及全世界的 Web 系统,以及 Solid 项目所怀有的远大抱负,我抱着尊敬的态度。但对于该项目的前景,我个人并不是很乐观。即便如此,我仍然感到好奇:Tim 和他的小伙伴们打算以怎样的手段去冲击巨头们构建起来的、看起来靠不可破的商业帝国。

Solid 项目的主页位于 这里。你可以从主页上了解该项目的各种细节,包括开发目的、基本思想、技术细节和未来蓝图等各方面的信息。这里,我尝试从自己的角度简单解读该项目,同时推荐对该项目感兴趣、并且对自己英文水平有信心的朋友直接阅读官方资料。

Solid 这个名字代表什么含义?

Solid 是“社交链接数据”(social linked data)的简写。其中,Linked Data 代表了 Tim 本人一贯的立场,即 Web 应该由开放的、互相链接的信息所构成;相比之下,互联网巨头通常倾向于建立基于自身商业模式的封闭式系统。

Social 则表明了该平台的应用场景,主要面向个体用户。从官方描述看,Solid 目前主要考虑的是典型的社交应用类型,例如通信录、邮件、即时通信、博客等,但 Solid 更大的理想是链接用户所希望使用的所有数据,包括各种关系或非关系数据库、文件系统、IoT 数据、Web 的超媒体信息,甚至区块链等。

Social 的定位也意味着 Solid 项目是以用户个体为出发点思考的。个人推想,这种模式经过简单扩展也应该可以适用于家庭或松散的小型组织,但对于严格的商业组织可能并不适用————因为商业团体有完全不同的组织模式和行为。换句话说,Solid 可能对于 ToC 类型的应用有较大的影响和参考价值,但和 ToB 应用或许没有多大直接关系,至少目前如此。(这是我的个人理解,未见得正确,仅供参考)

Solid 的核心原则

Solid principles

Solid 在官网上描述了其核心指导思想,主要包括:

  • 数据所有权 将数据从应用中分离,用户对于数据的存储和访问有完全的控制权。
  • 模块化设计 数据和应用的解耦同时也意味着,只要遵循相同的协议,用户可以在不同的应用中选择,从而拥有更大的自主权。
  • 数据复用 用户可以在数据不变的条件下升级应用,也可以在多个应用之间共享数据。

很容易理解,上述三大原则归结起来其实就是一句话:数据和应用解耦。这一点对于有经验的程序员来说听起来似乎平淡无奇:在典型的多层应用中,数据层和业务层不是本来就应该解耦的吗?但从更高的层面来看,并不是。因为这种解耦只是存在于软件层面的、对于开发者的一个并不严格的约束,厂商拥有对整个软件栈的全部控制权;而用户虽然是数据的实际生产者,但他们对自己的数据却并没有真正的控制权:除了厂商规定的 UI 界面以外,用户什么也不能做。这也是为何厂商能够随心所欲地使用 Lock-in 策略,而用户却无可奈何,因为失去了对自己数据的控制权,他们在面对厂商时几乎没有议价的空间。

我之前曾经总结过,在软件架构的历史上曾经发生过与人类“社会大分工”非常相似的场景。第一次大分工的主要标志是数据库从单体程序分离出来,形成独立的层次,其历史背景是 C/S 模式的客观要求和关系数据库理论的成熟;第二次大分工则发生在近几年,主要表现是前端从服务端的附庸脱离出来,同样形成独立的层次,背景则是移动端和 Web 分庭抗礼,且关于前端的理论和技术也在不断进化。

我一直下意思地认为,当历史发展到第二次社会化大分工阶段时,第一次分工早已结束,没有什么再可说的了。但当我看到 Solid 项目的时候,我才意识到数据与应用的分离这一阶段或许尚未彻底完成,仍然有进化的空间。Solid 项目,尽管前景并不明朗,至少给我们昭示了这种变化的可能性。

Roadmap

我注意到,Solid 官网在介绍项目进程时提到两个尚未面世、但已经在筹划中的重量级项目:应用注册库 (Application Registry) 和提供商注册库 (Provider Registry)。虽然没有进一步的细节,但是从名字上不难猜到,这是一个相当宏大的计划,可能发展为类似于 AppStore 和 Google Play 的应用商店。

但客观的说,对于这个计划,我是不太乐观的。一方面,如果真的要以这样应用市场为方向的话,恐怕需要像 AppStore 或 Google Play 那样,投入大量资源来审核应用的可靠性和安全,作为非营利的组织(尽管也有商业性的初创公司支持),有足够的财力物力吗?毕竟,连 npmapt 这样纯粹的技术仓库都有黑客试图渗透了;另一方面,发展应用市场将把自己推到和商业组织“抢客户”的第一战场,对方对这样的威胁绝对不会放任不管,势必会有严厉的反制手段,以此为目标是否明智?

当然,在没有任何明确信息的时候,说这些或许有点杞人忧天了。其实这个项目对国人来说恐怕有更麻烦的大问题,知者知之,这里就不明说了。

子项目

Solid 的定位是建立在开放数据协议基础上的一整套平台。基于其开放项目的事实,除了官网外,其他资料包括代码、协议、文档、教程等大部分都托管在 Github 上,又划分为多个子项目。这里对各个项目作一个大致的介绍,读者在了解各个库的基础上,可以在按照个人兴趣,在浏览时有所侧重。其中个人认为特别值得关注的主要是核心库(Solid)和服务器库(Solid Server)。

Solid

Solid 开源地址

Solid 主项目看起来似乎没有多少内容,但还是值得仔细研究的。其中 README 堪称整个系统的总纲,无论如何都应该认真浏览一遍。而 diagrams/solid-architecture.svg 则是整个系统的总架构图,也非常重要,所以我把它列在下面。

此外,还有一个 proposals 目录,下面主要是一些指导性的技术纲要文件,技术含量还是相当高的。但从文章的修改痕迹会发现,该目录的结构还在持续变动,有些或许会在未来搬移到其他仓库,阅读时请加以注意。

架构

Solid Architecture

这个图略显粗糙,但核心观点是很容易把握的。图中明显分为三个板块:

  • 下方区域是 Solid 系统希望支持的、来自多种不同来源的异构数据,包括数据库、文件、其他 Web 系统、社交数据、IoT 设备等。可以看到,Solid 的设计者还希望支持区块链等应用,但这只是远景了。按照 Solid 项目的设想,数据和应用是分离的,完全可能既不在同一机器上、也不属于同一个组织,所以必须以 ACL 等机制来作安全防护。
  • 中间则是 Solid 的核心部分,主要是各种访问协议。有趣的是,从图中来看,Solid 设想了两种回话场景:客户——服务器以及客户——客户。我大概浏览了文档,没有找到对这部分的详细说明。按我个人的理解,在这样的架构下,数据来源是服务器,而各种应用则是客户,那么应用可以访问数据,且应用之间也可以彼此通信,这个应该还是很好理解的。(但数据源之间完全不能通信吗?我对此有一点小小的怀疑)
  • 上方是各种形式的应用;其中,白色部分为比较知名的业界应用和框架,包括 ngreact 等,其他大部分都是 Solid 自行开发的。当然这些是参考案例,Solid 项目肯定希望有越来越多的第三方应用以同样的方式接入这个系统。其中特别显眼的是左半部分的 data-browser,有一个相当深的架构层次。这是因为Data Browser 是 Solid Server 中一个相当大而复杂的组件,相应的调用关系也比较多。我们可以在后面的 Server 部分看到它的入口,遗憾的是这个组件完成度不高,目前还看不到多少实际的内容,相信今后会逐步完善的。

Solid Server

Solid Server 开源地址

Solid server 是一个基于 Node.js 开发的 Web Server,也是整个 Solid 体系中最重要的项目(目前来说)。作为一个样板工程,它展示了如何以 Solid 的设计思想来实现一个现实的 Web 应用。

接下来简单讲述如何在开发环境下启动并运行 Solid Server 的基本步骤。更完整的说明请参考上面链接中的 README 内容。

Solid Server 启动

首选需要说明:出于安全性考虑,Solid Server 在默认情况下必须使用正式的 SSL 证书,不接受自签名的测试证书,这样给测试造成了一定困难。为方便测试,我们首先保证系统已经安装了 4.x 以上的 Node.js,然后以本地模式安装 Solid Server:

npm install solid-server

然后,用系统命令生成测试证书:

openssl genrsa 2048 > ../localhost.key
openssl req -new -x509 -nodes -sha256 -days 3650 -key ../localhost.key -subj '/CN=*.localhost' > ../localhost.cert

为使用测试证书运行服务,我们不能直接使用 solid 命令,而需要使用测试命令。在正式环境中,只要将 solid-test 命令替换为 solid 即可。本质上说,solid-test 其实就是开启了禁用 SSL 证书选项的 solid。(我不太明白为什么不用 solid 加一个命令行开关的方式来实现,不过也没关系)

./node_modules/solid-server/bin/solid-test init .

solid / solid-test 命令行程序会向你询问一些选项,一般直接按回车即可。当提问证书目录时,输入上面生成的证书路径。初始化完毕后,你可以用如下命令启动服务:

./node_modules/solid-server/bin/solid-test start

Solid Server 默认使用端口 8443。程序启动后,你可以打开浏览器并访问 https://localhost:8443 (浏览器应该会提示你接受测试证书),浏览器会显示登录或注册的信息:

Solid Server guest screen

随便注册一个用户并登陆到系统。

Solid Server home screen

你会看到 Solid Server 的主要功能。目前,Solid Server 的功能还是比较简单的。页面上自动包含个人信息(Profile)和邮箱(Inbox),而 Public Folder 和 Apps 则允许你添加其他符合 Solid 协议的数据及应用。你可以进入更复杂的 Public Folder 自己尝试一下,不过部分内容还不够完善,有些地方点击几下就会出现异常。

从技术上讲,Solid Server 使用的是比较“传统”的 Express 框架,在本地运行了一个基本的数据引擎。由于时间关系,我没有深入研究 Solid Server 是如何实现数据/应用分离的。不过大致浏览可以感受到,各种通信协议的处理在整个代码中占了相当大的比例,因此阅读起来会有一定的难度,前端的勇士来不妨尝试一下。

Solid Specs

Solid Specs 开源地址

从名字和描述看,该项目应该是用来集中存放各种规范和架构文档。其中的内容涉及认证(WebID)、授权(Web Access Control)、协议(REST/WebSocket API)、社交机制、服务器/客户端的参考实现等。同时,也描述了各种机制背后的思考和设计选择。和其他项目类似,部分章节还比较简略,各种细节在持续完善中。

Solid Turtorial

Solid Turtorial Intro 开源地址

很明显这是作为一个指导用户入门的教程。不过说实话,Solid 的内容哪怕入门恐怕也需要一本小书才能说得清楚,目前这个教程还不能作为真正的入门指导。等待继续完善吧。

RdfLib.js

Rdflib.js 开源地址

这是 Solid 通信协议的 JavsScript 实现,也是其他项目包括 Solid Server 在内都要依赖的一个比比较底层的库。Solid 协议集合了 RDF/Turtle/N3/SPARQL 等,从技术上讲是比较复杂的,该库提供了一个相对简单的接口。

有趣的是,RdfLib 和下面的 Mashlib 实际上并不是 Solid 的子项目,而是隶属于另一个 LinkedData 组织。LinkedData 和 Solid 都来自于 MIT,且 Tim 也是 LinkedData 的主要贡献者之一,可以认为它们是姐妹关系。

Mashlib

Mashlib 开源地址

Mashlib 项目的重要目的是在浏览器中实现数据混搭(Data Mashup)。在 Solid 系统中,它的主要目的是服务于 Data Browser。

Solid UI

从介绍来看,主要是一些和 Mashup 相类似的、基于开放协议的前端组件,可以将 Solid 平台的功能嵌入在 HTML 页面中,并提供可访问的编程接口。

由于它们并非直接可执行的程序,所以我并未加以尝试。从架构上看,Solid Server 中的 Data Browser 部分大量使用了它们,但由于程序尚不完善的关系,目前无法得到直观的运行感受。

Plume

Plume 开源地址

Solid 的作为原型验证项目之一的博客平台,但它也不是 Solid 的官方项目,而是一位名为 Andrei 的作者的个人项目。从个人介绍看,Andrei 曾经在 MIT 过,估计和官方的联系比较紧密。

作为博客平台,这是个类似 SasS 性质的项目,直接面向最终用户。本来我很有兴趣把它搭建起来,但仔细一看觉得很诧异:项目主页上除了简单的配置说明外,连个像样的 INSTALL 都没有,项目下甚至找不到 packages.json,最后一次更新还是在两年前。再仔细看,整个程序的主体都在一个巨大的 app.js 中(1500行以上),更不知所云的是文件开头还标了一行 /* ---- DON'T EDIT BELOW ---- */,作者这是想干嘛?说实话,这个项目看得我直摇头。真心希望 Solid 推荐靠谱一点的项目啊。

Solid 还包括很多其他原型项目,但基本上和 Plume 类似,完成度都不高,很多还没有公布。已收录的应用列表可以参考 Solid Apps 页面。

结语

从上面的介绍想必大家也感受到了,Solid 项目目前还处于比较早期的阶段。总体来说,该项目的整体构想已经基本稳定,接下来需要作的就是完善各种实现细节和相关的技术文档。如果从存粹技术的角度看,Solid 目前构建的应用并没有太多出彩之处,但其精华在于通过 Solid 通信协议,实现数据与应用的彻底解耦。在此基础上,数据和应用都必须重新思考自己的定位。这种便会对系统架构带来怎样的影响,目前还看不清楚,但是我乐于看到 Solid 项目在这方面做出自己的探索。