- 浏览: 1586941 次
- 性别:
- 来自: 吉林
文章分类
- 全部博客 (624)
- C/C++ (33)
- Java (181)
- 网络相关 (7)
- 我爱篮球 (3)
- 也爱足球 (4)
- 杂谈 (1)
- 系统架构 (3)
- Web Service (14)
- Framework (3)
- 系统命令 (8)
- 管理平台相关 (8)
- 其它 (35)
- Websphere (1)
- Struts2 (24)
- Hibernate (16)
- Spring (23)
- javascript (20)
- jquery (23)
- html/css/div (28)
- 数据库 (40)
- JavaWeb (27)
- 设计模式 (2)
- 文档编写 (3)
- SVN (5)
- Ant (1)
- Maven (13)
- 软件项目管理 (8)
- AOP (1)
- kindeditor (1)
- JSON (2)
- Servlt/JSP (4)
- WordXML (2)
- XML (12)
- 面试相关 (7)
- Tomcat (11)
- 性能与调优 (29)
- 职业发展 (2)
- 操作系统 (7)
- AJAX (2)
- DWR (1)
- Eclipse (12)
- 持续集成 (3)
- 批处理命令 (1)
- Mozilla Rhino (2)
- 新鲜技术 (18)
- Apache mina (2)
- 底层技术 (18)
- Linux (22)
- 新鲜技术,IT历史 (1)
- 敏捷开发 (1)
- 版本控制 (5)
- 较火技术 (7)
- 集群 (2)
- Web前端 (13)
- 报表工具 (3)
- 网站架构 (5)
- 大数据 (8)
- 分布式存储 (5)
- 云计算 (8)
- TCP/IP协议 (1)
- 负载均衡 (3)
- 硬件 (1)
- 表现层技术 (3)
- Velocity (3)
- jvm (6)
- 并发编程 (10)
- hadoop (8)
- 数据结构和算法 (12)
- 计算机原理 (1)
- 测试驱动开发-TDD (3)
- 开发技巧 (1)
- 分词器 (1)
- 项目构建工具 (2)
- JMX (4)
- RMI (1)
- 测试技术 (22)
- 网络完全 (1)
- Git (4)
- apache开源包 (4)
- Java常用 (1)
- mock (2)
- OSGi (2)
- MongoDB (1)
- JBPM (1)
- Storm (3)
- mysql (2)
- telnet (1)
- 正则表达式 (1)
- bootstrap (4)
- Apache ActiveMQ (1)
- redis (9)
- Nginx (2)
- rsync+inotify文件同步 (2)
- testng (1)
- 原型设计工具 (1)
- 工程能力 (1)
- 风险控制 (3)
- ibatis (1)
- 分布式 (4)
- 安全技术 (1)
- 计算机基础 (4)
- 消息中间件 (1)
- UML (2)
最新评论
-
u012236967:
java命令执行jar包(里面的main函数)的方式(包括依赖其它的jar包问题) -
世界尽头没有你:
Selenium自动化测试从入门到精通(Java版)百度网盘地 ...
自动化测试工具 Selenium WebDriver 入门教程(针对主流浏览器) -
小小西芹菜:
我喜欢代码简洁易读,服务稳定的推送服务,前段时间研究了一下go ...
dwr实现Reverse Ajax推送技术的三种方式 -
hellozhouqiao:
楼主,请教一点问题.现在我们需要在excel 的页脚里面加上图 ...
FreeMaker + xml 导出word(处理目录,图片和页眉页脚问题) -
乱在长安:
使用Timer会有各种各样的问题好嘛?!书上推荐使用Sched ...
DelayQueue (ScheduledThreadPoolExecutor调度的实现)
基本概念
1. rest和rpc架构的概念
REST架构:方法信息(method information)都在HTTP方法(HTTP method)里.
面向资源的架构(ROA): 作用域信息(scoping information)都在URI里.
如果一个系统架构的实现, 完全满足以上两条,则可以认为是一个纯正的rest架构, 如果都不满足,则是一个典型的rpc架构。通常来说,更常见的可能是一种rest-rpc 混合架构.
作者也指出:
RPC式架构:方法信息和作用域信息都在信封(envelope)或报头(headers)里。 具体采用哪种信封,并不影响这里的分类,不过HTTP是一种常见信封格式. RPC将服务器看作是由一些过程组成,客户端调用这些过程来执行特定的任务。这种特定决定了rpc调用的高耦合性,不过就应用开发的角度来说,很多人不会去关心这个问题。
分布式对象架构:分布式对象架构将服务器看做远程对象的组合,通过代理调用远程对象来掩饰本地对象和远程对象的差别。分布式对象结构的主要缺点是粒度的控制问题,另外某种意义上分布式对象结构依然是rpc风格的,只不过做了更好的掩饰。
2. big soap webservice中的rpc和document的概念
顺手补习一下 ws * 中的rpc和document的概念。
常见两种编码绑定方式, rpc风格和document风格, 虽然后者理论上号称是非rpc方式的面向消息的封装,并具有一些理论上的优点,但实际情况仍然是rpc方式。
可以从xml文件的结构来看两种模式的差异
rpc风格
请求包
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:ns1="http://item.service.soap.soajava.packt.com/">
<soapenv:Body>
<ns1:insert> // method name bingding
<arg0> // parameter
<code>XY</code>
<description>xy desc</description>
<id>26</id>
</arg0>
</ns1:insert>
</soapenv:Body>
</soapenv:Envelope>
一个rpc调用总是由4部分组成
- A remote address
- A method (or operation) name
- A sequence of parameters
- A synchronous response
这4部分基本和一个程序语言的方法调用一致。
rpc风格的wsdl文件描述
<part name="itemParam" type="tns:item"></part>
<part name="categoryParam" type="xsd:string"></part>
</message>
<message name="insertResponse">
<part name="return" type="tns:outcome"></part>
</message>
<portType name="ItemWs">
<operation name="insert" parameterOrder=
"itemParam categoryParam">
<input message="tns:insert"></input>
<output message="tns:insertResponse"></output>
</operation>
</portType>
<binding name="ItemWsPortBinding" type="tns:ItemWs">
<soap:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/http">
</soap:binding>
<operation name="insert">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal" namespace=
"http://item.service.soap.soajava.packt.com/">
</soap:body>
</input>
Document 风格
请求包
<category>A</category>
<item>
<code>XY</code>
<description>xy desc</description>
<id>26</id>
</item>
</ns1:itemInsertRequestParam>
虽然看起来差别不大,但是此处已经没有所谓明显的方法调用特征,无方法名和参数绑定,即请求包是以所谓document为处理核心的,而document可以理解为一种resouce或者message。(呵呵,有点自欺欺人)。
更大的差别在wsdl的描述上
<part element="tns:itemInsertRequestParam"
name="itemInsertRequestParam"></part> // no type attribute here.
</message>
<binding name="ItemWsPortBinding" type="tns:ItemWs">
<soap:binding style="document"
message里只包含一个part,也不再使用type熟悉申明。据说这样的差别决定了可以用xsd对文档进行校验(我没完全明白)。
虽然实际上rpc和document差别不大,但是理论上存在2个重大差异
1. document风格不直接和方法绑定,所以方法变化时,比如增加一个属性时,不一定会影响客户端代码。
2. document风格能提供对文档的校验模式。
但实际上, webservice中的 document风格绑定,其实还是rpc的。从这可以看出big web service是多么的无聊。
实际应用中,这2种风格的差别会引起很多问题, 一些传统的老旧应用基本是rpc风格的,而某些应用和webservice实现则只提供document的支持。这会部分导致兼容性问题,虽然理论上,新的总是兼容旧的,但实际问题多多。
顺便说一个实际工作中碰到的问题,在使用domino7将服务发布成document风格的web service时,我们有时候(牛就牛在这有时候)会出现服务调用乱窜的问题, 客户端提交的服务调用会乱窜到同参数的其他服务中,充分体现了document风格不以方法名绑定的实质,nnd。
另外,是否正是因为soap这种先天性的rpc架构缺陷,导致了必然的兼容性和复杂性问题?
为什么要使用rest架构
对此问题我其实长期以来一直存在一个本质的误解。 我之所以喜欢用restful 的web service,其实更直接的原因是我实在讨厌soap的big web service。 使用rest我至少得到了2个好处。
1. 开发效率和执行效率的显著提高
2. 回避了兼容性问题,特别是异构系统间。
好吧,但是象ror那样,把所有内容都发布成了CRUD的操作的rest,我还是一直比较反感的,实在看不出其中的好处。我一直觉得,远程服务应该是比较大粒度的东西,不应该将所有的资源都服务化。 而旺财同学曾经给我看过infoq上一篇文章,关于rest的那10个问题,看完以后我还是继续迷糊,好像一个问题都没有解释清楚。
不过今天突然明白了。rest的意义在于通过将数据操作的资源化,给客户端的使用提供了足够的灵活性,这是传统结构难以比拟的。这其实是一个视角变换的问题。
静态网页比动态的bbs更容易被检索使用也是由于这种信息的资源化,资源化的结果是给客户端的玩法提供近乎无限的可能性。rest其实是一种以客户端使用为主要核心的结构。
其实想想自己平时在应用开发中对数据的操作也能对应起来。一般来说做一个业务系统开发,对数据我会干2件事。
1. 使用技巧实现一个万能dao,或者通过模板工具,将所有数据表映射到对象并创建对应的CRUD操作甚至关联操作。
这样做的目的并不在于系统中所有的表都需要做crud操作,而是试图把对数据库的操作释放为标准的对象操作,屏蔽掉数据库操作,提高程序员操作的灵活性。
2. 对应非CRUD的操作, 则重新编写专门的代码实现。
而对应的 REST 的 过程
1. 将数据的CRUD操作资源化发布。
可以考虑c/s结构的开发, 如果未有此种资源化会增加客户端和服务器多少工作量?
2. 对于复杂的操作需求,编写专门服务实现。
这个操作有可能是rpc风格的。
这2种做法基本一致, 都是按2,8 原则对粗粒度和细粒度进行组合。 而我之前的迷糊,其实来源于以往分布式对象架构经验的困扰,EJB/RMI方面的苦难经历已经给我们洗脑,分布式结构,细粒度总是不好的,灵活总是难以控制的,所以我们习惯于限制客户端的可操作性。
REST的架构, 某种意义应该理解为客户端应用导向的架构,关心的是能给予客户端更多的灵活性而不是更多的限制。
服务和客户的对应关系,总是1对n的关系。 从这个角度看,rest是天生更适合SOA的, 比SOAP 要合适的多。
但是如何有效又简洁而且便宜的解决安全问题? 这个还需要继续研究。
发表评论
-
WebService与RMI的区别及协作
2014-05-19 10:18 1615区别: RMI的客户端 ... -
session和cookie的区别,如何用session和cookie访问共享用户信息
2013-09-13 18:38 1856Cookie的机制 Cookie是浏览器(Use ... -
CXF+Spring+WSDL的Webservice实现(转)
2013-01-16 10:57 1939转自:http://www.blogjava.net/sxy ... -
CXF+Spring实现Webservice(简单例子-转)
2013-01-16 10:51 1289Apache CXF 是一个开放源代码框架,提供了用于方便地 ... -
XML的基本数据类型
2011-08-09 09:36 1643String、decimal、boolean、float、do ... -
理解类8583报文协议(转)
2011-07-18 17:52 3571我刚进入金融行业时, ... -
MQ使用指南(转载的)
2011-03-08 17:03 2764一.MQ基本操作 MQ中有几个很重要的组件:队列管 ... -
深入浅出REST
2010-11-09 14:33 1433【原文地址】:http://www ... -
理解Restful Web Service(二)
2010-11-09 12:58 1787对于restful web service,刚开始确实是个不太 ... -
理解Restful Web Service(一)
2010-11-09 12:56 2423摘 要:本文展示了Http ... -
Schema中的命名空间
2010-09-02 17:16 2247基本的XML Schema的使用就 ... -
Schema中elementFormDefault="qualified"所起的作用
2010-09-02 17:13 6107有的xsd文件的开头是这 ... -
Schema中import和include的区别
2010-09-02 16:42 2017http://davidwang.iteye.com/blog ...
相关推荐
### REST与RPC的区别详解 #### 一、概述 在现代软件开发中,特别是分布式系统设计领域,REST(Representational State Transfer)与RPC(Remote Procedure Call)是两种非常重要的服务调用方式。这两种方法各有...
`rest_rpc`是一个基于C++11开发的轻量级RPC(Remote Procedure Call)框架,它将RESTful API的设计理念与RPC技术相结合,为开发者提供了一种简单且高效的远程调用解决方案。本文将深入探讨`rest_rpc`的核心特性、...
rest_rpc c++11, high performance, cross platform, easy to use rpc framework. It's so easy to love RPC. Modern C++开发的RPC库就是这么简单好用! rest_rpc简介 rest_rpc是一个高性能、易用、跨平台、header ...
在标题和描述中提到的“dubbo rest rpc相关jar包”是指Dubbo支持RESTful API调用的扩展模块,这使得Dubbo能够与更广泛的Web服务和微服务生态系统集成。 首先,我们来详细了解一下`dubbo-2.8.4.jar`。这是Dubbo的...
smart-doc是一款同时支持JAVA REST API和Apache Dubbo RPC接口文档生成的工具,smart-doc在业内率先提出基于JAVA泛型定义推导的理念, 完全基于接口源码来分析生成接口文档,不采用任何注解侵入到业务代码中
Armeria是一个强大的开源项目,专门设计用于构建高性能、异步的RPC(远程过程调用)和REST(Representational State Transfer)服务。它基于Java 8、Netty、HTTP/2和gRPC技术栈,提供了现代化的网络应用开发框架。...
java运行依赖jar包
REST与CORBA、SNMP、SOAP比较 腾讯开放平台REST API 示例 通过URL来设计系统结构,抽象的是资源,而不是对象、过程,完成的是用户接口 REST API的开发框架介绍:JSR-311,REST Web Services框架 JAX-RS,java接口;...
Dubbo 是阿里巴巴开源的一款高性能、轻量级的 Java RPC 框架,它极大地简化了分布式服务开发的流程,使得服务提供者和服务消费者之间的通信变得简单。在现代微服务架构中,REST(Representational State Transfer)...
- **异构系统集成**:PHP RPC可以用于连接不同编程语言的系统,如PHP与Python、Java等。 **文件内容** - **AUTHORS**:列出项目的主要作者和贡献者,提供了关于开发者的相关信息。 - **INSTALL**:包含了安装和...
在理解REST时,应避免将其与RPC(Remote Procedure Call)简单等同,因为REST不仅仅是一系列HTTP方法的简单应用。 REST的核心理念在于资源的抽象、统一的接口以及状态的无状态传输。其中,“资源”指的是通过网络可...
目前在三种主流的Web服务实现方案中,因为REST模式的Web服务与复杂的SOAP和XML-RPC对比来讲明显的更加简洁,越来越多的web服务开始采用REST风格设计和实现。例如,Amazon.com提供接近REST风格的Web服务进行图书查找...
1. **微服务架构**:微服务架构的核心思想是将单一应用程序分解为一组小型服务,每个服务都在其自身的进程中运行,服务之间通过轻量级的方式(如 HTTP/REST 或者 RPC)进行通信。这种解耦的设计提高了系统的可扩展性...
Web 服务协议如 SOAP、REST 和 XML-RPC 提供了将这些遗留应用程序与网络集成的途径。本文主要关注 XML-RPC,这是一种简单且轻量级的消息传递协议,支持基于 XML 的跨平台通信,特别适合 C++ 应用程序。 **为什么要...
### REST与面向资源的Web开发 #### REST简介 REST(Representational State Transfer)代表了一种分布式超媒体软件架构风格,最初由Roy Thomas Fielding在他的2000年博士论文中提出。REST并不是一种具体的标准或者...
gem install json-rpc2rest 或将以下行添加到 Gemfile: gem 'json-rpc2rest' 并从您的 shell 运行bundle install 。 之后添加行到config/application.rb config . middleware . use 'Json-Rpc2Rest' 您也...
REST上的eProsima RPC通过RESTful范式提供RPC通信。建造该存储库提供脚本来构建和安装RPC库。 同样在您可以找到使用自动工具Linux软件包和Windows的二进制文件。 以下小节解释了如何使用 CMake 为每个 RPC 库进行树...