Dubbo原理笔记
RPC框架,解决服务的远程调用和治理
原理
- provider 生产者在注册中心注册。
- consumer 订阅到注册中心
- 注册中心将自己的服务返回给consumer(serviceName对应的url地址)
- Consumer使用Netty和Zookpeer直接调用provider
步骤
1、需要部署一个zk服务器(通过ZK文件节点维护了一个键值对)
2、生产者调用注册中心ServiceRegistryCenter的register方法,将直接serviceName和serviceAddress注册到注册中心。
3、注册中心的Register方法主要根据ZK的ip地址连接到ZK服务器,然后创建一个文件节点(父节点代表key,子节点代表value),通过key、value来记录服务名和服务地址。类似registry/com.acme.AcmeService/127.0.0.1:8080(ServiceName为永久,ip为临时,服务停掉临时节点被删除)
3、consumer通过serviceName在注册中心找到对应的url。
4、使用动态代理进行服务调用。网络传输协议使用NIO,具体实现为Netty。
-
动态代理代理的是客户端的对象。
动态代理是在不改变目标method的情况下,要对它进行操作,希望调用过程对客户端是无感知的。
服务发现类ServiceDiscovery,
消费者:
动态代理对象RpcClientProxy rpcClientProxy = new RpcClientProxy(serviceDiscovery);
IService iService = rpcClientProxy.creat(IService.class);
creat方法:创建一个监听,通过Netty的api创建一个channelFuture(),实现了对远程服务器的链接和注入,解码编码器,
生产者:
new RpcService(new ZKServiceRegistryCenterImpl(), serviceAddress);
rpcService.bind(iService,…); //将提供的服务名称bind到注册中心
rpcService.registerAndListen(); //使用Netty创建一个监听
zk的watcher机制,服务变更通知