RPC框架原理与实现

前言

大部分时候,微服务都是建立在一种基于请求和响应的协议之上。比如,REST等。这种方式是自然的。我们只需要调用另外一个模块就是了,然后等待响应返回,然后继续。这样的方式确实也满足了我们的很多的场景:用户通过点击页面的一个按钮然后希望发生一些事情。但是,当我们开始接触许多独立的service的时候,事情就发生改变了。随着service数量急速的增长,同步交互比例也随着service在急速增长。这时候,我们的service就会遇到很多的瓶颈。于是,一个新的技术大范围的出现并加以应用,他就叫做“RPC”。

定义

RPC,全称 Remote Procedure Call(远程过程调用),即调用远程计算机上的服务,就像调用本地服务一样。那么RPC的原理是什么呢?

其实说到RPC,大家应该不会陌生才是,以往流行的Web Service就是一种RPC,一般来说RPC 可基于 HTTP 或 TCP 协议,因为Web Service 基于HTTP,所以具有良好的跨平台性,但由于HTTP是应用层协议,相比TCP性能有所损耗。与本地调用不一样,远程调用需要通过网络层传输,因此涉及到的一个问题就是序列化,不同的序列化方式影响调用性能,流行的序列化包括GRPC、Protobuf、Kryo、Hessian、Jackson、Thrift。

RPC 的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。为实现该目标,RPC 框架需提供一种透明调用机制让使用者不必显式的区分本地调用和远程调用。

解释

RPC(远程过程调用)是什么

  • 简单的说,RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果。
  • RPC 会隐藏底层的通讯细节(不需要直接处理Socket通讯或Http通讯)
  • RPC 是一个请求响应模型。客户端发起请求,服务器返回响应(类似于Http的工作方式)
  • RPC 在使用形式上像调用本地函数(或方法)一样去调用远程的函数(或方法)

你是不是觉得,有了http的web服务,我们直接使用它不就好了,省得那么麻烦(概念和操作都很麻烦)。我只能说,您想多了,我们是需要自己实现的。What?Why?How?震惊三联......

RPC的思想就是实现类似本地过程调用,当然要无限接近这个过程。那么就需要提高远程过程调用的执行速度让其性能接近本地。这才是目的。HTTP的请求报文分为请求行,请求头和请求体,这里面会包含一些没有意义的数据,网络传输的数据量增大,减弱了传输性能,因此这种方式不可取。那么怎么办呢?我们可以自定义一种通讯数据的格式以及控制网络传输过程。这也是我们常用的方式。

优缺点

相比与传统HTTP的实现而言,优点就是效率高;发起RPC调用的一方,在编写代码时可忽略RPC的具体实现,如同编写本地函数调用一样。缺点就是通用性不怎么好。因为传输的数据不是HTTP协议格式,所以调用双方需要专门实现的通信库,对于不同的编程语言都要有相关实现。而HTTP作为一个标准协议,大部分的语言都已经有相关的实现,通用性要好的多。HTTP更多的是面向用户和产品服务器的通讯,RPC更多的是面向产品内部服务器间的通讯。

REST与RPC对比

 其实没有对比的必要,REST和RPC都常用于微服务架构中,rest的实现方式是基础超文本传输协议HTTP,Rpc的实现方式不局限于Http,还可以包括tcp等协议。

  1)HTTP相对更规范,更标准,更通用,无论哪种语言都支持http协议。如果你是对外开放API,例如开放平台,外部的编程语言多种多样,你无法拒绝对每种语言的支持,现在开源中间件,基本最先支持的几个协议都包含RESTful。

 2)RPC 框架作为架构微服务化的基础组件,它能大大降低架构微服务化的成本,提高调用方与服务提供方的研发效率,屏蔽跨进程调用函数(服务)的各类复杂细节。让调用方感觉就像调用本地函数一样调用远端函数、让服务提供方感觉就像实现一个本地函数一样来实现服务

流行的RPC框架

 1)gRPC是Google最近公布的开源软件,基于最新的HTTP2.0协议,并支持常见的众多编程语言。 我们知道HTTP2.0是基于二进制的HTTP协议升级版本,目前各大浏览器都在快马加鞭的加以支持。 这个RPC框架是基于HTTP协议实现的,底层使用到了Netty框架的支持。

 2)Thrift是Facebook的一个开源项目,主要是一个跨语言的服务开发框架。它有一个代码生成器来对它所定义的IDL定义文件自动生成服务代码框架。用户只要在其之前进 行二次开发就行,对于底层的RPC通讯等都是透明的。

 3)Dubbo是阿里集团开源的一个极为出名的RPC框架,在很  多  互联网公司和企业应用中广泛使用。协议和序列化框架都可以插拔是及其鲜明的特色。同样 的远程接口是基于Java Interface,并且依托于spring框架方便开发。可以方便的打包成单一文件,独立进程运行,和现在的微服务概念一致

示例

最后,分享一个GRPC框架的小示例:HellowGrpc.rar (1.42 mb)  。相关的帮助文档:微软grpc官方文档  Grpc官方中文文档:gRPC 官方文档中文版

评论 (1) -

添加评论

Loading