RPC全称为Remote Procedure Call,翻译过来为“远程过程调用”。目前,主流的平台中都支持各种远程调用技术,以满足分布式系统架构中不同的系统之间的远程通信和相互调用。远程调用的应用场景极其广泛,实现的方式也各式各样。

从通信协议的层面,大致可以分为:

基于HTTP协议的(例如基于文本的SOAP(XML)、Rest(JSON),基于二进制Hessian(Binary))

基于TCP协议的(通常会借助Mina、Netty等高性能网络框架)

从不同的开发语言和平台层面,分为:

单种语言或平台特定支持的通信技术(例如Java平台的RMI、.NET平台Remoting)

支持跨平台通信的技术(例如HTTP Rest、Thrift等)

从调用过程来看,分为:

同步通信调用(同步RPC)

异步通信调用(MQ、异步RPC)

常见的几种通信方式

1. 远程数据共享(例如:共享远程文件,共享数据库等实现不同系统通信)

2. 消息队列

3. RPC(远程过程调用)

序列化/反序列化

只有二进制数据才能在网络中传输,序列化和反序列化的定义是:

将对象转换成二进制流的过程叫做序列化,

将二进制流转换成对象的过程叫做反序列化。

OSI网络结构的七层模型

各层的具体描述如下:

  第七层:应用层     定义了用于在网络中进行通信和数据传输的接口 - 用户程式;提供标准服务,比如虚拟终端、文件以及任务的传输 和处理; 
  第六层:表示层     掩盖不同系统间的数据格式的不同性; 指定独立结构的数据传输格式; 数据的编码和解码;加密和解密;压缩和 解压缩 
  第五层:会话层     管理用户会话和对话; 控制用户间逻辑连接的建立和挂断;报告上一层发生的错误 
  第四层:传输层     管理网络中端到端的信息传送; 通过错误纠正和流控制机制提供可靠且有序的数据包传送; 提供面向无连接的数 据包的传送; 
  第三层:网络层     定义网络设备间如何传输数据; 根据唯一的网络设备地址路由数据包;提供流和拥塞控制以防止网络资源的损耗 
  第二层:数据链路层 定义操作通信连接的程序; 封装数据包为数据帧; 监测和纠正数据包传输错误 
  第一层:物理层      定义通过网络设备发送数据的物理方式; 作为网络媒介和设备间的接口;定义光学、电气以及机械特性。

在上述7层中,http协议是应用层协议。HTTP协议是超文本传送协议(HyperText Transfer Protocol)的缩写,它是万维网(World Wide Web,www,也简称为Web)的基础。HTTP协议设计之初就是为了实现Web的想法。HTTP协议位于TCP/IP协议栈的应用层。基于HTTP协议的客户/服务器模式的信息交换过程,分四个过程:建立连接、发送请求信息、发送响应信息、关闭连接。

而关于RPC的基本概念介绍如下:

英文原义:Remote Procedure Call Protocol
中文释义:(RFC-1831)远过程调用协议
   注解:一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加轻易。
   RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用过程接收答复信息,获得进程结果,然后调用执行继续进行。
RPC信息协议由两个不同结构组成:调用信息和答复信息。

二者的联系是:

RPC OVER HTTP

Microsoft RPC-over-HTTP 部署(RPC over HTTP)允许RPC 客户端安全和有效地通过Internet 连接到RPC 服务器程序并执行远程过程调用。这是在一个名称为RPC-over-HTTP 代理,或简称为RPC 代理的中间件的帮助下完成的。

  RPC 代理运行在IIS 计算机上。它接受来自Internet 的RPC 请求,在这些请求上执行认证,检验和访问检查,如果请求通过所有的测试,RPC 代理将请求转发给执行真正处理的RPC 服务器。通过RPC over HTTP,RPC 客户端不和服务器直接通信,它们使用RPC 代理作为中间件。

关于xml-rpc

1.xml rpc是什么 
1.1. xml rpc简介 
xml rpc是使用http协议做为传输协议的rpc机制,使用xml文本的方式传输命令和数据。 
一个rpc系统,必然包括2个部分:1.rpc client,用来向rpc server调用方法,并接收方法的返回数据;2.rpc server,用于响应rpc client的请求,执行方法,并回送方法执行结果。 
1.2. xml rpc的可用版本 
xml rpc client和xml rpc server都有很多版本的实现。一般而言,一个实现版本都会同时实现client/server。但由于都满足xml rpc规范,从理论上讲,任何一个版本的rpc client实现与任何一个版本的rpc server都能配套使用。 
更进一步,由于xml rpc以xml文本的方式,使用http协议传输,所以与编程语言无关。例如:rpc client的已实现版本包括了:perl,php,python,c/c++,java,等等;rpc server的实现语言包括perl,java,等。 
同一种编程语言所实现的版本也不止一个。例如java版的实现有:Marque的xmlrpc实现(http://xmlrpc.sourceforge.net/),apache的xmlrpc 实现(http://ws.apache.org/xmlrpc/)

1.3.xmlrpc的工作原理 
完整的需要参考xmlrpc规范(http://www.xmlrpc.com/spec
简单描述: 
rpcclient的工作原理:rpcclient根据URL找到rpcserver -> 构造命令包,调用rpcserver上的某个服务的某个方法 -> 接收到rpcserver的返回,解析响应包,拿出调用的返回结果。 
rpcserver的工作原理:启动一个webserver(在使用内置的webserver的情况下) -> 注册每个能提供的服务,每个服务对应一个Handler类 ->进入服务监听状态。

常见RPC技术和框架

1)应用级的服务框架:Dubbo/Dubbox、ZeroICE、GRpc、Spring Boot/Spring Cloud。

2)远程通信协议:RMI、Socket、SOAP(HTTP XML)、REST(HTTP JSON)。

3)通信框架:MINA和Netty。

5、图例说明

二.RPC架构的作用

RPC框架的主要目标就是让远程服务调用更简单、透明。RPC框架负责屏蔽底层的传输方式(TCP或者UDP)、序列化方式(XML/JSON/二进制)和通信细节。开发人员在使用的时候只需要了解谁在什么位置提供了什么样的远程服务接口即可,并不需要关心底层通信细节和调用过程。

1、从通信协议的层面,大致可以分为:

(1)基于HTTP协议的(例如基于文本的SOAP(XML)、Rest(JSON),基于二进制Hessian(Binary));

(2)基于TCP协议的(通常会借助Mina、Netty等高性能网络框架)。

2、只有二进制数据才能在网络中传输,序列化和反序列化的定义是:

(1)将对象转换成二进制流的过程叫做序列化;

(2)将二进制流转换成对象的过程叫做反序列化。

3、 RPC架构分为三部分:

(1)服务提供者,运行在服务器端,提供服务接口定义与服务实现类。

(2)服务中心,运行在服务器端,负责将本地服务发布成远程服务,管理远程服务,提供给服务消费者使用。

(3)服务消费者,运行在客户端,通过远程代理对象调用远程服务。

三.RPC的性能优化

1、性能

影响RPC性能的主要在几个方面:

(1)序列化/反序列化的框架;

(2)网络协议,网络模型,线程模型等。

2、安全

RPC安全的主要在于服务接口的鉴权和访问控制支持。

四.服务化架构的演进之路

1、MVC架构:当业务规模很小时,将所有功能都不熟在同一个进程中,通过双机或者负载均衡器实现负债分流;此时,分离前后台逻辑的MVC架构是关键。

2、PRC架构:当垂直应用越来越多,应用之间交互不可避免,将核心和公共业务抽取出来,作为独立的服务,实现前后台逻辑分离。此时,用于提高业务复用及拆分的RPC框架是关键。

3、SOA架构:随着业务发展,服务数量越来越多,服务生命周期管控和运行态的治理成为瓶颈,此时用于提升服务质量的SOA服务治理是关键。

4、微服务架构:通过服务的原子化拆分,以及微服务的独立打包、部署和升级,小团队的交付周期将缩短,运维成本也将大幅度下降。

五.java 实例演示

1)实现技术方案

下面使用比较原始的方案实现RPC框架,采用Socket通信、动态代理与反射与Java原生的序列化。

2)具体实现

(1)服务提供者接口定义与实现,代码如下:

  1. package com.aync.rpcServer;
  2. public interface HelloService {
  3. String sayHi(String name);
  4. }

(2)HelloServices接口实现类:

  1. package com.aync.rpcImpl;
  2. import com.aync.rpcServer.HelloService;
  3. public class HelloServiceImpl implements HelloService{
  4. @Override
  5. public String sayHi(String name) {
  6. return "Hi, " + name;
  7. }
  8. }

最新文章

  1. 解决VMWARE NAT SERVICE服务无法启动或服务消失的问题
  2. 安全标识符SID技术介绍及查看技巧
  3. Neutron Kilo-Liberty-Mitaka各版本区别
  4. xss跨站攻击测试代码
  5. JQuery validate 在IE兼容模式下出现 js错误(成员找不到)的修正:
  6. 移动开发Html 5前端性能优化指南
  7. 《火球——UML大战需求分析》(0.2)——目录
  8. 文件操作中的FLAG(O_RDONLY,O_WRONLY )的值
  9. ConcurrentHashMap简介
  10. mex
  11. 纯CSS3实现的顶部社会化分享按钮
  12. JQuery 常用命令总结
  13. Gym 101243E Cupcakes
  14. python中各类时间的计算
  15. JUnit4.12 源码分析之Statement
  16. 关于STM8S使用硬件SPI收发问题
  17. 《DSP using MATLAB》示例9.2
  18. 搭建Spring开发环境并编写第一个Spring小程序
  19. jira项目管理平台搭建
  20. 【C++ STL】Vector

热门文章

  1. 【BZOJ】2019: [Usaco2009 Nov]找工作(spfa)
  2. wordpress简单搭建个人博客
  3. Linux USB 鼠标输入驱动具体解释
  4. js 跳转的几种方法收藏
  5. 主干(trunk)、分支(branch )、标记(tag) 用法示例 + 图解
  6. JavaScript------Throw和Try-Catch的使用
  7. 7.解决谷歌的SDK更新失败问题。
  8. 【BZOJ1264】[AHOI2006]基因匹配Match DP+树状数组
  9. IE强制不使用兼容模式
  10. python框架Scrapy中crawlSpider的使用