RPC 前言
一个阳光明媚的早晨,老婆在翻看我订阅的技术杂志。
“老公,什么是RPC 呀,为什么你们程序员有那么多的黑话!”,老婆还是一如既往的好奇。
“RPC,就是Remote Proceduce Call 的简称呀,翻译成中文就是远程过程调用嘛”,我一边看着书,一边漫不经心的回答着。
“啥,你在说啥》谁不知道翻译成中文是什么意思?你个废柴,快给我去洗碗!”
“我去。。。”,我入门初醒,我对面坐着的可不是一个程序员,为了不去洗碗,我瞬间调动起全部脑细胞,星辰大海在我脑中汇聚,灵感涌现。。。
“是这样,远程过程调用,自然是相对于本地过程调用来说嘛。”
“嗯哼,那先给老娘讲讲,本地调用过程是啥子?”
“本地过程调用,就好比你现在在家里,你想要洗碗,那你直接把碗放进洗碗机,打开洗碗机开关就可以洗了。这就叫本地过程调用。”
“哎呦,我可不干,那啥是远程过程调用?”
“远程嘛,那就是你现在不在家,跟姐妹们浪去了,突然发现碗还没洗,打了个电话过来,叫我去洗碗,这就是远程过程调用”,多么通俗易懂的解释,我真是天才。
“哦!我明白了”,说着,老婆开始收拾包包。
“你这是干啥去哦”
“我?我要出门浪去呀,待会记得接收我得远程调用哦,哦不,咱们要专业点,应该说记得接收我得RPC 哦!”
……
RPC 简介
RPC (Remote Procedure Call),即远程过程调用。
RPC 的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。
RPC 调用分类:
- 同步调用:
客户方等待调用执行完成并返回结果。 - 异步调用:
客户方调用后不用等待执行结果返回,但依然可以通过回调通知等方式获取返回结果。
若客户方不关心调用返回结果,则变成单向异步调用,单向调用不用返回结果。
RPC 调用过程
RPC 具体的调用过程:
即客户端在本地通过访问远程的注册中心获取对应方法的实例,通过实例调用对应的方法获取返回值,这个整体的流程就是远程过程调用。
RPC 中具体的模块:
主要包含客户端模块、服务端模块、协议模块、网络模块、序列化模块。
其中主要涉及到的有序列化、反序列化、网络传输、传输协议、编码、解码、异常处理等内容。
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 | Apache | 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 的源码会有很大的帮助,知道了哪里是重点,知道了那里是难点。
所以还是得天天学习啊。
引用
个人备注
此博客内容均为作者学习所做笔记,侵删!
若转作其他用途,请注明来源!