RPC数据通讯

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

 

从通讯协议的层面,大体能够分为:java

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

基于TCP协议的(一般会借助Mina、Netty等高性能网络框架)c++

 

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

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

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

 

从调用过程来看,分为:编程

同步通讯调用(同步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。

五、图例说明

二.RPC架构的做用

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

一、从通讯协议的层面,大体能够分为:

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

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

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

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

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

三、 RPC架构分为三部分:

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

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

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

三.RPC的性能优化

一、性能

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

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

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

二、安全

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

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

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

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

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

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

五.java 实例演示

1)实现技术方案

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

2)具体实现

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

[java]  view plain  copy
 
  1. package com.aync.rpcServer;  
  2.   
  3. public interface HelloService {  
  4.     String sayHi(String name);  
  5. }  

(2)HelloServices接口实现类:

[java]  view plain  copy
 
  1. package com.aync.rpcImpl;  
  2.   
  3. import com.aync.rpcServer.HelloService;  
  4.   
  5. public class HelloServiceImpl implements HelloService{  
  6.   
  7.     @Override  
  8.     public String sayHi(String name) {  
  9.          return "Hi, " + name;    
  10.     }  
  11. }  
相关文章
相关标签/搜索