说说Web Service中REST vs RPC 的联系和区别


   这两种个人理解是 RPC经常使用的soap ,REST经常使用的http(这俩名字太唬人)
php

摘要

Web Service 已经再也不新鲜, 而随后的 SOACloud Computing 也不断出现, 直到百度也 提出了本身的 框计算, 咱们尚且无论这些时髦的名词背后所蕴藏的实际的技术创新有多少, 可是他们终究是逃不出一点, 即 如何解决访问服务的问题, 而此处的服务一般不在本地而是在遥远的你不知道的美国或者印度.html

本文想阐述标题中提到的两种解决远程服务访问的方法,优缺点及其一些实际的建议等.前端

Contentspython

引入

咱们天天都在使用浏览器来上网冲浪, 在查找本身须要的资源, HTTP协议天然是咱们使用的最多的 一种, 咱们尽情地享受着这种信息高速路的快感,却没有试图去了解咱们是如何得到这些资源的? 它是一种什么样的设计理念?

咱们也偶尔会使用 Gtalk来和本身的同事或者朋友来聊天, 咱们在给朋友提供资源(信息)的同时 也获取着朋友的资源(信息), 咱们是否可曾想过, 这种交流背后又是一种什么过程呢?

在这互联网的时代,只要牵扯到得到非本地的资源, 都会面临一个问题:

如何访问服务呢?

让咱们先看看什么是 Web Service.

Web Service

Web Service 也提出了很久了, 那么究竟什么是 Web Service ?

简单地说, 也就是服务器如何向客户端提供服务.

经常使用的方法有:

  1. RPC 所谓的远程过程调用 (面向方法)

  2. SOA 所谓的面向服务的架构(面向消息)

  3. REST 所谓的 Representational state transfer (面向资源)

SOA 是前几年炒的很火的一个词, 不亚于当前的 Cloud Computing , 若是说 RPC 是基于方法调用(method),那么 SOA 则是基于 消息, 基于方法调用一般会与特定的程序语言 耦合起来,然后者则与具体的实现语言无关, 因此在必定程度上获得大公司的支持.

本文不会在 SOA 上着笔过多, 主要是由于笔者本人对这个没有多少研究, 怕误导读者. 另笔者最近对 RPC 和 REST 方式的原理和实现有一些研究, 因此本文会主要集中在 RPC 和REST.

RPC

RPC 即远程过程调用, 很简单的概念, 像调用本地服务(方法)同样调用服务器的服务(方法).一般的实现有 XML-RPC , JSON-RPC , 通讯方式基本相同, 所不一样的只是传输数据的格式.

(若是你已经习惯于XML繁重的尖括号,你不妨能够尝试下更加轻型,高效,传输效率高的 JSON.)

一个简单的通讯过程一般为:

Request

  member.get_username_by_id

Response

<?xml version="1.0"?><methodResponse>
  <params>
    <param>
        <value><string>Zhu Tao</string></value>
    </param>
  </params></methodResponse>

向服务器发送一个过程调用的方法及其参数, 获得服务器返回的方法执行的结果.

在 XML-RPC 以后又有了更增强大的 SOAP , 用于一些比较复杂的系统之上.

REST

终于咱们来看 REST 了, 呵呵, 这个是我目前比较喜欢的一个远程通讯方法(架构).

REST 不是一种协议,它是一种架构, 一种 Web Service 可以若是知足 REST 的几个条件, 一般就称这个系统是 Restful 的.

这里提到的条件包括:

  1. C/S结构 (这是Internet服务的一个基本特征)

  2. 无状态 (很熟悉吧,呵呵)

  3. 能够cache (想起了浏览器?)

  4. 分层系统 (想起了无数的架构?)

  5. 统一的接口 (若是这是可能的,程序员有福了, :D)

  6. code on demand(可选, 实际上是一种扩展性的要求)

看了这几个特征后,你想起了什么?

你可能会破口而出: HTTP. 我答: You got it!


HTTP是WWW的最核心的协议, 它将简单的分布于世界各个角落的资源都统一块儿来, 统一的地址, 简单的方法, 和必定数量的表达方式.(你可能对这三点描述很模糊,请go ahead).

REST 的三个要素是 惟一的资源标识简单的方法 (此处的方法是个抽象的概念), 必定的表达方式.

看下图:

图一. REST的三角架构(摘自 Restful User Experience )

 

REST 是以 资源 为中心, 名词即资源的地址, 动词即施加于名词上的一些有限操做, 表达是对各类资源形态的抽象.

以HTTP为例, 名词即为URI(统一资源标识), 动词包括POST, GET, PUT, DELETE等(还有其它不经常使用的2个,因此 整个动词集合是有限的), 资源的形态(如text, html, image, pdf等)

RPC与REST的区别

若是你想只记住一点,那么就请记住 RPC是以动词为中心的, REST是以名词为中心的, 此处的动词指的是一些方法, 名词是指资源.

你会发现,以动词为中心,意味着,当你要须要加入新功能时,你必需要添加更多的动词, 这时候服务器端须要实现相应的动词(方法), 客户端须要知道这个新的动词并进行调用.而以名词为中心, 假使我请求的是 hostname/friends/, 不管这个URI对应的服务怎么变化,客户端是无需 关注和更新的,而这种变化对客户端也是透明的.

至于其它的区别,如对实现语言的依赖, 耦合性等,这些都是上面提到的这个根本区别所衍生的.

让咱们回到引入部分的2个问题. 当你天天使用HTTP冲浪时,你都在使用 REST 与远程的服务器进行亲密接触. 当你使用Gtalk和同事朋友沟通时,你则是在享受着 RPC 的便利.

推荐阅读 Restful User Experience (这个slide是我的认为解释的最好的) 还有 ReST vs SOA(P).

如何选择?

一般若是咱们是客户端,咱们基本上是没有选择的权利的, 服务提供商一般只有一种架构的服务.例如facebook、人人网开放的API(使用的是 REST ).

可是假若咱们有幸设计和实现本身的 Web Service 咱们该如何选择呢?

根据笔者本身的经验和心得, 建议 可以使用REST就尽可能使用REST, 主要基于下面几个考虑:

  1. 扩展性

  2. 松耦合(意味着,不用强制要求客户端去更新相应的代码)

  3. 客户端实现语言无关

  4. 性能

  5. 安全性(例如HTTPS)

固然上述的几点也并不是 RPC 都不知足,不过相对而言, REST 更加清晰和简洁, 再辅以 JSON 相应的服务会在性能和稳定性(简单一般意味着robust)方面有很大的提升.

一个本身的项目例子

咱们公司正在作一个social game的项目, 我负责整个系统的后端架构和通讯等, 因此仔细地学习和研究了 facebook/人人网开放的API, 因为facebook(人人网彻底拷贝facebook)使用的是REST 的架构, 因此即便facebook自己是PHP开发的,这也不妨碍咱们使用python来开发, 还有更多的PHP, Java, .net, Perl等客户端API封装. (固然人人网是使用Java开发的,咱们也使用python).

因而在想,假若facebook的架构使用的不是 REST ,会有这样的灵活性吗? 若是使用的是 RPC 可能 目前咱们的日子不会好过, 甚至咱们的项目都不可能立项!

另外,由于咱们的前端使用的是flash, 与后端的python通讯采用的是 djangoamf , 有意思的是, 若是你了解 flash,你会知道AMF是一种二进制的flash数据交互协议, 而 它是基于RPC ! 固然这正如我上面说的, 某些架构不是咱们可以选择的, 因此使用 RPC 的结果是若是咱们想开放咱们游戏的API(假如咱们的游戏足够火, 有朋友想基于咱们的游戏开发周边应用),这就变得很艰难了.可是目前来看,咱们开放API的可能性不大.

结论

不管是基于 动词名词 或者 消息, 这些都是为咱们提供一个稳定,可靠,安全,易扩展的服务为目的的, 因此,若是你有机会为别的客户端提供开放API(若是大家公司是另外一个facebook, twitter),你不妨多考虑下基于 你的平台的开发者们, 别让他们的日子很差过啊(同是程序员,相煎何太急?呵呵).

原文:http://www.congci.com/item/299

相关文章
相关标签/搜索