初始化reference
ReferenceConfig.init
初始化自身的consumerUrl,url上加入methods参数;如果是generic调用,则不配置methods参数
ReferenceConfig.createProxy生成stub
RegistryProtocol.refer创建AbstractClusterInvoker
先创建一个RegistryDirectory,负责监听interface目录下的配置更新
再用上述RegistryDirectory对象,构造一个AbstractClusterInvoker;
AbstractClusterInvoker负责选取provider实例来发起调用StubProxyFactoryWrapper.getProxy使用javassist来构建stub;
在线编译的stub类实现了服务的interface,内部使用AbstractClusterInvoker对象进行远程调用
在线更新配置
注册的provider、router发生变化后,客户端会立即进行配置更新
RegistryDirectory.refreshInvoker
RegistryDirectory.toInvokers
更新invoker(provider)列表
RegistryDirectory.toMethodInvokers
根据所有在线invoker的providerUrl申明的methods列表,来整理各个method的可用invoker
根据自身consumerUrl申明的methods列表,和从注册中心获取的router列表,来筛选各个method优先调用的invoker;
如果是generic调用,因为没有在consumerUrl申明methods列表,则不进行筛选;
筛选逻辑放在RegistryDirectory.route方法里,这个方法只会使用非runtime类型的router
router除了runtime属性外,还有一个force属性;当force为false时,如果没有provider满足router的筛选条件,则不用此router进行筛选
发起调用
AbstractClusterInvoker.invoke
AbstractDirectory.list:
RegistryDirectory.doList获取method对应的invoker列表
使用runtime类型的router筛选出各个method优先调用的invoker
FailoverClusterInvoker.doInvoke
选择一个invoker发起调用,如提供了可用的重试次数,则在失败后选择另一个invoker重试