消费者启动流程和提供者有些类似:详情见:https://www.jianshu.com/p/0eb0cd4c899b
消费者在spring的xml文件中的配置主要是:
<dubbo:reference id="personService"
interface="com.wang.dubbo.api.PersonService" />
所以服务消费者的启动主要是根据dubbo:reference组装某个对象。
ReferenceBean
-
根据扫描,我们知道该配置会生成ReferenceBean的一个对象。
public class ReferenceBean<T> extends ReferenceConfig<T> implements FactoryBean, ApplicationContextAware, InitializingBean, DisposableBean{} -
注意,这个类继承了FactoryBean,所以生成的bean对象,不是ReferenceBean本身,而是他的getObject方法,详情请学习FactoryBean。
-
InitializingBean|afterPropertiesSet 该方法和提供者是一样的,主要是设置容器的上线问,配置,协议,端口等信息。
-
getObject方法是消费者启动的核心。
getObject
-
先根据配置的字符串 “com.wang.dubbo.api.PersonService” Class.forName 生成Class对象
-
在根据这个Map生成代理对象 {methods=say, timestamp=1545979083037, dubbo=2.5.3, application=Dubbo_HelloWorld, side=consumer, pid=85088, interface=com.wang.dubbo.api.PersonService}
-
最后调用createProxy
createProxy
- 根据环境信息和接口信息得到URL,根据URL生成一个Invoker,最后根据Invoker生成代理对象。
- 然后根据Invoker生成Proxy对象。
public class JavassistProxyFactory extends AbstractProxyFactory {
public <T> T getProxy(Invoker<T> invoker, Class<?>[] interfaces) {
return (T) Proxy.getProxy(interfaces).newInstance(new InvokerInvocationHandler(invoker));
}
这里的interfaces是com.wang.dubbo.api.PersonService和com.alibaba.dubbo.rpc.service.EchoService
invoker是MockClusterInvoker对象。
生成Invoker(RegistryProtocol|doRefer)
- doRefer
- 实例化RegistryDirectory,并且做监听。
- 先根据URL获取Registry对象,这对象就可以指代实际使用的zk。
- 再根据URL生成dubbo的subscribeUrl,比如:consumer://192.168.122.23/com.wang.dubbo.api.PersonServicexxx省略,,这里的url实际是本地ip地址,意思我这个消费者在哪里。
- 然后把dubbo消费者注册到zk中,实际代码是registry.register。
- 再然后根据RegistryDirectory去监听zk节点。
- 最后根据MockClusterWrapper 生成 MockClusterInvoker对象。
网友评论