手写RPC框架--zookeeper为注册中心

上一次写了一个无注册中心的RPC,今天在前面的基础之上扩展为带注册中心的RPC框架。

先把provider整体代码目录

手写RPC框架--zookeeper为注册中心_第1张图片

自定义一个注解Service,其中有参数interfaceName、version。这个主要是模仿dubbo的Service注解:源码如下

手写RPC框架--zookeeper为注册中心_第2张图片

注册到zookeeper上,也就是在zookeeper上创建节点。

手写RPC框架--zookeeper为注册中心_第3张图片

具体注册类,采用Curator来连接和操作zookeeper。

手写RPC框架--zookeeper为注册中心_第4张图片

常量类

手写RPC框架--zookeeper为注册中心_第5张图片

常量类链接地址我这里是写死的并且是单机,如果采用集群的话,可以写成public final static String CONNNECTION_STR

="192.168.1.10:2181,192.168.1.11:2181,192.168.1.12:2181";

至于第二个参数PATH这个自己爱好来吧。

手写RPC框架--zookeeper为注册中心_第6张图片

RpcRequest参数中多了一个version,这就是应对客户端调用的时候穿来的RPC服务版本号。与之对应的是咱们自定义注解@Service中的version。

手写RPC框架--zookeeper为注册中心_第7张图片

手写RPC框架--zookeeper为注册中心_第8张图片

处理请求和无注册中心的版本差不多。

手写RPC框架--zookeeper为注册中心_第9张图片

手写RPC框架--zookeeper为注册中心_第10张图片

创建一个线程池用于处理消费方的请求。绑定服务名称和服务对象。

然后发布服务(就是去zookeeper的某个指点节点下面创建节点)。

手写RPC框架--zookeeper为注册中心_第11张图片

然后启动

手写RPC框架--zookeeper为注册中心_第12张图片

zookeeper上

手写RPC框架--zookeeper为注册中心_第13张图片

OK。现在服务以及发布注册成功。

继续consumer端

手写RPC框架--zookeeper为注册中心_第14张图片

因为添加了注册中心zookeeper,也就是发现服务

手写RPC框架--zookeeper为注册中心_第15张图片

手写RPC框架--zookeeper为注册中心_第16张图片

手写RPC框架--zookeeper为注册中心_第17张图片

采用Curator连接和操作zookeeper。动态发现服务采用监听模式,通过动态发现服务获取服务列表repos。一旦服务端在path节点下的子节点有变动,则会出发监听重新拉取服务列表(动态更新服务列表,比如说一台服务挂掉、重启、新增服务等时候,这个服务列表也会跟着更新)。然后采用负载均衡算法得出即将要调用的url地址,这里采用的是策略模式(你只要选择你要的负载均衡算法就可以了,至于算法里面是怎么实现,你是不需要知道的。类似的列子:你要手机购物时候付款,你可以选择支付宝或者微信或者银行卡等支付方式中一种就可以了,至于支付里面是怎么实现的你根本就不需要知道)。

策略模式优点:

  1. 通过策略类的等级结构来管理算法族。

  2. 避免使用将采用哪个算法的选择与算法本身的实现混合在一起的多重条件(if-else if-else)语句。

策略模式缺点:

  1. 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。

  2. 由于策略模式把每个算法的具体实现都单独封装成类,针对不同的情况生成的对象就会变得很多。

手写RPC框架--zookeeper为注册中心_第18张图片

负载均衡接口

手写RPC框架--zookeeper为注册中心_第19张图片

负载均衡抽象类,这里采用了模板方法模式。具体实现选举的算法是对应的子类里自己去实现。

模板方法模式总结:

先说优点:

  1、封装性好 

   2、复用性好、  

   3、屏蔽细节 

   4、便于维护

至于缺点:

   继承问题,在JAVA里只能继承一个父类。

使用流程:

    分析场景-->步骤抽取-->重构代码-->重要、复杂的算法,核心算法设计为模版

应用注意点:

  • 模版方法需要声明成 public final

  • private方法是基本逻辑

  • protect abstract 方法是可扩展方法

手写RPC框架--zookeeper为注册中心_第20张图片

手写RPC框架--zookeeper为注册中心_第21张图片

这里加单写了两个实现类。

手写RPC框架--zookeeper为注册中心_第22张图片

手写RPC框架--zookeeper为注册中心_第23张图片

请求处理没有变化。

手写RPC框架--zookeeper为注册中心_第24张图片

采用JDK动态代理调用远程服务。

     

手写RPC框架--zookeeper为注册中心_第25张图片

组装请求信息并发送请求

手写RPC框架--zookeeper为注册中心_第26张图片

运行结果:

手写RPC框架--zookeeper为注册中心_第27张图片

再次证明调用成功并且负载均衡算法也是成功的。

OK!!!!以上便是自己手写的带注册中心(zookeeper)的RPC框架。

后期会更多的优化和扩展

你可能感兴趣的:(手写RPC框架--zookeeper为注册中心)