gRPC系列文章 RPC概念、数据传输协议、序列化协议

RPC

RPC(Remote Procedure Call):远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想。
Stub和PRC runtime是RPC思想的两个重要概念。
RPC的概念与技术早在1981年由Nelson提出。1984年,Birrell和Nelson把其用于支持异构型分布式系统间的通讯。Birrell的RPC 模型引入存根进程( stub) 作为远程的本地代理,调用RPC运行时库来传输网络中的调用。Stub和RPC runtime屏蔽了网络调用所涉及的许多细节,特别是,参数的编码/译码及网络通讯是由stub和RPC
runtime完成的,因此这一模式被各类RPC所采用。由于分布式系统的异构性及分布式计算模式与计算任务的多样性,RPC作为网络通讯与委托计算的实现机制,在方法、协议、语义、实现上不断发展,种类繁多,当下以阿里巴巴公司开源的Dubbo、google公司开源的gRPC以及Facebook的Thrift较为典型,其中(Dubbo、Thrift现在已经贡献给apache了所以应该叫Apache Dubbo、Apache Thrift)。

PRC相关概念

进程间通信

进程间通信(IPC)是在多任务操作系统或联网的计算机之间运行的程序和进程所用的通信技术。 有两种类型的进程间通信(IPC)。
|
1、本地过程调用(LPC)LPC用在多任务操作系统中,使得同时运行的任务能互相会话。这些任务共享内存空间使任务同步和互相发送信息。
|
1、远程过程调用(RPC)RPC类似于LPC,只是在网上工作。RPC开始是出现在Sun微系统公司和HP公司的运行UNⅨ操作系统的计算机中。
|
通过IPC和RPC,程序能利用其它程序或计算机处理的进程。客户机/服务器模式计算把远程过程调用与其它技术(如消息传递)一道,作为系统间通信的一种机制。客户机执行自己的任务,但靠服务器提供后端文件服务。RPC为客户机提供向后端服务器申请服务的通信机制。如果你把客户机/服务器应用程序想作是一个分离的程序,服务器能运行数据访问部分,因为它离数据最近,客户机能运行数据表示和与用户交互的前端部分。这样,远程过程调用可看作是把分割的程序通过网络重组的部件。LPC有时也称耦合(Coupling)机制。
|
用这种方式分割程序,当用户要访问数据时就无需每次拷贝整个数据库或它的大部分程序到用户系统。其实,服务器只处理请求,甚至只执行一些数据计算,把得出的结果再发送给用户。因为当数据存放在一个地方时,数据库同步很容易实现,所以多个用户可同时访问相同的数据。

运行时设施

RPC工具提供了一种编程语言和编译器,它们使用可看作是本地过程的可运行于客户机和服务器上的模块开发分布式应用程序。运行时设施(run-timefacility)使得分布式应用程序能在多机种异构系统上运行,这样使得底层体系结构和运输协议对于应用程序是透明的。
|
程序员用接口定义语言(IDL)建立接口定义(interface definition)。IDL是程序员用来设计远程运行的过程的工具。IDL编译器把IDL接口定义转换成与客户机和服务器相连的占位程序(stub)。客户机上的占位程序可加入到服务器的过程,而服务器上的占位程序也可加入到客户机过程。位于客户机服务器的RPC运行时设施与占位程序合作,来提供RPC操作。
|
异构环境中使用RPC的一个问题在于,不同的机器有不同的数据表示,OSFRPC通过具有调用机器的基本数据表示的特征调用来解决这个问题。当收到调用时,若根据特征知道两台机器数据表示不同的话,接收器就进行数据转换。
|
RPC运行时设施提供把客户机请求传送给服务器和在网上发送和接收响应的功能。DCERPC运行时设施也和网络上其它DCE服务相互作用,这些DCE服务有命名、安全和定时服务。
|
运行时设施(run-timefacility)有下列特征:

可在多种网络上运行。开发者无需为每个网络编写特定的应用程序。
提供客户机或服务器或网络上的故障恢复。它支持文件系统、数据库和其它传输可变长数据的服务。
提供独立于任何一个目录服务的基于名字定位服务器的方法。
提供安全工具的接口,以防RPC通信遭受破坏。安全服务保证机密信息的保密性和提供鉴别来保护通信完备性。
支持网上并发或并行处理的多线程调度,于是一个应用程序就能同时执行多个操作 提供多供应商提供的系统环境的可移植性和相互操作性。
|
有几种RPC模式。一个很流行的模式是开放软件基金会的分布式计算环境(DCE)。1991年11月,美国电气和电子工程师协会在它的ISO远程过程调用规范(ISO/IEC CD 11578 N6561, ISO/IEC)中定义了远程过程调用。
远程过程调用(RPC)跨越了开放系统互连(OSI)网络通信模型中的传输层和应用层。远程过程调用使得开发应用程序更容易。
客户端/服务器通信的替代方法包括信息队列和IBM的高级程序间通信(APPC)。

RPC调用的模型

在这里插入图片描述

RPC的应用

RPC在分布式系统中的系统环境建设和应用程序设计中有着广泛的应用,应用包括如下方面:

1、分布式操作系统的进程间通讯
进程间通讯是操作系统必须提供的基本设施之一,分布式操作系统必须提供分布于异构的结点机上进程间的通讯机制,RPC是实现消息传送模式的分布式进程间通讯的手段之一。

2、构造分布式计算的软件环境
由于分布式软件环境本身地理上的分布性, 它的各个组成成份之间存在大量的交互和通讯,R P C 是其基本的实现方法之一。Hadoop也采用了RPC方式。

3、远程数据库服务
在分布式数据库系统中,数据库一般驻存在服务器上,客户机通过远程数据库服务功能访问数据库服务器,现有的远程数据库服务是使用RPC模式的。例如,Sybase和Oracle都提供了存储过程机制,系统与用户定义的存储过程存储在数据库服务器上,用户在客户端使用RPC模式调用存储过程。

4、分布式应用程序设计
RPC机制与RPC工具为分布式应用程序设计提供了手段和方便, 用户可以无需知道网络结构和协议细节而直接使用RPC工具设计分布式应用程序。

5、分布式程序的调试
RPC可用于分布式程序的调试。使用反向RPC使服务器成为客户并向它的客户进程发出RPC,可以调试分布式程序。例如,在服务器上运行一个远端调试程序,它不断接收客户端的RPC,当遇到一个调试程序断点时,它向客户机发回一个RPC,通知断点已经到达,这也是RPC用于进程通讯的例子。


RPC漫谈

RPC是一个标准。Dubbo、Web services 、gRPC等等都是对它的实现的具体产品。
一个RPC框架的关键技术分为两个:
1、传输协议
2、序列化协议

http也是RPC的一种,RPC的协议有很多,比如最早的CORBA,Java RMI,Web Service的RPC风格,Hessian,Thrift,甚至Rest API。

RPC和MQ是分布式两大基石

RPC按通信协议,可以分为基于HTTP的、基于TCP等;按报文协议可以分为基于XML文本的、基于JSON文本的,二进制的。按照是否跨平台语言,可以分为平台专用的,平台中立的。

WebService作为RPC的一种一般属于基于HTTP的、XML文本的、跨平台(平台中立)的,功能完善、体系成熟、支持事务、支持安全机制,广泛应用在金融电信(中国电信一个省级分公司就有几千个WS),传统企业的业务系统,ESB/SOA体系等。缺点:过于复杂,性能不是最优的,互联网用的较少

开放接口使用restful API
内部使用RPC

rpc是远端过程调用,其调用协议通常包含传输协议和序列化协议。传输协议包含: 如著名的 [gRPC](grpc / grpc.io) 使用的 http2 协议,也有如dubbo一类的自定义报文的tcp协议。序列化协议包含: 如基于文本编码的 xml json,也有二进制编码的 protobuf hessian等。

web services
soap
xml

restful API
http
text

gRPC
传输协议http/2
序列化协议protocol buffer

花了一个星期,我终于把RPC框架整明白了!

数据传输协议

Http/2.0

HTTP/2 (原名HTTP/2.0)即超文本传输协议 2.0,是下一代HTTP协议。是由互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis (httpbis)工作小组进行开发。是自1999年http1.1发布后的首个更新。HTTP 2.0在2013年8月进行首次合作共事性测试。在开放互联网上HTTP 2.0将只用于https://网址,而 http://网址将继续使用HTTP/1,目的是在开放互联网上增加使用加密技术,以提供强有力的保护去遏制主动攻击。DANE RFC6698允许域名管理员不通过第三方CA自行发行证书。

HTTP/2 特性

新的二进制(Binary Format)分帧层。HTTP1.x的解析基于文本,文本的展现形式多样,要做到健壮性考虑的场景必然很多,二进制则只有0和1,更高效健壮在效率和正确性上都得到了保证。

  • 多路复用;
  • 头部压缩;
  • 请求划分优先级;
  • 服务器推送流(即Server Push技术);

HTTP/2特性

详解HTTP2四大核心特性

深入浅出:HTTP/2

SPDY

https://baike.baidu.com/item/SPDY

QUIC

QUIC(Quick UDP Internet Connection)是谷歌制定的一种基于UDP的低时延的互联网传输层协议。在2016年11月国际互联网工程任务组(IETF)召开了第一次QUIC工作组会议,受到了业界的广泛关注。这也意味着QUIC开始了它的标准化过程,成为新一代传输层协议。

快速读懂QUIC协议
https://www.cnblogs.com/imteck4713/p/11777310.html


在chrome系游览器中查看请求-响应的协议
在这里插入图片描述


序列化协议

序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

通常,对象实例的所有字段都会被序列化,这意味着数据会被表示为实例的序列化数据。这样,能够解释该格式的代码有可能能够确定这些数据的值,而不依赖于该成员的可访问性。类似地,反序列化从序列化的表示形式中提取数据,并直接设置对象状态,这也与可访问性规则无关。

序列化的另个叫法:结构化数据串行化

目的

1、以某种存储形式使自定义对象持久化;
2、将对象从一个地方传递到另一个地方。
3、使程序更具维护性。

1.序列化定义(结构化数据串行)

序列化(serialization)就是将对象序列化为二进制形式(字节数组),一般也将序列化称为编码(Encode),主要用于网络传输、数据持久化等;

反序列化(deserialization)则是将从网络、磁盘等读取的字节数组还原成原始对象,以便后续业务的进行,一般也将反序列化称为解码(Decode),主要用于网络传输对象的解码,以便完成远程调用。

影响序列化性能的关键因素

  • 序列化后的码流大小(网络带宽的占用);
  • 序列化的性能(CPU资源占用);
  • 是否支持跨语言(异构系统的对接和开发语言切换)。

常用方式

  • Java原生序列化:Java类通过实现Serializable接口来实现该类对象的序列化,这个接口非常特殊,没有任何方法,只起标识作用.Java序列化保留了对象类的元数据(如类、成员变量、继承类信息等),以及对象数据等,兼容性最好,但不支持跨语言,而且性能一般。

  • C#原生序列化:同上

  • JSON:数据文本存储,解析效率一般

  • XML:数据文本存储,解析效率慢

  • Protocol Buffer:数据二进制存储


Java中的序列化和反序列化


Protocol buffers

Protocol buffers是一种由谷歌开源的灵活、高效、自动化的序列化结构化数据的机制——想想XML,但它更小、更快、更简单。一旦定义了数据的结构化方式,就可以使用特殊生成的源代码轻松地在各种数据流之间和各种语言之间编写和读取结构化数据。您甚至可以在不破坏已部署程序的情况下更新数据结构。

Protocol buffers官网

Protocol buffers官方文档


gRPC系列文章

gRPC系列文章 RPC概念、数据传输协议、序列化协议

gRPC系列文章 gRPC++项目生成、编译

gRPC系列文章 gRPC++ HelloWorld项目

gRPC系列文章 SpringBoot下的HelloWorld

发布了54 篇原创文章 · 获赞 9 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/wangxudongx/article/details/104197244