1.3-服务消费者启动流程

消费者启动流程和提供者有些类似:详情见:https://www.jianshu.com/p/0eb0cd4c899b

消费者在spring的xml文件中的配置主要是:

interface="com.wang.dubbo.api.PersonService" />

所以服务消费者的启动主要是根据dubbo:reference组装某个对象。

ReferenceBean

  • 根据扫描,我们知道该配置会生成ReferenceBean的一个对象。
    public class ReferenceBean extends ReferenceConfig 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 getProxy(Invoker 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对象。

你可能感兴趣的:(1.3-服务消费者启动流程)