Dubbo注册Service

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然后一步一步传递下去,这些参数是做啥的也蛮重要的对理解这个过程。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容