[架构之路-61]:目标系统 - 平台软件 - 基础中间件 - 远程过程(函数)调用RPC原理与其网络架构
Posted 文火冰糖的硅基工坊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[架构之路-61]:目标系统 - 平台软件 - 基础中间件 - 远程过程(函数)调用RPC原理与其网络架构相关的知识,希望对你有一定的参考价值。
目录
1.2 IPC:(Inter Process Communication )跨进程通信
第1章 远程过程/函数调用RPC概述
1.1 什么是编程语言原生的函数调用
计算机的函数,是一个固定的一个程序段,或称其为一个子程序,它在可以实现固定运算功能的同时,还带有一个入口和一个出口,所谓的入口,就是函数所带的各个参数,我们可以通过这个入口,把函数的参数值代入子程序,供计算机处理;所谓出口,就是指函数的函数值,在计算机求得之后,由此口带回给调用它的程序。
原生的函数调用的核心是:
(1)调用者首先给被调函数传入参数,然后,等待被调函数的处理结果,直到被调函数获得执行结果,并把返回给调用者,最后,调用者继续执行后续的代码。
(2)函数执行链中的所有函数执行体,在同一个进程中。
1.2 IPC:(Inter Process Communication )跨进程通信
进程用户空间是相互独立的,一般而言是不能相互访问的。
但很多情况下进程间需要互相通信,来完成系统的某项功能。
进程通过与内核及其它进程之间的互相通信来协调它们的行为。
进程间通信是指两个相互隔离的进程间的程序之间需要相互交互数据。
进程间通信可以有多种手段和方法:
1.4 什么是本地过程(函数)调用LPC
LPC是“本地过程调用(Local Procedure Call)”的缩写。所谓“本地过程调用”是与“远程过程调用”即RPC相对而言的。
RPC是广义的,RPC可以发生在不同主机的进程之间,也可以发生在同一台主机的进程之间,发生在同一台主机的进程之间就是LPC,当然,如果发生在同一个进程内部,就是原生的函数调用。所以在Unix语境下就没有LPC这一说,即使发生在同一台主机上也称为RPC。
在历史上,RPC是“开放软件基金会(OSF)”设计和提出的一种用以实现“Unix分布计算环境(Unix DCE)”的标准。实际上,微软的DCOM技术,就是建立在RPC基础上的。Win2000的RPC可以采用TCP/IP、SPX、NetBios、命名管道、以及“本地”作为底层的通信手段,这“本地”就是LPC。
另一方面,Windows是一个带有许多微内核系统特征的操作系统(尽管它的内核不是微内核),系统中有不少“系统级”的服务进程,例如大家已经熟知的csrss、管理用户登录的“本地安全认证服务”进程LSASS等等,用户进程以及微软提供的系统工具软件经常需要调用由这些服务进程提供的服务,这里LPC就起着重要的作用。
LPC的基础是一种称为“端口(Port)”的进程间通信机制,类似于本地的(Unix域的)Socket。这种Port机制提供了面向报文传递(message passing)的进程间通信,而LPC则是建立在这个基础上的高层机制,目的是提供跨进程的过程调用。注意这里所谓“跨进程的过程调用”不同于以前所说的“跨进程操作”。前者是双方有约定、遵循一定规程的、有控制的服务提供,被调用者在向外提供一些什么服务、即提供哪些函数调用方面是自主的,而后者则可以是在不知不觉之间的被利用、被操纵。前者是良性的,而后者可以是恶性的。
1.5 什么是远程过程/函数调用RPC
特指一种隐藏了过程调用时实际通信细节的IPC方法。客户端将调用一个本地方法,而这个本地方法则是负责透明的与远程服务端进行过程间通信。这个本地方法会将相关参数顺序打包到一个消息中,然后把这个消息发送给服务端提供的方法,服务端的方法会从消息中解出序列化发出来的参数,然后执行,最后仍以同样的方式将方法的返回值发送给客户端。
远程过程调用的角色划分:
客户进程:本地函数调动的应用程序。
服务器进程:提供数据的远程服务器。
第2章 远程过程调动的网络架构
2.1 去中心化的点对点架构(P2P架构)
P2P架构中,没有明显的服务器和服务器,每个机器,既是客户端也是服务器。
这种架构对于一些去中心化的即时通信应用是有吸引力的。许多直接即时通讯社交应用涉及信息管理和多用户交互方面。一个客户端主机可以同时作为 Client 或 Peer,这取决于该主机在应用程序的角色定义。
P2P 很适用于语音或视频会议的场景。P2P 的很明显的特征是功能的对称性。适合数据面。
优点:降低了客户端之间通信的延时,提升了客户端到客户端通信的效率。
缺点:如果一个客户端与多终端同时通信,就会比较复杂。
2.2 客户端-服务器模式(二层C/S架构)
一切将服务提供者(服务器)和服务消费者(客户端)分开的分布式计算模式。
各个计算机之间以客户机和服务器的关系进行工作与交换信息,客户机首先向服务器发送请求,然后服务器完成请求的操作,并把结果返回给客户机。
C/S 应用程序 一部分是由以与客户端或用户交互为基础的主机,另一部分主机则是专门用于管理大型数据存储库,处理应用特有的数据和逻辑的服务器。
这给 C/S 架构引入了不对称的功能性,客户端需要向服务端发起请求,而服务端需要满足(答复)客户端的请求。
C/S 架构适合应用于在服务器上发布的信息管理应用程序。
OLTP应用则是传统的 C/S 架构中的良好示例。
On-Line Transaction Processing联机事务处理过程(OLTP),也称为面向交易的处理过程,其基本特征是前台接收的用户数据可以立即传送到计算中心进行处理,并在很短的时间内给出处理结果,是对用户操作快速响应的方式之一。
2.3 客户端-服务器模式(三层C/S架构)
- 第一层:客户端(用户)。
- 第二层:服务端(用于存放应用程序的逻辑)。
- 第三层:数据库(不同的应用程序所需要的共享数据)。
三层的 C/S 架构
这种3层架构的动机包括:
- 表现:专注于单个用户
- 应用程序逻辑:支持多用户,通过添加多台服务器来支持更多用户的成本是较低的。
- 关键共享数据:支持多个应用程序。
这三层的 C/S 架构中,每层之间都是n…1
的关系。
显然三层架构比两层架构具备更高的扩展性,
向客户端隐藏的异构数据库支持以及提供了不同的通信协议的更好支持。
2.4 MVC 架构
模型 - 视图 - 控制器(MVC)应用程序架构是用于分析分布式应用程序的功能的流行模型。
这种抽象有助于将应用程序分解成逻辑组件,以实现更容易/更清晰的分布式实现。
MVC 划分在监视和处理数据中涉及的对象之间的功能,以便最小化这些对象之间的耦合度,并因此将这些对象映射在多层架构上。
最初 MVC 用户解耦:输入、数据处理、输出 UI 界面。
但是,将此模型映射到多层网站或企业应用程序也很简单。
- 模型(Model):操作数据。
当 Model 层数据变更时通知 View 。 它允许 Controller 访问 Model 封装的方法。
- 视图(View):将 Model 提供的内容渲染出来。
它可以查询Model关于数据的模型并指定如何呈现它。
- 控制器(Controller):定义应用程序的行为。
它将用户手势映射到要由Model执行的操作。在标准的 GUI 客户端,用户手势可以是按压按钮。在 Web 环境,它可以是发起一次 HTTP GET/POST 请求。通常一个Controller,表示一组相关的功能。
第3章 RPC主要框架
3.1 RPC框架的作用
RPC 是远程过程调用的方式之一,涉及调用方和被调用方两个进程的交互。
RPC(Remote Procedure Call)远程过程调用是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议,简单的理解是一个节点请求另一个节点提供的服务。
RPC只是一套思想,基于这个思想来实现的框架都可以称为 RPC 框架。
RPC框架是以库的形式存在的。
RPC 提供类似于本地方法调用的形式,在有RPC框架的支持下,对于调用方来说,调用 RPC 方法和调用本地方法并没有明显区别。
3.2 RPC调用需要知道的信息
对使用者来说,屏蔽了网络通信的细节。
你只需要知道调用这个方法返回的结果,而无需关注底层逻辑。
从封装的那个方法角度来看,调用之前我们需要知道什么?
-
直接调用的语义,也可以理解为接口规范。(比如
RESTful
) -
中间的网络传输协议 (比如
HTTP或HTTP2
) -
传输的数据序列化与反序列化规范(比如
JSON、
ProtocolBuffers)。
有了这些约定,我就知道:
- 如何给你发数据
- 发什么样的数据
- 你返回给我的又是什么样的数据。
3.3 比较典型RPC框架
(1)Dubbo
Dubbo(读音[ˈdʌbəʊ])是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成。
Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:
- 面向接口的远程方法调用,
- 智能容错和负载均衡,
- 以及服务自动注册和发现。
(2)Thrift
Thrift 是一个软件框架(远程过程调用框架),用来进行可扩展且跨语言的服务的开发。
它结合了功能强大的软件堆栈和代码生成引 擎,以构建在 C++, Java, Python, php, Ruby, Erlang, Perl, Haskell, C#, Cocoa, javascript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。
thrift 最初由 facebook 开发,07 年四月开放源码,08 年 5 月进入 apache 孵化器,现在是 Apache 基金会的顶级项目
thrift 允许你定义一个简单的定义文件中的数据类型和服务接口,以作为输入文件,编译器生成代码用来方便地生成 RPC 客户端和服务器通信的无缝跨编程语言。。
(3)gRPC
gRPC是由Google开发的一款语言中立、平台中立、高性能、通用的开源的开源RPC
框架,主要用来解决性能损失的问题。
gRPC使客户端和服务端应用程序可以透明地进行通信,并简化了连接系统的构建。
它使用HTTP/2作为通信协议,使用ProtocolBuffers作为序列化协议。
HTTP/2协议:
从上图可以看出,客户端只需要书写http的文本,就可以实现远程过程调用,从服务器获取数据。
当然,文本是有一定的协议格式的。
(4)Linux rpcgen
rpcgen可以自动生成RPC服务器程序的大多数代码,它的输入为一个规格说明文件,它的输出为一个C语言的源程序。因此它是通过C语言实现的RPC协议工具,需要安装。
规格文件(*.x)包含常量、全局数据类型以及远程过程的声明。Rpcgen产生的代码包含了实现客户机和服务器程序所需要的大部分源代码。他包括参数整理、发送RPC报文、参数和结果的外部数据表示以及本地数据表示的转换等。
不过在由rpcgen生成的源文件中,没有过程的具体实现,所以程序员必须要手工编辑这些文件,实现这些过程。
以上是关于[架构之路-61]:目标系统 - 平台软件 - 基础中间件 - 远程过程(函数)调用RPC原理与其网络架构的主要内容,如果未能解决你的问题,请参考以下文章
[架构之路-58]:目标系统 - 平台软件 - 中间件软件(嵌入式)与中间件平台(中台)
[架构之路-57]:目标系统 - 平台软件 - 用户空间驱动与硬件抽象层HAL
[架构之路-60]:目标系统 - 平台软件 - 基础中间件 - Linux进程间通信的主要方式
[架构之路-59]:目标系统 - 平台软件 - 基础中间件 - POSIX(可移植操作系统接口)与标准库函数libc