RPC框架原理及从零实现系列博客(一):思路篇

前段时间以为本身一直用别人的框架,站在巨人的肩膀上,也该本身造造轮子了

一时兴起 就着手写起了RPC框架 这里写了系列博客拿给你们分享下

这篇是开篇的思路篇 项目最终的代码放在了个人github上
https://github.com/wephone/Me...
欢迎star,提issuesgit

首先说下关于RPC的几个常见问题github

什么是RPC

PRC:Remote Procedure Call 远程过程调用
在分布式系统中,每一个节点之间的通讯都是靠RPC来完成 RPC是分布式应用的基本组件web

常见的RPC框架

Apache的Thrift
Google的gprc
阿里巴巴的dubbo等
dubbo应该是3这中最简单易用的了,但dubbo只支持Java语言,thrift和gprc都是支持跨语言的,而且dubbo内部帮你实现了对分布式注册中心zookeeper的使用,另外两个仍需本身实现对注册中心的操做。
thrift grpc等之因此支持跨语言,是由于他们本身定义了一套结构化数据存储格式,如Google的protobuf,用于编解码对象,做为各个语言通讯的中间协议。spring

RPC和HTTP请求有什么区别

RPC是一个概念,普通web开发的curl rest接口,也能够算做一种基于HTTP协议的RPC调用
RPC的使用比起curl一个重要的点就是忽略底层细节,像使用本地服务同样调用远程服务 咱们将在RPC框架中使用动态代理来实现这个要求json


本系列博客由浅到深,带你们打造一个支持跨语言,也支持zookeeper的RPC框架 目前先用Java实现设计模式

实现思路

  • RPC有两个使用方 一个是本地调用端 一个是远程实现端
  • 调用端使用动态代理 代理咱们须要远程调度的接口 实现忽略底层细节 像使用本地服务同样使用调用远程服务
  • 将咱们本地调用的接口方法信息(形参,方法名,返回类型等)经过网络发送至远程实现端
  • 远程实现端接收到相应信息,反射调用对象的实现类
  • 执行完实现类后把返回值发回给调用端
  • 调用端接收到返回值,代理返回结果 远程调用完毕

实现细节

  • 使用Netty做为Java端网络传输框架
  • 为尽可能支持跨语言 传输数据编解码使用json格式(原本想用protobuf 但它只支持强类型Int这种 不支持编解码Object这样的弱类型 会下降使用的灵活性)

下一篇博客中 将带你们用11个Java类 实现一个基于spring的Java RPC框架
暂时不使用一些常见设计模式,暂时不作zookeeper的支持和异常处理等细节问题网络

后续版本再对这个demo进行优化,并支持zookeeper框架

相关文章
相关标签/搜索