RPC详解

RPC 前言

一个阳光明媚的早晨,老婆在翻看我订阅的技术杂志。
“老公,什么是RPC 呀,为什么你们程序员有那么多的黑话!”,老婆还是一如既往的好奇。
“RPC,就是Remote Proceduce Call 的简称呀,翻译成中文就是远程过程调用嘛”,我一边看着书,一边漫不经心的回答着。
“啥,你在说啥》谁不知道翻译成中文是什么意思?你个废柴,快给我去洗碗!”
“我去。。。”,我入门初醒,我对面坐着的可不是一个程序员,为了不去洗碗,我瞬间调动起全部脑细胞,星辰大海在我脑中汇聚,灵感涌现。。。

“是这样,远程过程调用,自然是相对于本地过程调用来说嘛。”
“嗯哼,那先给老娘讲讲,本地调用过程是啥子?”
“本地过程调用,就好比你现在在家里,你想要洗碗,那你直接把碗放进洗碗机,打开洗碗机开关就可以洗了。这就叫本地过程调用。”

“哎呦,我可不干,那啥是远程过程调用?”
“远程嘛,那就是你现在不在家,跟姐妹们浪去了,突然发现碗还没洗,打了个电话过来,叫我去洗碗,这就是远程过程调用”,多么通俗易懂的解释,我真是天才。

“哦!我明白了”,说着,老婆开始收拾包包。
“你这是干啥去哦”
“我?我要出门浪去呀,待会记得接收我得远程调用哦,哦不,咱们要专业点,应该说记得接收我得RPC 哦!”

……


RPC 简介

RPC (Remote Procedure Call),即远程过程调用。

RPC 的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。

RPC 调用分类:

  • 同步调用:
    客户方等待调用执行完成并返回结果。
  • 异步调用:
    客户方调用后不用等待执行结果返回,但依然可以通过回调通知等方式获取返回结果。
    若客户方不关心调用返回结果,则变成单向异步调用,单向调用不用返回结果。

RPC 调用过程

RPC 具体的调用过程:
8kOemR.png

即客户端在本地通过访问远程的注册中心获取对应方法的实例,通过实例调用对应的方法获取返回值,这个整体的流程就是远程过程调用。

RPC 中具体的模块:
8kOm01.png

主要包含客户端模块、服务端模块、协议模块、网络模块、序列化模块。
其中主要涉及到的有序列化、反序列化、网络传输、传输协议、编码、解码、异常处理等内容。


RPC 与REST API 对比

说到RPC 和REST 之间的对比,那你脑子里肯定第一个念头就是API设计风格的不同。

RPC 主要用于面向过程,倾向于描述动作本身。
REST 主要用于面向资源,倾向于动作要操作的对象。

具体的不同可以看看这个链接:https://zhuanlan.zhihu.com/p/66311537


常见的RPC 框架

thirft

Facebook开源的跨语言RPC框架。

gRPC

由Google开发,高性能开源的通用RPC架构,面向移动和HTTP/2的设计。
支持C、 C++、 Node.js、 Python、 Ruby、 Objective-C、 PHP 和 C# 。
服务接口定义在.proto文件中,因为本身它不是分布式的,所以要实现上面的框架的功能需要进一步的开发。
跨语言,针对移动端:省电、省流量、高性能、双向流、支持DNS负载。
关于性能,肯定比HTTP/1好,比TCP差。
序列化:默认使用protocol buffer实现。也支持json等。
通讯:gRPC使用的http2.0

Dubbo

阿里巴巴公司开源的一个Java高性能优秀的服务框架,可以和Spring框架无缝集成,相关资料很丰富。

RMI

基于java的远程过程调用,是java特有的RPC实现。

  • 真正支持面向对象的多态
  • 不支持其他语言
  • 使用了java原生的序列化机制,所有序列化对象必须实现serializable接口
  • 基于BIO实现的socket通讯

Hessian

采用的是二进制RPC协议,适用于发送二进制数据。但本身也是一个Web Service框架对RPC调用提供支持,功能简单,使用起来也方便。基于Http协议进行传输。通过Servlet提供远程服务。
通过Hessain本身提供的API来发起请求。响应端根据Hessian提供的API来接受请求。

对比

功能 Hessian Montan rpcx gRPC Thrift Dubbo Dubbox Spring Cloud
开发语言 跨语言 Java Go 跨语言 跨语言 Java Java Java
分布式(服务治理) × × ×
多序列化框架支持 hessian √(支持Hessian2、Json,可扩展) × 只支持(protobuf) ×(thrift格式)
多种注册中心 × × ×
管理中心 × × ×
跨编程语言 ×(支持php client和C server) × × × ×
支持REST × × × × × ×
关注度
上手难度
运维成本
开源机构 Caucho Weibo Apache Google Apache Alibaba Dangdang Apache

Dubbo 框架概述

https://vgbhfive.cn/Dubbo-%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/


实现RPC 框架

原理概述

vgbh-rpc 是以客户端和服务端为基础,通过手动在代码内部实现注册的方式来模拟远程调用来实现RPC 服务。详细的使用可以去看demo样例

基于最基础的易用性来说,不是很友好,但是若对于理解RPC 的流程来说是一个很好的敲门砖

代码

https://github.com/vgbhfive/vgbh-rpc


问题答疑


总结

自己动手写了一个小的rpc 框架实例,这对以后再去看Dubbo 的源码会有很大的帮助,知道了哪里是重点,知道了那里是难点。

所以还是得天天学习啊。


引用


个人备注

此博客内容均为作者学习所做笔记,侵删!
若转作其他用途,请注明来源!