当前位置: 首页 > news >正文

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

相关文章:

  • R语言使用df函数生成F分布密度函数数据、使用plot函数可视化F分布密度函数数据(F Distribution)
  • Java--正则表达式
  • java计算机毕业设计家政服务管理源码+数据库+系统+lw文档+mybatis+运行部署
  • Java常量池理解
  • Dubbo入门介绍及学习笔记总结
  • 【SpringMVC】重定向和转向详解
  • ocr的场景应用--发票识别
  • Dubbo入门(四)Provider和Consumer的注解实现
  • dubbo分布式日志调用链追踪
  • 软件测试周刊(第87期):天下就没有偶然,那不过是化了妆的、戴了面具的必然。
  • 灵性图书馆:好书推荐-《把好运吸过来》
  • 关于Springboot的@Profile的写法以及多个profile的写法排坑(“!profile1 !profile2“ 的写法)
  • Dubbo 原理与部署
  • 文章概述美国APX511B音频分析仪
  • linux shell脚本基础语法(变量篇)
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • express.js的介绍及使用
  • Flannel解读
  • JavaScript中的对象个人分享
  • Java新版本的开发已正式进入轨道,版本号18.3
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • magento 货币换算
  • Phpstorm怎样批量删除空行?
  • 彻底搞懂浏览器Event-loop
  • 后端_MYSQL
  • 今年的LC3大会没了?
  • 京东美团研发面经
  • 如何优雅地使用 Sublime Text
  • 手机端车牌号码键盘的vue组件
  • 为视图添加丝滑的水波纹
  • 我的业余项目总结
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 中文输入法与React文本输入框的问题与解决方案
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​ssh免密码登录设置及问题总结
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #include到底该写在哪
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • $.ajax,axios,fetch三种ajax请求的区别
  • $.proxy和$.extend
  • $NOIp2018$劝退记
  • (2022 CVPR) Unbiased Teacher v2
  • (4)Elastix图像配准:3D图像
  • (8)STL算法之替换
  • (C#)一个最简单的链表类
  • (C语言)fgets与fputs函数详解
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (JS基础)String 类型
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)python旅游推荐系统 毕业设计 250623