如何理解 RPC 远程服务调用?

 

RPC 远程服务调用是分布式服务架构的基础。程序员

如何理解 RPC

RPC(Remote Procedure Call)是一种进程间通讯方式,它是一种经过网络从远程计算机程序上请求服务,而不须要了解底层网络技术的协议。算法

RPC 容许程序调用另外一个地址空间的过程或函数,而不用程序员显式编码这个远程调用的细节。即不管是调用本地接口/服务的仍是远程的接口/服务,本质上编写的调用代码基本相同。编程

好比两台服务器 A、B,一个应用部署在 A 服务器上,想要调用 B 服务器上应用提供的函数或者方法,因为不在一个内存空间,则不能直接调用,这时候就能够应用 RPC 框架的实现来解决。缓存

常见RPC 框架

Apache Dubbo

Dubbo 是阿里开源,目前已经成为 Apache 顶级项目。Dubbo 能够经过高性能的 RPC 实现服务的输出和输入,支持服务治理,提供了控制台界面,能够独立应用,也能够和 Spring 框架无缝集成。服务器

Dubbo 在设计中采用了微内核架构,基于对 Java SPI 机制的扩展实现,Dubbo 对分布式服务调用核心功能都开放了扩展点,包括服务调用的负载均衡策略、序列化协议、传输协议等,使用者均可以添加自定义实现。网络

Google 的 gRPC

gRPC 是 Google 开发的高性能、通用的开源 RPC 框架,gRPC 使用 ProtoBuf 来定义服务,ProtoBuf 是 Google 开发的一种数据序列化协议,性能比较高,压缩和传输效率高,语法也比较简单。另外,gRPC 支持多种语言,并可以基于语言自动生成客户端和服务端功能库。数据结构

Apache Thrift

Thrift 起源于 Facebook,和 Dubbo 同样,后来被提交 Apache 基金会将 Thrift 做为一个开源项目。Facebook 创造 Thrift 的目的是为了解决 Facebook 各系统间大数据量的传输通讯,以及系统间语言环境不一样须要跨平台的问题。架构

Thrift 支持多种编程语言,如 Java、C++、Python、PHP、Ruby 等,能够在多种不一样的语言之间通讯。应用 Thrift,须要在一个语言无关的 IDL 文件里,定义数据类型和服务接口,而后生成用来构建 RPC 客户和服务器所需的代码。负载均衡

Thrift 主要的优势是跨语言;缺点是,因为须要定义独立的 IDL 文件,若是对服务进行修改,当数据结构发生变化时,必须从新编辑 IDL 文件、从新编译和生成相关的代码,修改起来比较繁琐。框架

RPC 框架用到哪些技术

如何创建通讯

实现分布式服务框架,首先要解决不一样节点之间通信的问题,须要在客户端和服务器之间创建 TCP 链接,远程过程调用的全部交换的数据都在这个链接里传输。

通常来讲,创建通讯可使用成熟的网络通讯框架,好比 Java 语言中的 Netty。在 Dubbo中就应用了 Netty。

如何进行网络传输

创建通讯以后,节点之间数据传输采用什么协议,也就是选择什么样的二进制数据格式组织;传输的数据如何序列化和反序列化,好比在 Dubbo 中,传输协议默认使用 Dubbo 协议,序列化支持选择 Hessian、Kryo、Protobuf 等不一样方式。

如何进行服务注册和发现

服务注册和发现,也就是服务寻址,以 Dubbo 为例,下图分布式服务典型的寻址和调用过程:

 

 

服务注册,须要服务提供者启动后主动把服务注册到注册中心,注册中心存储了该服务的 IP、端口、调用方式(协议、序列化方式)等信息。

服务发现,当服务消费者第一次调用服务时,会经过注册中心找到相应的服务提供方地址列表,并缓存到本地,以供后续使用。当消费者再次调用服务时,不会再去请求注册中心,而是直接经过负载均衡算法从 IP 列表中取一个服务提供者调用服务。

相关文章
相关标签/搜索