写点什么

理解 REST 软件架构

2007 年 5 月 27 日

一种思维方式影响了软件行业的发展。REST 软件架构是当今世界上最成功的互联网的超媒体分布式系统。它让人们真正理解我们的网络协议 HTTP 本来面貌。它正在成为网络服务的主流技术,同时也正在改变互联网的网络软件开发的全新思维方式。AJAX 技术和 Rails 框架把 REST 软件架构思想真正地在实际中很好表现出来。今天微软也已经应用 REST 并且提出把我们现有的网络变成为一个语义网,这种网络将会使得搜索更加智能化。

REST 与 HTTP 协议

REST 软件架构是由 Roy Thomas Fielding 博士在 2000 年首次提出的。他为我们描绘了开发基于互联网的网络软件的蓝图。REST 软件架构是一个抽象的概念,是一种为了实现这一互联网的超媒体分布式系统的行动指南。利用任何的技术都可以实现这种理念。而实现这一软件架构最著名的就是 HTTP 协议。通常我们把 REST 也写作为 REST/HTTP,在实际中往往把 REST 理解为基于 HTTP 的 REST 软件架构,或者更进一步把 REST 和 HTTP 看作为等同的概念。

今天,HTTP 是互联网上应用最广泛的计算机协议。HTTP 不是一个简单的运载数据的协议,而是一个具有丰富内涵的网络软件的协议。它不仅仅能够对于互联网资源进行唯一定位,而且还能告诉我们对于该资源进行怎样运作。这也是 REST 软件架构当中最重要的两个理念。而 REST 软件架构理念是真正理解 HTTP 协议而形成的。有了 REST 软件架构理念出现,才使得软件业避免了对 HTTP 协议的片面理解。只有正确的理论指导,才能避免在软件开发的实际工作过程中少走弯路。

REST 与 URI(资源定位)

REST 软件架构之所以是一个超媒体系统,是因为它可以把网络上所有资源进行唯一的定位,不管你的文件是图片、文件 Word 还是视频文件,也不管你的文件是 txt 文件格式、xml 文件格式还是其它文本文件格式。它利用支持 HTTP 的 TCP/IP 协议来确定互联网上的资源。

REST 与 CRUD 原则

REST 软件架构遵循了 CRUD 原则,该原则告诉我们对于资源(包括网络资源)只需要四种行为:创建(Create)、获取(Read)、更新(Update)和销毁(DELETE)就可以完成对其操作和处理了。其实世界万物都是遵循这一规律:生、变、见、灭。所以计算机世界也不例外。这个原则是源自于我们对于数据库表的数据操作:insert(生)、select(见)、update(变)和 delete(灭),所以有时候 CRUD 也写作为 RUDI,其中的 I 就是 insert。这四个操作是一种原子操作,即一种无法再分的操作,通过它们可以构造复杂的操作过程,正如数学上四则运算是数字的最基本的运算一样。

REST 与网络服务

尽管在 Java 语言世界中网络服务目前是以 SOAP 技术为主,但是 REST 将是是网络服务的另一选择,并且是真正意义上的网络服务。基于 REST 思想的网络服务不久的将来也会成为是网络服务的主流技术。REST 不仅仅把 HTTP 作为自己的数据运输协议,而且也作为直接进行数据处理的工具。而当前的网络服务技术都需要使用其它手段来完成数据处理工作,它们完全独立于 HTTP 协议来进行的,这样增加了大量的复杂软件架构设计工作。REST 的思想充分利用了现有的 HTTP 技术的网络能力。在德国电视台上曾经出现过一个这样的五十万欧元智力题:如何实现网络服务才能充分利用现有的 HTTP 协议?该问题给出了四个答案:去问微软;WSDL2.0/SOAP1.2;WS-Transfer;根本没有。这个问题告诉我们 HTTP 并不是一个简单的数据传来传去的协议,而是一个聪明的会表现自己的协议,这也许是 REST = Representational State Transfer 的真正含义。

实际上目前很多大公司已经采用了 REST 技术作为网络服务,如 Google、Amazon 等。在 Java 语言中重要的两个以 SOAP 技术开始的网络服务框架 XFire 和 Axis 也把 REST 作为自己的另一种选择。它们的新的项目分别是 Apache CXF Axis2 。Java 语言也制定关于 REST 网络服务规范:JAX-RS: Java API for RESTful Web Services (JSR 311)。相信还会出现更多与 REST 相关的激动人心的信息。

REST 与 AJAX 技术

尽管 AJAX 技术的出现才不到两年时间,但是 AJAX 技术遵循了 REST 的一些重要原则。AJAX 技术充分利用了 HTTP 来获取网络资源并且实现了 HTTP 没有的对于异步数据进行传输的功能。AJAX 技术还使得软件更好地实现分布性功能,在一个企业内只要一个人下载了 AJAX 引擎,其它企业内部的人员,就可以共享该资源了。AJAX 技术遵守 REST 准则的应用程序中简单和可伸缩的架构,凡是采用 AJAX 技术的页面简洁而又丰富,一个页面表现了丰富多彩的形态。

AJAX 技术还使用了一种不同于 XML 格式的 JSON 文件格式,这个意义在哪里呢?在 REST 软件架构下我们不能对于 XML 文件进行序列化处理,这样程序员必须要使用自己的 XML 绑定框架。而以序列化的 JavaScript 对象为基础的 JSON 已经获得了广泛认可,它被认为能以远比 XML 更好的方式来序列化和传输简单数据结构,而且它更简洁。这对 REST 是一个极大贡献和补充。

当前的网络应用软件还违背了 REST 的“无状态服务器”约束。REST 服务器只知道自己的状态。REST 不关心客户端的状态,客户端的状态自己来管理,这是 AJAX 技术的应用之地。通过 AJAX 技术,可以发挥有状态网络客户机的优势。而 REST 的服务器关心的是从所有网络客户端发送到服务器操作的顺序。这样使得互联网这样一个巨大的网络得到有序的管理。

REST 与 Rails 框架

Ruby on Rails 框架(简称 Rails 或者 Rails 框架)是一个基于 Ruby 语言的越来越流行的网络应用软件开发框架。它提供了关于 REST 最好的支持,也是当今应用 REST 最成功的一个软件开发框架。Rails 框架(从版本 1.2.x 起)成为了第一个引入 REST 作为核心思想的主流网络软件开发框架。在 Rails 框架的充分利用了 REST 软件架构之后,人们更加坚信 REST 的重要性和必要性。Rails 利用 REST 软件架构思想对网络服务也提供了一流的支持。从最直观的角度看待 REST,它是网络服务最理想的手段,但是 Rails 框架把 REST 带到了网络应用软件开发框架。这是一次飞跃,让 REST 的思想从网络服务的应用提升到了网络应用软件开发。利用 REST 思想的 simply_restful 插件已经成为了 Rails 框架的核心内容。

REST 安全性

我们把现有基于 SOAP 的网络服务和基于 REST/HTTP 网络服务作个比喻,前者是一种传统的寄信方式,而后者是现代网络的电子邮件方式。要是是寄信和电子邮件都有病毒存在的话,传统的寄信被送到对方就很危险,而电子邮件是开发的,电子邮件供应商比如 Google 为我们检查了电子邮件是否有病毒。这里并不是说明 SOAP 网络服务消息包含义病毒,而是说明 HTTP 是无法处理 SOAP 信息包究竟好不好,需要额外的软件工具解决这一问题,包括防火墙也用不上和管不了。

REST/HTTP 网络服务的信息包可以被防火墙理解和控制。你可以按照操作和链接进行过滤信息包,如你可以规定从外部来的只能读取(GET 操作)自己服务器的资源。这样对于系统管理员而言使得软件管理更为简单。REST 的安全性还可以利用传输安全协议 SSL/TLS、基本和摘要式认证(Basic und Digest Authentication)。除了这些 REST 自身的安全性功能外,还可以利用像基于信息的 Web Services Security(JSR 155)作为 REST 不错的补充。

参考文献

中文参考文献- http://www.ibm.com/developerworks/cn/web/wa-ajaxarch/

Roy Thomas Fielding 博士论文中文版本- http://e2c.91yee.com/columns/

Roy Thomas Fielding 博士论文英文版本- http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm


作者简介:骆古道,网名 Cnruby,八十年代初毕业于西北工业大学数理力学系,1988 年公派留学德国,从事组合最优化理论研究,从九十年代初期起一直致力于计算机领域软件开发、设计和管理等方面工作,个人博客为“道喜技术日记”。

2007 年 5 月 27 日 20:1828485

评论

发布
暂无评论
发现更多内容

SpringCloud从入门到精通01---父项目创建

Felix

SpringCloud Eureka 高可用架构

技术实录 | 灵雀云基于 OVN 的 Kubernetes 网络架构解析

York

灵雀云 Kubernetes k8s Kube-OVN

灵雀云Kube-OVN:基于OVN的开源Kubernetes网络实践

York

灵雀云 Kubernetes k8s Kube-OVN

再谈自研开源Kube-OVN, 设计思路及实现原理

York

灵雀云 Kubernetes k8s Kube-OVN

Kube-OVN v 0.7.0 发布,IPAM、子网和安全功能增强

York

灵雀云 Kubernetes k8s Kube-OVN

容器网络方案调研:都是网络插件,Kube-OVN凭啥脱颖而出?

York

灵雀云 Kubernetes k8s Kube-OVN

新思科技网络安全研究中心发现Bouncy Castle中的漏洞

InfoQ_434670063458

新思科技 Bouncy Castle

腾讯大佬亲自总结出“Java知识地图+学习路线”从点到面一应俱全!不看血亏

比伯

Java 编程 架构 程序人生 计算机

一份阿里Java学习路线出现“病毒式”传播,导致44人秋招同时拿到offer

Java架构师迁哥

大作业一:架构设计方案评审

Nick~毓

Kube-OVN再更新! v0.8.0 支持网关高可用以及网络监控集成

York

灵雀云 Kubernetes k8s Kube-OVN

同城快递系统-大作业

三板斧

极客时间架构师一期

中国特色新基建可视化,工程监控画面还能这么美?你绝对没见过

一只数据鲸鱼

物联网 新基建 数据可视化 绿色工业

《序》勇敢面对挑战,坦然面对失败

山下青城

人生修炼 七日更 28天写作 创业失败启示录 青城

Java中定时器Timer致命缺点(附学习方法)

叫练

定时任务 高效学习 多线程 定时器 技术学习

灵雀云开源项目 Kube-OVN 亮相开源基础设施峰会

York

灵雀云 Kubernetes k8s Kube-OVN

一个20年技术老兵的 2020 年度技术总结

Kevin Wan

go 微服务 微服务治理 go-zero 微服务框架

Yarn RM写ZNode超数据量限制bug修复

笨小康

大数据 zookeeper YARN

Kube-OVN 0.6.0 发布,支持 IPv6、流量镜像及更多功能

York

灵雀云 Kubernetes k8s Kube-OVN

Python进阶系列文章汇总

Kaito

Python 爬虫

教小师妹快速入门Maven,嘿嘿嘿...

田维常

maven

Kube-OVN 0.5.0 发布,支持 NetworkPolicy、用户自定义网卡和MTU

York

灵雀云 Kubernetes k8s Kube-OVN

软件界旷世之架:测试驱动开发(TDD)之争

华为云开发者社区

软件 测试 TDD 代码 devcloud

SpringCloud从入门到精通02---支付模块01

Felix

“持证”就能上岗 京东绿色内推招聘通道开启

京东智联云开发者

云计算 大数据 程序人生

架构师训练营技术知识点

三板斧

架构师训练营第 1 期

Kube-OVN v0.9.0更新,网络可视化和控制平面稳定性提升

York

灵雀云 Kubernetes k8s Kube-OVN

代码整洁之道

田维常

代码

OVS 设计与实现阅读笔记,五年前的这篇论文里这些问题已经明了

York

Kubernetes k8s Kube-OVN

价值 - 价值的底色(一)

石云升

读书笔记 投资 28天写作 价值

软件测试--缺陷报告

测试人生路

软件测试

InfoQ 极客传媒开发者生态共创计划线上发布会

InfoQ 极客传媒开发者生态共创计划线上发布会

理解REST软件架构-InfoQ