Dubbo之注册与发现

从官网可以得到下面的架构图,



 

 


角色说明

Provider

暴露服务的服务提供方

Consumer

调用远程服务的服务消费方

Registry

服务注册与发现的注册中心

Monitor

统计服务的调用次调和调用时间的监控中心

Container

服务运行容器


调用关系说明

1.  服务容器负责启动,加载,运行服务提供者。

2.  服务提供者在启动时,向注册中心注册自己提供的服务。

3.  服务消费者在启动时,向注册中心订阅自己所需的服务。

4.  注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

5.  服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

6.  服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

      

上面都是一些从官网摘抄下来的一些简介,更具体的信息可以去浏览官网。

下面主要分三部分:第一spring如何加载生成dubbo对象,第二dubbo服务如何注册到注册中心, 第三dubbo如何服务


1、spring如何加载生成dubbo对象

我们从dubbo提供的demo入手, 




这是官方提供的dome中provider的配置信息(对我这还不熟悉spring的来说一头雾水)


在很多情况下,我们需要为系统提供可配置化支持,简单的做法可以直接基于Spring的标准Bean来配置,但配置较为复杂或者需要更多丰富控制的时候,会显得非常笨拙。一般的做法会用原生态的方式去解析定义好的xml文件,然后转化为配置对象,这种方式当然可以解决所有问题,但实现起来比较繁琐,特别是是在配置非常复杂的时候,解析工作是一个不得不考虑的负担。Spring提供了可扩展Schema的支持,这是一个不错的折中方案,完成一个自定义配置一般需要以下步骤:

·        设计配置属性和JavaBean

·        编写XSD文件

·        编写NamespaceHandler和BeanDefinitionParser完成解析工作

·        编写spring.handlers和spring.schemas串联起所有部件

·        在Bean文件中应用

 

同样的dubbo为了解决这个问题,起了一个叫dubbo-config-spring的模块。这个模块的下面的resources/META-INF文件下面有三个这样的文件 dubbo.xsd、spring.handlers、spring.schemas  见下图




Dubbo也是利用了Spring提供的可扩展Schema机制实现了dubbo的xml配置文件解析。


注:  由于 http://code.alibabatech.com/schema/dubbo 现在不能用了, 所以在https://github.com/alibaba/dubbo/tree/master/dubbo-config/dubbo-config-spring/src/main/resources/META-INF下通过




定义了xsd文件的地址, 这个配置在ide里是可被检测并加载到的, 如果打包后发现spring报class找不到, 记得查看是不是这两个文件没有加到资源中.


解决了spring解析dubbo配置xml的问题,下面就看spring怎么生成dubbo对象的。 看一下解析xml的DubboNamespaceHandler类(\dubbo\dubbo-config\dubbo-config-spring\src\main\java\com\alibaba\dubbo\config\spring\schema\DubboNamespaceHandler.java)




从这里知道所有的dubbo的标签,都是统一由DubboBeanDefinitionParser来解析的,每一个标签都会统一解析成对应的Bean对象。dubbo定义了以下配置类(见dubbo\dubbo-config\dubbo-config-api,准确说应该是Bean的父类), Bean(见dubbo\dubbo-config\dubbo-config-spring)






配置文件中的<dubbo:serviceinterface="com.alibaba.dubbo.demo.DemoService"ref="demoService"/>对应的Bean就是 ServiceBean,对应的配置类为ServiceConfig




以上是ServiceBean里面的一些属性截图.


第二部分:服务注册

ServiceBean类的代码就不再赘余,直说方式了. 阅读ServiceBean类的代码在根据spring的生命周期,可以发现ServiceBean初始化完毕之后会调用一个afterPropertiesSet的方法, 这个方法实际调用了com.alibaba.dubbo.config.ServiceConfig#export 这个方法, 在这个方法中, 加载xml里配置的interface,




之后做一些接口一致的校验.

一层层查看,最终找到ServiceConfig的方法doExportUrlsFor1Protocol, 




关键部分



根据拼接好的注册地址将拼接好的服务地址进行注册. 实际注册行为发生在最后的export中. 详细的函数调用可参见\dubbo\dubbo-registry\dubbo-registry-api\src\main\java\com\alibaba\dubbo\registry\integration\RegistryProtocol.java#export,这里只贴图一张,不再赘余.关键部分是注册地址和服务地址的拼接,之后调用工厂函数即可.




整体逻辑流程借用一张别人绘制的图, 



第三部分:服务发现

服务如何发现的, 可以参阅consumer的代码, 同样的套路再来一次, 这里不再赘余.




<dubbo:reference id="demoService"check="false"interface="com.alibaba.dubbo.demo.DemoService"/> 对应Bean为 ReferenceBean, 对应的配置类为 ReferenceConfig, 



 

参考 reference:

  1. https://dubbo.gitbooks.io/dubbo-user-book/references/registry/zookeeper.html

  2. http://doc.okbase.net/661116/archive/241946.html

  3. https://www.cnblogs.com/linlinismine/p/7814521.html

  4. http://blog.csdn.net/chao_19/article/details/51764150

猜你喜欢

转载自blog.csdn.net/itest_2016/article/details/79314768