Dubbo之注册与发现

亦凉 2022-05-31 07:45 245阅读 0赞

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

20180212094942238





























角色说明

Provider

暴露服务的服务提供方

Consumer

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

Registry

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

Monitor

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

Container

服务运行容器

调用关系说明

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

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

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

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

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

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

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

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

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

我们从dubbo提供的demo入手,

20180212094957456

这是官方提供的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 见下图

20180212095012429

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下通过

20180212095024487

定义了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)

20180212095035515

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

20180212095049743

20180212095100549

而配置文件中的对应的Bean就是 ServiceBean,对应的配置类为ServiceConfig

20180212095115683

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

第二部分:服务注册

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

20180212095128440

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

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

20180212095140406

关键部分

20180212095153259

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

20180212095204646

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

20180212095217154

第三部分:服务发现

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

20180212095229461

对应Bean为 ReferenceBean, 对应的配置类为 ReferenceConfig,

20180212095241946

参考 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

20180212095302414

发表评论

表情:
评论列表 (有 0 条评论,245人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Dubbo服务的注册发现

    Dubbo服务的注册与发现 前言 最近参与的项目是一个基于`Dubbo`的项目,在开发过程中有些同事对于`Dubbo`服务的注册与发现机制,似乎不太了解。所以我抽空