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使用
参考:
网友评论