Dubbo之注册与发现

Posted 程序员超时空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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类(dubbodubbo-configdubbo-config-springsrcmainjavacomalibabadubboconfigspringschemaDubboNamespaceHandler.java)

从这里知道所有的dubbo的标签,都是统一由DubboBeanDefinitionParser来解析的,每一个标签都会统一解析成对应的Bean对象。dubbo定义了以下配置类(见dubbodubbo-configdubbo-config-api,准确说应该是Bean的父类), Bean(见dubbodubbo-configdubbo-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中. 详细的函数调用可参见dubbodubbo-registrydubbo-registry-apisrcmainjavacomalibabadubbo egistryintegrationRegistryProtocol.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

以上是关于Dubbo之注册与发现的主要内容,如果未能解决你的问题,请参考以下文章

Spring Cloud 系列之 Eureka 实现服务注册与发现

2.dubbo源码分析之API配置一(应用)

分布式服务之Dubbo

Dubbo

源码分析Dubbo系列之寻找注册中心服务提供者服务消费者功能入口

开发dubbo应用程序dubbo注册中心相关概述