Rest Notes-架构上的教训(论文部分完结)

摘要: 从现代Web架构和由REST识别出的问题中,可以总结出很多通用的架构上的教训

正文:

架构上的教训

基于网络的API的优势

将现代Web与其他中间件相区分的是它使用HTTP作为一个基于网络的API,其实并非一向如此,早期的Web设计利用了一个程序库(CERN的libwww)作为所有的客户端和服务器端软件所使用的的单个协议实现库。CERN libwww提供了一个基于库的API来建造可互操作的Web组件

HTTP不是RPC

人们常常错误地将HTTP称为一种远程调用(RPC)机制,仅仅是因为它也包括了请求和响应。

RPC是调用远程机器上的一个过程,在RPC协议中,调用方识别出过程并且传递一组固定的参数,然后等待在使用相同接口返回的一个消息中提供的回答。Java的RMI(远程方法调用)就很类似,差异仅仅是将过程标识为一个对象、方法的组合,而不是一个简单的服务过程。

当然,将HTTP与RPC区分开的并不是上面的语法和特性,其重要的区别是:HTTP是请求被定向到使用一个有标准语义的通用接口的资源,中间组件几乎完全相同的方式来解释这些语义,结果就是使得一个应用能够支持转换的分层和独立于信息来源的间接层,这对于一个满足互联网规模、多个组织、无法控制的可伸缩性需求的信息系统来说是非常有用的;RPC的机制是根据语言的API来定义的,而不是根据基于网络应用的需求来定义的

HTTP不是一种传输协议

HTTP并非被设计为一种传输协议,它是一种移交协议

Web各组件都能理解HTTP语义,从而可以独自的完成HTTP的响应,而不必一定到达最终的源服务器,这也是为什么它是移交不是传输协议的原因

媒体类型的设计

REST有一个对架构风格来说不同寻常的方面,那就是它对于Web架构中数据元素的定义影响程度

  • 应用状态 应用的开发者经常违背的就是应用状态和无状态交互架构约束。将应用状态放错地方而造成架构不匹配并不仅限于上篇文章提到的Cookie,还有HTML中引入的frame,在一个子窗口中选择链接而导致的状态迁移与正常的状态迁移是无法区分的 作者认为frame和cookie的失败之处在于,用户代理无法管理或解释它们所提供的间接应用状态。替代的设计是将这些信息放到一个主要的表述中,并且告知用户代理如何去管理这个存放了指定的资源领域的工作区
  • Java VS JavaScript 通过使用REST,我们能够知道为何一些媒体类型与其他类型相比在Web架构中得到了更加广泛的接受,甚至这些类型并未取得开发者偏爱的情况下(例如Java Applet对抗JavaScript) 作者认为JavaScript在Web上比Java更成功体现在可见的交互性影响较少、复杂性比较小、用户感知的延迟

总结

REST论文的阅读到此结束了,可以看出来REST主要是提供了一套指导原则,可以根据这些原则来识别架构中的缺陷,现代Web是REST架构风格的一个架构实例。在一个理想的世界里,软件系统的实现与它的设计有着精确的匹配,现代Web架构的一些功能确实完全符合它们在REST中的设计标准,例如通过URI标识资源,使用MediaTypes标识数据格式等

REST既贡献了现代Web软件架构背后的基础理论,也为我们上了重要的一课,展示了软件工程原则如何能够被系统地应用在一个真实的软件系统的设计与评估之中

接下来会去阅读网络协议与RestFul API最佳的设计等

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java社区

如何自学Python爬虫技术(文末有福利)

1685
来自专栏点滴积累

geotrellis使用(三十七)COG 基础介绍

前言 Geotrellis 已经迭代到了 2.0 版本(截止写作此文时为 2.0.0-SNAPSHOT 版),2.0 版多了很多新的特性,其中最重要的应该就是 ...

40414
来自专栏喔家ArchiSelf

解读六边形架构

追溯微服务架构的渊源,一般会涉及到六边形架构。追溯六边形架构的起源,要看始作俑者Alistair Cockburn的这篇文章 http://alistair.c...

1133
来自专栏Brian

Effective Debugging-高效调试

概述 最近在看《Effective Debugging》,作者(Diomidis Spinellis)将30多年的系统开发和调试的经验融入到书中,从策略、方法以...

3528
来自专栏编程一生

实现一个自己的搜索引擎的初始规划

1514
来自专栏喵了个咪的博客空间

Goalng软件包推荐

前言 哈喽大家好呀! 马上要迎来狗年了大家是不是已经怀着过年的心情了呢? 今天笔者给大家带来了一份礼物, Goalng的软件包推荐, 主要总结了一下在go语言中...

3744
来自专栏钱塘大数据

【干货】python玩转微信:微信好友统计信息全掌握

在过去的几个月中,由于在新生群中回答问题费时费力,同时又有许多重复而又有固定答案的回答,我受到一些知乎文章的启发,维护了一个基于itchat的群聊机器人。从刚开...

57212
来自专栏程序员宝库

后端好书阅读与推荐(续四)

这里依然记录一下每本书的亮点与自己读书心得和体会,分享并求拍砖。 Docker生产环境实践指南 Docker生产环境实践指南 (豆瓣:https://book....

4676
来自专栏用户2442861的专栏

分布式统一框架的设计与实现(数据库)

我们设计并开发了内容中心统一的分布式开发框架。我们把它取名为albian, albian是基于java的(故以下简称albianj)。他主要是面向海量数据处理...

2031
来自专栏cloudskyme

15个nosql数据库

1、MongoDB 介绍 MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。主要解决的是海量数据的访问效率问题,为WEB应用提供可扩展的高性能数...

3446

扫码关注云+社区