您的位置:首页 > 编程语言 > Java开发

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

2018-01-14 00:00 288 查看
摘要: 什么是RPC? 常见的RPC框架有哪些?
RPC和普通HTTP调用什么区别?
怎么实现RPC?RPC的原理是什么? 这一系列文章将给你答案

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

什么是RPC

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

常见的RPC框架

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

RPC和HTTP请求有什么区别

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

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

实现思路

RPC有两个使用方 一个是本地调用端 一个是远程实现端

调用端使用动态代理 代理我们需要远程调度的接口 实现忽略底层细节 像使用本地服务一样使用调用远程服务

将我们本地调用的接口方法信息(形参,方法名,返回类型等)通过网络发送至远程实现端

远程实现端接收到相应信息,反射调用对象的实现类

执行完实现类后把返回值发回给调用端

调用端接收到返回值,代理返回结果 远程调用完毕

实现细节

使用Netty作为Java端网络传输框架

为尽量支持跨语言 传输数据编解码使用json格式(本来想用protobuf 但它只支持强类型Int这种 不支持编解码Object这样的弱类型 会降低使用的灵活性)

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

后续版本再对这个demo进行优化,并支持zookeeper
项目最终的代码放在了我的github上
MeiZhuoRPC
欢迎star,提issues
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java rpc Netty