v1.6

热补丁,nio目前来看最后的完善,使用Curator简化zookeeper的操作,优化调用体验

  • 使用Curator创建服务注册和服务发现类(是看快速开始速成的)

    • 服务注册类实现代码

      package provider.service_registry;import constants.RpcConstants;
      import org.apache.curator.framework.CuratorFramework;
      import org.apache.curator.framework.CuratorFrameworkFactory;
      import org.apache.curator.retry.ExponentialBackoffRetry;import java.nio.charset.StandardCharsets;//通过curator简化 zookeeper对相应的服务端服务注册的流程 更轻松的看懂
      public class ZkCuratorRegistry {private static String connectString = RpcConstants.ZOOKEEPER_ADDRESS;public static void registerMethod(String RpcServiceName, String hostname, int port) throws Exception {//创建连接 然后将对应的对象注册进去即可//BackoffRetry 退避策略,决定失败后如何确定补偿值。//ExponentialBackOffPolicy//指数退避策略,需设置参数sleeper、initialInterval、// maxInterval和multiplier,initialInterval指定初始休眠时间,默认100毫秒,// maxInterval指定最大休眠时间,默认30秒,multiplier指定乘数,即下一次休眠时间为当前休眠时间*multiplier;CuratorFramework client = CuratorFrameworkFactory.newClient(connectString,new ExponentialBackoffRetry(1000, 3));//需要启动  当注册完毕后记得关闭 不然会浪费系统资源client.start();//进行创建  首先先判断是否创建过service还有对应的方法路径 是这样判断 但是我可能还没有完全玩透curator//多线程问题 一定要进行加锁synchronized (ZkCuratorRegistry.class){if (client.checkExists().forPath("/service")==null){client.create().forPath("/service","".getBytes(StandardCharsets.UTF_8));}if (client.checkExists().forPath("/service/"+RpcServiceName)==null){client.create().forPath("/service/"+RpcServiceName,"".getBytes(StandardCharsets.UTF_8));}}String date = hostname+":"+port;client.create().forPath("/service/"+RpcServiceName+"/"+date,"0".getBytes(StandardCharsets.UTF_8));client.close();System.out.println("服务端:"+hostname+":"+port+":"+RpcServiceName+"方法在zkCurator中注册完毕");}
      }
    • 服务发现类实现代码
      服务发现端没有强行改,因为要保证我们负载均衡算法的完整性,不强行的进行改动了,读者如需改动可以自己尝试,curator并不是很难 主要就加了下面这段,后面的逻辑还是和之前的一样。

        CuratorFramework client = CuratorFrameworkFactory.newClient(connectString,new ExponentialBackoffRetry(1000, 3));//需要启动  当获取完毕后需要关闭相应的客户端client.start();//首先获取的时候 要负载均衡ZooKeeper zooKeeper = client.getZookeeperClient().getZooKeeper();
      
  • 优化调用体验

    • 将部分改动代码上传

      • 用户启动类

        //通用启动类 将启动的逻辑藏在ClientBootStrap中
        public class ClientCall {public static void main(String[] args) throws IOException, RpcException {Customer customer = ClientBootStrap.start();//实现调用System.out.println(customer.Hello("success"));System.out.println(customer.Bye("fail"));System.out.println(customer.Hello("fail"));}
        }
      • 实际引导启动类

        //1.2版本之前都是键盘输入 所以不是根据代理对象来进行调用的  暂时注释掉// case "1.0"://     NIOConsumerBootStrap10.main(null);//     break;// case "1.1"://     NIOConsumerBootStrap11.main(null);//     break;case "1.2":return NIOConsumerBootStrap12.main(null);case "1.4":return NIOConsumerBootStrap14.main(null);case "1.5":return NIOConsumerBootStrap15.main(null);default:throw new RpcException("太着急了兄弟,这个版本还没出呢!要不你给我提个PR");
        
      • nio实际启动端

        public class NIOConsumerBootStrap12 {public static Customer main(String[] args) throws IOException {RpcClientProxy clientProxy = new RpcClientProxy();return (Customer) clientProxy.getBean(Customer.class);}
        }
        
  • 总结
    改动不大,用curator实现zookeepper注册中心提供更清晰的代码,效率上是没有什么差别的,降低了使用的复杂性,修改了下 几个启动类 直接让用户自己进行方法的选取调用

手写RPC框架(八)相关推荐

  1. 手写篇:如何手写RPC框架?

    手写篇:如何手写RPC框架? 首先我们讲下什么是RPC? RPC(Remote Procedure Call)远程过程调用协议,他是一种通过网络从远程计算机程序请求服务.简单的来说,就是通过网络进行远 ...

  2. MyRPCDemo netty+jdk动态代理+反射+序列化,反序列化手写rpc框架

    RPC RPC(remote procedure call)远程过程调用 RPC是为了在分布式应用中,两台主机的Java进程进行通信,当A主机调用B主机的方法时,过程简洁,就像是调用自己进程里的方法一 ...

  3. 第四篇 - 手写RPC框架

    Github源码下载地址:https://github.com/chenxingxing6/myrpc 一.前言 RPC(Remote Procedure Call)-远程过程调用,它是一种通过网络从 ...

  4. 手写RPC框架(六)

    v1.4 小更新 更新事项 暂定目标对启动类进行修改 直接集合 这个就直接看代码吧 不是特别难 难的地方我会点出来 启动引导类直接进行修改 可以传参 可以这样 当然 我想到了可以注解传参 注解构造 注 ...

  5. 手写RPC框架(十六)

    v2.7 更新:实现CGLIB动态代理 实现CGLIB动态代理 实现一下统一调用代理类,创建总调用类,和对应模板接口,调用注解,同时在每个consumerbootstrap进行修改 对应模板接口 pa ...

  6. 手写RPC框架(五)

    v1.3 (启动器依旧使用1.2 1.3版本在启动服务版本上尚未做出大变动 主要是增加了方便学习的功能) 更新事项 以下更新均在非阻塞模块进行更新,阻塞模块可供读者自己尝试 使用注解方式 改造一下启动 ...

  7. Marco's Java【Dubbo 之手写Dubbo框架实现远程调用】

    前言 关于Dubbo入门的网上教程也特别多,因此我没有专门出关于Dubbo的系列博文(主要呢- 也是在忙些工作上的事儿),用Dubbo特别简单,但是想要把Dubbo学好,学精还得花费不少时间的,特别是 ...

  8. c++socket多个客户端通过不同端口与一个服务端通信_手写RPC,深入底层理解整个RPC通信...

    一.前言 RPC,远程过程调用,调用远程方法像调用本地方法一样.RPC交互分为客户端和服务端,客户端调用服务端方法,服务端接收数据并打印到控制台,并response响应给客户端. RPC和HTTP的联 ...

  9. 手写RPC(一) 絮絮叨叨

    目录 前言 我的知识库 学会了? 学不动了? 前言 提到RPC(Remote Procedure Call)大家应该都不陌生,特别是像我一样做web开发的,可以说天天和rpc打交道.常见的rpc框架主 ...

最新文章

  1. 首次发现:你的大脑“指纹”,全球独一份
  2. linux虚拟网络设备-- TUN/TAP MACVLAN MACVTAP(八)
  3. python能爬视频吗_Python爬取视频(其实是一篇福利)
  4. what companies will vc invest?
  5. K8S部署工具:KubeOperator集群导入
  6. IOS 企业版发布后,用户通过sarafi浏览器安装无效的解决方案
  7. 统计学第二章--感知机
  8. 现代软件工程讲义 5 项目经理 Program Manager
  9. 如何给小朋友解释单摆运动_单摆的教案
  10. oracle分区唯一索引,关于分区表与唯一索引的测试记录
  11. 用框架名唬人谁都会,那你知道Web开发模式吗?——莫问前程莫装逼
  12. C#Excel导入导出以及导出为txt文件
  13. 微信云支付的扫码支付
  14. 计算机无法连接打印机主机,打印机无法连接电脑问题的处理方法
  15. 华为达芬奇AI芯片架构
  16. Lightly:新一代的 Cloud IDE
  17. C语言毕业设计 图书管理系统
  18. 小米应用市场关键词覆盖技巧,小米关键词优化
  19. 初学STM32之定时器中断
  20. 关于传智播客视频教程的解压方法

热门文章

  1. Enriched Long-term Recurrent Convolutional Network for Facial Micro-Expression Recognition阅读笔记
  2. 用户标签(一):图计算实现ID_Mapping、Oneid打通数据孤岛
  3. 外贸怎么打造自己的品牌,搭建自己的独立站?B2B转B2C未来怎么样呢?
  4. 【UML】UML交互图(顺序图和通信图)
  5. Android 各版本特性(Android6-14)
  6. linux系统安装arcsde,Ubuntu下安装ArcSDE 9.1 [图文]
  7. Wins服务器删除和逻辑删除记录
  8. Centos7 Firewall 防火墙配置规则
  9. 创建合同-contract及应用
  10. Ubuntu查看cuDNN版本