REST简介
REST是Representational State Transfer (在表示层上的状态传输)的缩写。REST是一种WEB应用的风格。其有6个重要的架构约束,满足这些约束将会带来一些优势。遵循REST风格可以使开发的接口通用,便于调用者理解接口的作用。
REST架构约束
一、客户-服务器(Client-Server)
参考CS模型
客户端与服务器不会相互依赖,只要接口不被改变,客户端与服务器可以独立开发或被替换,提高了用户界面跨平台的可能性。 通信只能由客户端单方面发起,表现为请求-响应模式。二、无状态(stateless)
参考无状态协议
要求服务端维护资源状态,如文件状态;客户端维护会话状态,如当前页面是第几页。 从客户端发出的每个请求都包含服务器所必要的信息,服务器处理请求后返回会话状态给客户端。使所有客户端 - 服务器交互无状态。服务器不会存储有关最新HTTP请求客户端的任何内容。它会将每个请求视为新的。 如用户登录后还需要其他的授权操作,客户端发出的请求将会包括服务端所需的信息:身份信息,授权详细信息。 在大量客户端访问的情况下,服务端压力过大需要增加服务端,如若服务端保存会话状态,在这种情况下服务器之间是需要同步会话状态。而以客户端保存会话状态的话,服务器之间就很容易做到横向扩展。三、缓存(cache)
参考网页缓存
缓寸在某些时候应用于资源,资源需要声明自己是否可以缓存,缓存可以在客户端或服务端实现。 如浏览器缓存css文件,cdn缓存某张图片。 缓存为客户端带来性能改进,并为服务器提供更好的可扩展性范围,因为负载减少。四、统一接口(uniform interface)
统一的接口包含三个方面:资源标识符语法,数据传输使用的协议,传输数据的类型
1、资源标识符语法
由于需要暴露资源给使用者,为此需要为资源决定API接口,单个资源不应该太大,通过url标识资源对象。
2、数据传输使用的协议
用GET、POST、PUT等http方法表示操作的动作。
用200,500等状态码表示操作的结果。3、传输数据的类型
接口信息中包含了如何处理信息本身的信息。http头中使用Content-Type指定数据类型。
五、分层系统(layered system)
参考分层系统
在客户端-服务器的基础上,可以添加中间件,如负载均衡设备(F5, Nginx, LVS),缓存组件(Redis, memcache),消息队列(kafka, rabbitmq)。六、按需代码(code-on-demand,可选)
参考客户端脚本
服务端可以通过传递可执行代码为客户端临时的扩展或自定义功能。允许客户端的逻辑独立于服务端更新。浏览器上可以执行javascript等脚本语言,如果每次都与服务器进行交互,性能消耗就很大。
REST架构问题
在遵循REST风格约束时带来了许多优点,但同时也带来了一些问题。
REST风格应用了面向资源的编程思想,在处理简单的CRUD上较为适合,但是在复杂的业务场景下(如恢复删除),需要自定义方法(如在本来的接口后加入 :undelete ),在处理复杂的业务逻辑时,使用面向过程、面向对象的编程更具优势。 REST与HTTP绑定在一起,因此不适合应用在要求高性能传输的场景下,且HTTP明文传输带来安全性问题。 缓存机制也使得客户端存储了旧数据,服务器不能主动通知客户端更新,需要客户端不断向服务端发送请求,会导致浪费带宽,且不具备时效性。