了解REST架构是如何从WEB五种架构推演而来的,以及在推演过程中放弃了什么,选择了什么
网络架构属性
性能
网络性能 Network Performance
- Through 吞吐量:小于等于带宽bandwidth
- Overhead 开销:首次开销、每次开销
用户感知到的性能 User-perceived Performance
- Latency 延迟:发起请求到接收到响应的时间
- Completion 完成时间:完成一个应用动作所花费的时间
网络效率 network Efficiency
- 重用缓存
- 减少交互次数
- 数据传输举例更近
- COD
可修改性
可进化性 Evolvability
一个组件独立升级而不影响其他组件
可扩展性 Extensibility
向系统添加功能,而不会影响到系统的其他部分
可定制性 Customizability
临时性、定制性地更改某一要素来提供服务,不对常规客户产生影响
可配置性 Configurability
应用部署后可通过修改配置提供新的功能
可重用性 Reusability
组件可以不做修改在其他应用再使用
五类架构风格推导出HTTP的REST架构
数据流风格 Data-flow Styles
优点:简单、可进化、可扩展、可配置、可重用
管道与过滤器 Pipe And Filter(PF)
- 每一个Filter都有输入端和输出端,只能从输入端读取数据,处理后再从输出端产生数据
统一接口的管道与过滤器 Uniform Pipe And Filter(UPF)
- 在PE上增加统一接口的约束,所有的Filter过滤器必须具备同样的接口
复制风格 Replication Styles
优点:用户可察觉性、可伸缩、网络效率、可靠性
复制仓库 Replicated Respository(RR)
- 多个进程提供相同服务,通过反向代理对外提供集中服务
缓存($)
- RR的变体,通过复制请求的结果,为后续请求复用
分层风格 Hierarchical Styles
优点:简单、可进化、可伸缩
客户端服务器 Client-Server(CS)
- 用Client触发请求,Server监听到请求后产生响应,Client一直等待收到响应后会话才结束
- 分离关注点,隐蔽细节,简单并且具有有良好的可伸缩性、可进化性、
分层服务 Layered System(LS)
- 每一层为其上一层服务,并使用在其下一层所提供的服务,同时还为下一层提供的服务隐藏细节,例如TCP/IP
分层客户端服务器 Layered Client-Server(LCS)
- LS+CS 例如正向代理和反向代理,从空间上分为外部层和内部层
无状态 客户端服务器 Client-Stateless-Server(CSS)
- 基于CS,服务器上不允许有session state会话状态
- 提升了可见性、可伸缩性、可靠性,但重复数据可能会导致降低网络性能
缓存 无状态 客户端服务器 Client-Cache-Stateless-Server(C$SS)
- 提升性能
分层 缓存 无状态 客户端服务器 Layered-Client-Cache-Stateless-Server(LC$SS)
分层架构中没有使用的两类分层风格
远程会话 Remote Session(RS)
- CS变体,服务器保存Application State应用状态
- 可伸缩性、可见性差
远程数据访问 Remote Data Access(RDA)
- CS变体,Application State应用状态同时分布在客户端与服务器
- 巨大的数据集有可能通过迭代而减少
- 简单性、可伸缩性较差
移动代码风格 Mobile Code Styles
代码与执行过程或执行结果分离,如JavaScript
优点:可移植、可扩展、网络效率
虚拟机 Virtual Machine(VM)
- 指令与实现
远程求值 Remote Evaluation(REV)
- 基于CS的VM,将代码发送至服务器执行
按需代码 Code on Demand(COD)- 服务器在响应中发回处理代码,在客户端执行
- 优秀的可扩展性和可配置性,提升用户可察觉性能和网络效率
分层、按需代码、缓存、无状态、客户端服务器 Layered-Code-on-Demand-Client-Cache-Stateless-Server(LCODC$SS)
- LC$SS + COD
移动代理 Mobile Agent(MA)
- 相当于REV + CODE
点对点风格 Peer-to-Peer Styles
未REST架构中,但在分布式网络架构中经常使用
优点:可进化、可重用性、可扩展性、可配置性
Event-based Integration(EBI)
- 基于事件集成系统,如消息中间件,通过分发订阅来消除耦合
- 优秀的可重用性、可扩展性、可进化性
- 缺乏可理解性
- 由于消息广播等因素造成消息风暴,可扩展性差
Chiron-2(C2)
- 相当于EBI + LCS,可以控制消息的方向
Distributed Objects(DO)
- 组件结对交互
Brokered Distributed objects(BDO)
- 引入名字解析组件来简化DO,例如CORBA