簡單的客戶端
ApplicationConfig applicationConfig = new ApplicationConfig("client");
RegistryConfig registryConfig = new RegistryConfig("zookeeper://192.168.150.120:2181");
ReferenceConfig referenceConfig = new ReferenceConfig();
referenceConfig.setRegistry(registryConfig);
referenceConfig.setInterface(UserService.class);
referenceConfig.setApplication(applicationConfig);
UserService userService = (UserService) referenceConfig.get();
System.out.println(userService.getName("1111"));
查看get方法的源碼
這里有一個初始化的方法,我們看一下
這個方法很長,我們知道get所獲得一個代理對象,上面的代碼不用管,我們看createProxy(map)方法,參數主要是接口信息等等
前面主要是檢測獲取注冊中心的地址放入到urls的ArrayList中,重點是下面這個方法
REF_PROTOCOL這里又是一個代理對象,我們使用ctrl+alt+b找到基於Protocol接口實現的類RegistryProtocol
前面主要是獲取zk的地址等等,重點看干活的doRefer方法
RegistryDirectory理解為保存提供者的目錄 registry.register()向注冊中心注冊消費端信息
subscribe訂閱剛剛注冊的地址,具體實現在ZookeeperRegistry.doSubscribe(),內部有一個doNotify方法會執行RegistryDirectory的notify方法監聽zookeeper當提供者地址變更時會刷新RegistryDirectory
繼續看cluster.join 執行MockClusterWrapper.join()方法,創建一個MockClusterInvoker()
回到ReferenceConfig.createProxy
最后返回(T) PROXY_FACTORY.getProxy(invoker, ProtocolUtils.isGeneric(generic))進入
StubProxyFactoryWrapper,第一句調用AbstractProxyFactory.getProxy又調用JavassistProxyFactory.getProxy最后返回動態代理對象