Dubbo之注册与发现

2023-05-16

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

角色说明

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dubbo之注册与发现 的相关文章

  • Dubbo服务降级

    dubbo降级服务 使用dubbo在进行服务调用时 xff0c 可能由于各种原因 xff08 服务器宕机 网络超时 并发数太高等 xff09 xff0c 调用中就会出现RpcException xff0c 调用失败 服务降级就是指在由于非业
  • JVM、JRE、JDK之间的联系与区别

    JVM JRE JDK之间的联系与区别 JVM xff08 Java Virtual Machine xff09 JVM xff08 Java虚拟机 xff09 是一个可执行Java字节码的虚拟机进程 用于解析编译后的字节码文件 JVM屏蔽

随机推荐

  • maven安装及配置

    maven安装及配置 xff08 详细版 xff09 1 下载 xff1a 可以从官方下载 xff0c 下载页面 xff1a http maven apache org download cgi 2 安装 xff1a maven压缩包解压到
  • 类加载的顺序

    1 父类静态对象和静态代码块 2 子类静态对象和静态代码块 3 父类非静态对象和非静态代码块 4 父类构造函数 5 子类 非静态对象和非静态代码块 6 子类构造函数
  • Java多线程之~~~~使用wait和notify实现生产者消费者模型

    在多线程开发中 xff0c 最经典的一个模型就是生产者消费者模型 xff0c 他们有一个缓冲区 xff0c 缓冲区有最大限制 xff0c 当缓冲区满 的时候 xff0c 生产者是不能将产品放入到缓冲区里面的 xff0c 当然 xff0c 当
  • 输入若干成绩(负数结束),计算平均值

    include lt stdio h gt define N 6 main float a N int i count 61 0 float sum 61 0 average for i 61 0 i lt N i 43 43 scanf
  • rabbitmq重启

    rabbitmqctl stop xff1a 停止rabbitmq rabbitmq server restart 重启rabbitmq
  • spring项目找不到Aspect注依赖注解

    昨天写一个项目的时候在使用Aspect时一直找不到依赖 xff0c alt 43 enter自动添加Maven依赖还是解决不了问题 上网找了资料才解决 xff0c 但是我现在忘了是参照哪个资料了 xff0c 不能写出参照网址 xff0c 实
  • 总结一下mybatis返回结果为空

    今天写mybatis的时候遇到了返回结果为空的现象 xff0c 找了半天 xff0c 决定记录一下 1 可能是字段的问题 数据库中的字段 xff1a user name xff0c user id java中的实体类 xff1a userN
  • 框架、组件漏洞系列4:Apache shiro漏洞汇总

    一 Apache Shiro 简介 1 什么是shiro Apache Shiro提供了认证 授权 加密和会话管理功能 xff0c 将复杂的问题隐藏起来 xff0c 提供清晰直观的API使开发者可以很轻松地开发自己的程序安全代码 并且在实现
  • 第一章 网络编程基础

    网络编程基础 1 网络编程基础概念 对于C C 43 43 编程人员来说 xff0c 网络编程的本质实际就是使用系统提供的网络编程接口 xff0c 完成应用程序的网络数据收发功能 2 网络编程核心概念 网络编程中一般我们会经常听到一些概念
  • 自定义SpringBoot的运行动画---美女

    nice
  • 解决The package java.awt is not accessible

    第一次写这个东东 xff0c 也不会有人看 xff0c 随缘记录点东西 最近开始学java xff0c 用了eclipse IDE xff0c 但是在用awt和swing包的时候报错 xff0c The package java awt i
  • 社区版Idea的Configuration中没有spring boot选项

    专业版Idea自带springinitialler xff0c 创建spring boot项目时也会自动识别为spring boot项目 但社区版没有这个功能 xff0c 但可以同在plugins中下载spring assistant代替s
  • 运行java -version出错 Error could not open `libamd64jvm.cfg

    运行javac正常 xff0c 运行运行java version出错 Error could not open 96 libamd64jvm cfg 解决办法 xff0c 找到这个目录 C Program Files x86 Common
  • 项目启动报错Redis health check failed:Unable to connect to localhost6379

    报错详情 分析解决 我项目里面并没有引redis的连接 xff0c 那么报错这个就很奇怪 xff0c 结合Redis health check failed这句 xff0c 猜测是哪个东西里面引入了redis xff0c 然后做了redis
  • 中文乱码问题

    解决HTML的表单中文乱码问题 step1 在html文件中 xff0c 添加 lt meta http equiv 61 content type content 61 text html charset 61 utf 8 gt 另外 x
  • IDEA mybatis XML文件格式化问题

    IDEA mybatis XML文件格式化问题 问题描述问题定位解决方案 问题描述 在Idea中 xff0c 对mybatis的xml文件进行格式化 xff0c 格式化的排版并不是我们想要的 xff0c 如下图 xff1a 问题定位 SQL
  • C#.NET视频C#网络编程 基础篇

    C NET视频 C 网络编程 基础篇 11 P2P应用编程下 C 网络编程 基础篇 9 同步TCP接收电子邮件 C 网络编程 基础篇 8 UDP网络会议 C 网络编程 基础篇 7 UDP组播 C 网络编程 基础篇 6 UDP广播 C 网络编
  • docker Got permission denied while trying to connect to the Docker daemon socket at unix

    为了让普通用户也能操作docker容器 xff0c 需要进行相应的配置 xff0c 否则报 Got permission denied while trying to connect to the Docker daemon socket
  • Dubbo+Zookeeper入门实例

    现在的公司接口调用是通过dubbo来实现的 xff0c 所以这两天就了解了一下dubbo是如何进行通信的 xff0c 写了一个最简单的例子 自上得来终觉浅 xff0c 绝知此事要躬行 前言 dubbo介绍 Dubbo是一个分布式服务框架 x
  • Dubbo之注册与发现

    从官网可以得到下面的架构图 角色说明 Provider 暴露服务的服务提供方 Consumer 调用远程服务的服务消费方 Registry 服务注册与发现的注册中心 Monitor 统计服务的调用次调和调用时间的监控中心 Container