美文网首页
RPC学习——带注册中心

RPC学习——带注册中心

作者: 扯闲话 | 来源:发表于2020-07-15 17:41 被阅读0次

    CuratorFramework

    CuratorFramework 是Netflix公司开发一款连接zookeeper服务的框架,提供了比较全面的功能,除了基础的节点的操作,节点的监听,还有集群的连接以及重试。


    服务发布端

    服务注册接口和服务注册实现类 :IRegistryCenter & RegistryCenterImpl

    方法名 :register,注册相应服务_____________________________________________________________

    服务端类:RpcServer

    方法名:bind,绑定服务名称和服务对象

    方法名:publisher,发布服务_____________________________________________________________

    任务处理类:ProcessorHandler

    方法名:run,该类实现了Runnable,利用线程池可以实现生产者——消费者模式

    服务发布流程

    类的实例化

    IRegistryCenter registryCenter = new RegistryCenterImpl();--注册对象实例化

    RpcServer rpcServer = new RpcServer(registryCenter,"127.0.0.1:12345");服务对象实例化_____________________________________________________________

    发布流程

    1、rpcServer.bind(new HelloServiceImpl());将com.withregistry.myrpc.demo.IHelloService和HelloServiceImpl 绑定(HelloServiceImpl  实现了IHelloService)

    2、rpcServer.publisher();开始发布服务——>调用register注册相应服务(注册节点,注册节点下的临时节点)——>注册成功之后,利用线程池的生产者-消费者模型进行等待(Socket进行通信)——>收到客户端请求之后(通过ServerSocket获取请求),线程池执行execute方法,任务处理类(实现Runnable)的run方法开始工作——>反序列化请求,得到Request对象——>执行自建的invoke方法,利用Request对象得到方法的入参和方法名——>利用方法执行Method的invoke方法(invoke的时候,会找到HelloServiceImpl类,它实现了IHelloService接口),得到最后的值_____________________________________________________________

    总结

    服务端一共做了两个事情,一是向zk上面注册永久节点(/rpcNode/com.withregistry.myrpc.demo.IHelloService)和临时节点(127.0.0.1:12345)

    二是利用线程池的特性,接受生产者-消费者模型的调用



    服务消费端

    服务发现接口和服务发现接口实现类:IServiceDiscovery & ServiceDiscoveryImpl

    方法名:discover,根据接口名称发现服务调用地址_____________________________________________________________

    客户端代理类:RpcClientProxy

    方法名:clientProxy,创建代理对象_____________________________________________________________

    实际代理类:RemoteInvocationHandler

    方法名:invoke,利用Proxy生成的代理对象调用方法时,会走到这个方法。____________________________________________________________

    socket传输类:TcpTransport

    方法名:newSocket,新建一个socket对象

    方法名:send,发送请求___________________________________________________________

    负载顶层接口和实现:LoadBalance & AbstractLoadBanance &RandomLoadBanalce

    方法名:selectHost & doSelect,实现具体的实现负载算法

    服务调用过程

    类的实例化

    IServiceDiscovery serviceDiscovery = new ServiceDiscoveryImpl(RegistryCenterConfig.CONNECTING_STR);服务发现类实例化,带127.0.0.1地址

    RpcClientProxy proxy = new RpcClientProxy(serviceDiscovery); 客户端代理类实例化____________________________________________________________

    调用流程

    1、proxy.clientProxy(IHelloService.class);获取被代理类(RemoteInvocationHandler代理类)

    2、service.sayHello("张三");开始代理调用(此处就确定了方法名和入参)——>执行RemoteInvocationHandler(代理类)的invoke方法,将请求封装在RpcRequest实体类中——>调用discover方法从ZK中获取地址(用了CuratorFramework类的方法),如果有集群的情况,则调用负载均衡算法获取地址——>调用TcpTransport的send方法,新建socket连接,序列号对象,发送对象,获得结果。____________________________________________________________

    总结

    调用端一共做了两个事情。一是去获取地址,二是利用socket发送包装好的Request请求



    服务端和客户端的Socket会注册统一端口。

    socket接口ObjectInputStream&ObjectOutputStream使用

    参考:

    java的动态代理机制详解

    手写实现RPC框架(带注册中心)

    相关文章

      网友评论

          本文标题:RPC学习——带注册中心

          本文链接:https://www.haomeiwen.com/subject/snfjhktx.html