对RPC实现原理机制一知半解?这可是入行多年的老手都难深入理解的命题
Posted 开课吧订阅号
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对RPC实现原理机制一知半解?这可是入行多年的老手都难深入理解的命题相关的知识,希望对你有一定的参考价值。
随着这段日子公司项目微服务化的演进,发现在日常开发中都在隐式或显式的使用 RPC。
什么是RPC
RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
也就是说两台服务器A、B,一个应用部署在A服务器上,想要调用B服务器上应用提供的方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。
RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。
在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。现在业界有很多开源的优秀 RPC 框架,例如 Spring Cloud、Dubbo、Thrift 等。
RPC起源
RPC这个概念术语在上世纪80年代由Bruce Jay Nelson提出。这里我们追溯下当初开发RPC的原动机是什么?在Nelson的论文“Implementing Remote Procedure Calls” 中他提到了几点:
简单:RPC 概念的语义十分清晰和简单,这样建立分布式计算就更容易。
高效:过程调用看起来十分简单而且高效。
通用:在单机计算中过程往往是不同算法部分间最重要的通信机制。
通俗一点说,就是一般程序员对于本地的过程调用很熟悉,那么我们把 RPC 作成和本地调用完全类似,那么就更容易被接受,使用起来毫无障碍。
Nelson 的论文发表于 30 年前,其观点今天看来确实高瞻远瞩,今天我们使用的 RPC 框架基本就是按这个目标来实现的。
RPC结构
-
User -
User-stub -
RPCRuntime -
Server-stub -
Server
RpcServer - 负责导出(export)远程接口
RpcClient - 负责导入(import)远程接口的代理实现
RpcProxy - 远程接口的代理实现
RpcInvoker -
客户方实现:负责编码调用信息和发送调用请求到服务方并等待调用结果返回
服务方实现:负责调用服务端接口的具体实现并返回调用结果
RpcProtocol - 负责协议编/解码
RpcConnector - 负责维持客户方和服务方的连接通道和发送数据到服务方
RpcAcceptor - 负责接收客户方请求并返回请求结果
RpcProcessor - 负责在服务方控制调用过程,包括管理调用线程池、超时时间等
RpcChannel - 数据传输通道
RPC工作原理
-
Client像调用本地服务似的调用远程服务; -
Client stub接收到调用后,将方法、参数序列化 -
客户端通过sockets将消息发送到服务端 -
Server stub 收到消息后进行解码(将消息对象反序列化) -
Server stub 根据解码结果调用本地的服务 -
本地服务执行(对于服务端来说是本地执行)并将结果返回给Server stub -
Server stub将返回结果打包成消息(将结果消息对象序列化) -
服务端通过sockets将消息发送到客户端 -
Client stub接收到结果消息,并进行解码(将结果消息反序列化) 客户端得到最终结果。
RPC 调用分以下两种:
-
同步调用:客户方等待调用执行完成并返回结果。 -
异步调用:客户方调用后不用等待执行结果返回,但依然可以通过回调通知等方式获取返回结果。若客户方不关心调用返回结果,则变成单向异步调用,单向调用不用返回结果。
RPC能干什么
部署灵活
解耦服务
扩展性强
总结
比如,既然是分布式了,那么一个服务可能有多个实例,你在调用时,要如何获取这些实例的地址呢?这时候就需要一个服务注册中心,比如在Dubbo中,就可以使用Zookeeper作为注册中心,在调用时,从Zookeeper获取服务的实例列表,再从中选择一个进行调用。
干货福利
听说,后台回复:Java入门,即可领取哦 以上是关于对RPC实现原理机制一知半解?这可是入行多年的老手都难深入理解的命题的主要内容,如果未能解决你的问题,请参考以下文章