一、引入

我们每天都在使用浏览器来上网冲浪, 在查找自己需要的资源, 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

<?xml version="1.0"?> <methodCall> <methodName>member.get_username_by_id</methodName> <params> <param> <value><i4>1</i4></value> </param> </params> </methodCall> 

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

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

看下图:

图一. REST的三角架构

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)方面有很大的提高.

转载自:http://blog.chinaunix.net/uid-7374279-id-4612491.html

RPC协议与Web Service相关推荐

  1. RPC 和 Web Service 有什么区别?

    RPC vs Web Service 使用 SOAP 协议创建 Web Service 需要使用两个备选方案:文档型 SOAP 协议或者 RPC SOAP 消息协议.RPC 指的是远程过程调用,它是一 ...

  2. Web Service学习笔记

    Web Service概述 Web Service的定义 W3C组织对其的定义例如以下,它是一个软件系统,为了支持跨网络的机器间相互操作交互而设计.Web Service服务通常被定义为一组模块化的A ...

  3. 关于RPC协议的通俗理解

    根据网上搜索的一些资料摘抄汇总的,如果有误,欢迎斧正. 作者:肖继潮 链接:http://www.zhihu.com/question/25536695/answer/31046384 来源:知乎 著 ...

  4. Java开发Web Service的简介

    随着异构系统互联需求的不断增加,Web Service的重要性也日益彰显出来.凭借Web Service,我们可以实现基于不同程序语言开发的项目之间的互联互通,Web Service也是面向服务的架构 ...

  5. Linux网络服务-Web Service之【apache的功能、安装、配置文件介绍以及实验实例】(三)...

    上两张博文: < Linux网络服务-Web Service之[HTTP协议简介](一) > <Linux网络服务-Web Service之[Apache-Prefork.Worke ...

  6. JAVA Web Service Soap WSDL --CTO

    本文来自本人忘密码的博客:http://blog.csdn.net/TaoHero_1081 所有权归本人所有,转载时请注明出处http://blog.csdn.net/ctojxzsyczta    ...

  7. RPC简介,及与web service的对比

    为什么80%的码农都做不了架构师?>>>    最近分析的这个系统,逻辑架构中有一层是RPC interface.之前对RPC不熟悉,就上网搜索了一下资料,在此总结一下: RPC是R ...

  8. 远程过程调用RPC RMI(Remote Method Invocation)和Web Service

    2019独角兽企业重金招聘Python工程师标准>>> 一.RPC是什么 RPC的全称是Remote Procedure call,是进程间通信方式. 他允许程序调用另一个地址空间的 ...

  9. SOA技术相关介绍(RPC, Web Service, REST,SOAP,JMI)

    概念介绍 SOA(面向服务的软件架构.Service Oriented Architecture),是一种软件设计模式,主要应用于不同应用组件之间通过某种协议来互操作.例如典型的  通信网络协议.因此 ...

最新文章

  1. CentOS 7.3 安装MySQL--Java--Tomcat
  2. 搭建S3C6410开发板的测试环境
  3. Java中的守护线程和非守护线程(转载)
  4. reactor多线程模型_网络编程模型的演进之路
  5. eigen库学习笔记
  6. 频谱分析仪维修论坛_是德E4405B频谱分析仪报错故障维修案例-安泰维修
  7. 电商促销页面需要的辅助图形给设计师准备好了,拿走!
  8. 你以为用了 BigDecimal 后,计算结果就一定精确了?
  9. 去银行写代码是种什么体验?
  10. VC6.0(VC++6.0)下载地址和安装教程(图解)
  11. 微软Win10最新补丁KB5017380更新了什么?
  12. ThinkPad T430i黑苹果Yosemite 10.10.3成功显卡驱动
  13. PCBLayout相关注意事项和常见问题
  14. HTML特效动画、焦点图
  15. 使用nodejs机器学习进行app流量判别
  16. 从 Uber 数据泄露事件我们可以学到什么?
  17. 第二次作业:网易云音乐案例分析
  18. 42表盘直径是从哪测量_表盘直径多大合适,怎样测量手表表盘的直径
  19. 基于某知名招聘网站的上海财务岗位数据分析(含excel可视化)
  20. ffmeg将多段视频合成一个视频

热门文章

  1. win10安装RabbitMQ
  2. Prototype模式
  3. Nginx 反向代理+高可用
  4. 5款新颖的ReSharper插件
  5. Log4Net 全方位跟踪程序运行
  6. nginx学习笔记-01nginx入门,环境搭建,常见命令
  7. 【剑指offer】面试题40:最小的k个数(java)
  8. 全国网络教育统考计算机应用基础题目精选,全国网络教育统考计算机应用基础题目精选解析.doc...
  9. oracle 表 上限,Oracle分区表(Partition Table)的数量限制
  10. 计算机主机机箱面板辐射,电脑机箱如何防辐射----给大家科普一下