guide-rpc-framework
本着开源精神,本项目README已经同步了英文版本。另外,项目的源代码的注释大部分也修改为了英文。
如访问速度不佳,可放在Gitee地址:https://gitee.com/SnailClimb/guide-rpc-framework。如果要提交issue或者pr的话,请在Github提交:[https://github.com/Snailclimb/guide-rpc-framework]
前言
虽说RPC的原理实际不难,但是,自己在实现的过程中自己也遇到了很多问题。[guide-rpc-framework]目前只实现了RPC框架最基本的功能,一些可优化点都在下面提到了,有兴趣的小伙伴可以自行完善。
通过这个简易的轮子,你可以学到RPC的底层原理和原理以及各种Java编码实践的运用。
你甚至可以把[guide-rpc-framework]当做你的毕设/项目经验的选择,这是非常不错!对比其他求职者的项目经验都是各种系统,造轮子肯定是更加能赢得面试官的青睐。
如果你要将[guide-rpc-framework]当做你的毕设/项目经验的话,我希望你一定要搞懂,而不是直接复制粘贴我的思想。你可以fork我的项目,然后进行优化。如果你觉得的优化是有价值的话,你可以提交PR给我,我会尽快处理。
介绍
[guide-rpc-framework]是一款基于Netty+Kyro+Zookeeper实现的RPC框架。代码注释详细,结构清晰,并且集成了CheckStyle规范代码结构,非常适合阅读和学习。
由于Guide哥自身精力和能力有限,如果大家觉得有需要改进和完善的地方的话,欢迎fork本项目,然后clone到本地,在本地修改后提交PR给我,我会在第一时间Review你的代码。
**我们先从一个基本的RPC框架设计思路说起!**
一个基本的RPC框架设计思路
>**注意**:我们这里说的RPC框架指的是:可以让客户端直接调用服务端方法就像调用本地方法一样简单的框架,比如我前面介绍的Dubbo、Motan、gRPC这些。如果需要和HTTP协议打交道,解析和封装HTTP请求和响应。这类框架并不能算是“RPC框架”,比如Feign。
一个最简单的RPC框架使用示意图如下图所示,这也是[guide-rpc-framework](https://github.com/Snailclimb/guide-rpc-framework)目前的架构:
服务提供端Server向注册中心注册服务,服务消费者Client通过注册中心拿到服务相关信息,然后再通过网络请求服务提供端Server。
作为RPC框架领域的佼佼者[Dubbo](https://github.com/apache/dubbo)的架构如下图所示,和我们上面画的大体也是差不多的。
**一般情况下,RPC框架不仅要提供服务发现功能,还要提供负载均衡、容错等功能,这样的RPC框架才算真正合格的。**
**简单说一下设计一个最基本的RPC框架的思路:**
1.**注册中心**:注册中心首先是要有的,推荐使用Zookeeper。注册中心负责服务地址的注册与查找,相当于目录服务。服务端启动的时候将服务名称及其对应的地址(ip+port)注册到注册中心,服务消费端根据服务名称找到对应的服务地址。有了服务地址之后,服务消费端就可以通过网络请求服务端了。2.**网络传输**:既然要调用远程的方法就要发请求,请求中至少要包含你调用的类名、方法名以及相关参数吧!推荐基于NIO的Netty框架。3.**序列化**:既然涉及到网络传输就一定涉及到序列化,你不可能直接使用JDK自带的序列化吧!JDK自带的序列化效率低并且有安全漏洞。所以,你还要考虑使用哪种序列化协议,比较常用的有hession2、kyro、protostuff。4.**动态代理**:另外,动态代理也是需要的。因为RPC的主要目的就是让我们调用远程方法像调用本地方法一样简单,使用动态代理可以屏蔽远程方法调用的细节比如网络传输。也就是说当你调用远程方法的时候,实际会通过代理对象来传输网络请求,不然的话,怎么可能直接就调用到远程方法呢?5.**负载均衡**:负载均衡也是需要的。为啥?举个例子我们的系统中的某个服务的访问量特别大,我们将这个服务部署在了多台服务器上,当客户端发起请求的时候,多台服务器都可以处理这个请求。那么,如何正确选择处理该请求的服务器就很关键。假如,你就要一台服务器来处理该服务的请求,那该服务部署在多台服务器的意义就不复存在了。负载均衡就是为了避免单个服务器响应同一请求,容易造成服务器宕机、崩溃等问题,我们从负载均衡的这四个字就能明显感受到它的意义。6.......
项目基本情况和可优化点
为了循序渐进,最初的是时候,我是基于传统的**BIO**的方式**Socket**进行网络传输,然后利用**JDK自带的序列化机制**来实现这个RPC框架的。后面,我对原始版本进行了优化,已完成的优化点和可以完成的优化点我都列在了下面
评论