RPC学习——带注册中心

2020-07-15  本文已影响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框架(带注册中心)

上一篇下一篇

猜你喜欢

热点阅读