1 与Spring的结合
首先spring注册实例让IOC容器管理实例的方式有注解方式,xml的方式。Dubbo中使用另一种方式。BeanDefinitionRegistryPostProcessor提供了让我们对BeanDefinition进行自定义注册的方法,如果Spring中的默认配置方式不能满足你的要求,就可以通过实现BeanDefinitionRegistryPostProcessor接口来进行扩展(http://rason.me/2016/12/16/BeanDefinitionRegistryPostProcessor/)
源码中是这样实现的:
这方法最终调用了Registry进行构造的ServiceBean的注册,一个ServiceBean代表一个需要暴露的接口。它其中包含了我们再配置文件中配置的信息。比如注册中心,服务接口等。Dubbo在这个方法中构造了ServiceBean
它是以ServiceBean为根对象的方式来注册的,那么实例化的过程必将触发ServiceBean的初始化的方法。在这个方法中如果你向后看,会发现ServiceBean的对象的属性引用都在后面的if语句中添加了。比如:provider等
然后再来看看ServiceBean,它是继承了ServiceConfig,所以从现在开始就离开与Spring结合的地方,进入Dubbo了。
这里实现了ApplicationListener,如果在上下文中部署一个实现了ApplicationListener接口的bean,那么每当在一个ApplicationEvent发布到ApplicationContext时,这个bean得到通知。其实这就是标准的Oberver设计模式。(https://www.cnblogs.com/duanxz/p/3772654.html)所以这里其实就是类似于初始化的方法。当触发ApplicationEvent的事件时,这个实现的方法就会被调用。
还在ServiceBean中看看这个实现方法做了什么,export()。这方法会跳到ServiceConfig中。这就是Dubbo严格意义上的入口。前面都是在利用Spring在实例化对象,收集配置。
2 注册Service
进入ServiceConfig的export()方法。
顺着方法一直走到上面这个方法,查看最底,找到注册registryUrls的代码。
此段代码就是在使用Invoker包装Service的一些信息,比如接口,注册的url.这个url包含了注册中心的url及dubbo加入的一些自定义的参数。所以并不是简单只有注册中心的地址。至于发现protocol与proxyFactory,是怎么来的这是dubbo的扩展工厂类ExtensionLoader获取的,它会根据配置文件和注解获取最适合的实例返回。这样就可以实现面向接口编程。详情移步(https://blog.csdn.net/xiaoxufox/article/details/75117992)然后进入proctcol的export方法看看。这里如果你的注册中心的配置是这样的
那扩展工厂类会返回RegistryProtocol,来看看它的export方法。
这里从前面传递的Invoker中获取注册的url,并且订阅符合要求的consumer。在register方法中获取实际的注册类,根据你的配置选择需要的注册类。
这里如果你注册中心的配置是zookeeper,那么返回的Registry就是ZookeeperRegistry。看看ZookeeperRegistry中怎么注册的。
进入ZookeeperRegistry的doRegister的方法,它是被父类的register方法调用的。
其实dubbo拼接url然后一步一步传递下去,这些参数是做啥的也蛮重要的对理解这个过程。