远程通信方式
- RPC(Remote Procedure Call Protocol)
- C/S方式
- tcp协议,发送请求,等待响应
- 请求包括一个参数集和一个文本值,常形成“classname.methodname”形式
- 优点
- 跨语言跨平台,C端和S端有更大的独立性
- 缺点
- 不支持对象,无法在编译期检查错误,只能在运行期检查
- RMI(Remote Method Invocation)
- 采用stubs和skeletons进行远程对象通讯
- stub充当远程对象的客户端代理,和远程对象有相同接口
- 远程对象的调用实际是调用stub来完成的,RMI就好比是本地工作
- tcp/ip协议,客户端直接调用服务端上的一些方法
- 优点
- 强类型,编译期可检查错误
- 缺点
- 只基于JAVA语言,客户端与服务器紧耦合
- JMS(Java Messaging Service)
- Java的消息服务
- JMS客户端之间可以通过JMS服务进行异步消息传输
- 消息模型
- Point-to-Point,点对点
- Publish/Subscribe,发布订阅
- Web Service
- 基于web容器
- 底层使用http协议
- 类似一个远程服务提供者
- 通过一个servlet,提供服务
- 机制
- 客户端从服务器得到WSDL,生成代理类
- 代理类负责与WebService服务器的Request和Response
- 数据(XML)被封装成SOAP(Simple Oject Access Protocol)格式发送到服务器
- 服务器生成一个进程解析Request中的SOAP包
- 业务处理
- 对计算结果进行SOAP包装
- 将包作为Response发送给客户端代理类
- 客户端代理类对SOAP包进行解析
- 后续操作
- 5个层次
- http传输信道
- XML数据格式
- SOAP封装格式
- WSDL描述方式
- UDDI
- 目录服务,可以用它对Webservices进行注册和搜索
对比
- RPC与RMI
- RPC跨语言,RMI只支持Java
- 可以说RMI是面向对象方式的Java RPC
- RMI调用远程对象方法,允许返回Java对象及基本数据类型;RPC不支持对象,消息由外部数据表示语言(External Data Representation,XDR)表示,这种语言抽象了字节序类和数据类型结构之间的差异
- RMI中,远程接口使每个远程方法都具有方法签名;如果一个方法在服务器上执行,但是没有相匹配的签名被添加到远程接口,就不能被RMI客户方调用
- RPC中,到达RPC服务器的请求包含一个参数集和一个文本值,通常形成“classname.methodname”的形式
- JMS与RMI
- JMS是消息通知机制;RMI对象绑定在本地JVM中,只有函数参数和返回值是通过网络传送的(请求应答机制)
- RMI一般都是同步的;JMS一般只是发出Message到Server,发出之后一般不关心谁用了message
- 所以,一般RMI应用是紧耦合,JMS应用相对来说是松耦合
- Web Service与RMI
- RMI在tcp协议上传递可序列化java对象,语言仅java;Web Service是在http协议上传递xml数据,语言平台无关
- Web Service与JMS
- Web Service专注于远程调用,JMS专注于消息交换
- 多数情况下Web Service是两系统间直接交互(consumer < - > producer),而JMS是三方系统交互(consumer <- broker -> producer)为主
- 当然,JMS也可以实现request-response模式的通信,只要consumer或producer其中一方兼任broker即可
- JMS的异步调用可以抵御流量洪峰
- Web Service通常为同步调用,有复杂的对象转换,相比SOAP,JSON和REST都是很好的http架构方案
- 举个例子:电子商务分布式系统中,有支付系统和业务系统,支付系统负责用户付款,付款成功后需通知各业务系统,这个时候,既可以用同步也可以用异步,使用异步的好处是能抵御流量高峰
- JMS是java平台消息规范;JMS消息一般不是xml,而是java对象;很明显,JMS没考虑异构系统,说白了,JMS就没考虑非java的东西;但是好在现在大多数的JMS Provider都解决了异构问题;相比Web Service的跨平台各有千秋吧
网友评论