三、Dubbo 注册中心

三、Dubbo 注册中心
3.1 注册中心概述

  • 主要作用
    • 动态加入:服务提供者通过注册中心动态地把自己暴露给其他消费者
    • 动态发现:消费者动态地感知新的配置、路由规则和新的服务提供者
    • 动态调整:注册中心支持参数的动态调整,新参数自动更新到所有相关服务节点
    • 统一配置:避免本地配置导致每个服务的配置不一致问题
  • 工作流程
    • 服务提供者启动时,会向注册中心写入自己的元数据信息,同时会订阅配置元数据信息
    • 消费者启动时,也会向注册中心写入自己的元数据信息,并订阅服务提供者、路由和配置元数据信息
    • 服务治理中心(dubbo-admin)启动时,会同时订阅所有消费者、服务提供者、路由和配置元数据信息
    • 当有服务提供者离开或有新的服务提供者加入时,注册中心服务提供者目录会发生变化,变化信息会动态通知给消费者、服务治理中心
    • 当消费方发起服务调用时,会异步将调用、统计信息等上报给监控中心(dubbo-monitor・simple)
  • 数据结构
    • 不同的注册中心有不同的实现方式。其数据结构也不相同、
  • ZooKeeper 原理概述
    • 树形结构的注册中心,每个节点类型分为持久节点、持久顺序节点、临时节点和临时顺序节点。Dubbo使用ZooKeeper作为注册中心时,只会创建持久节点和临时节点两种
      • 持久节点:服务注册后保证节点不会丢失,注册中心重启也会存在
      • 持久顺序节点:在持久节点特性的基础上增加了节点先后顺序的能力
      • 临时节点:服务注册后连接丢失或session超时,注册的节点会自动被移除
      • 临时顺序节点:在临时节点特性的基础上增加了节点先后顺序的能力
    • 树形结构的关系:
      • 树的根节点是注册中心分组,下面有多个服务接口,分组值来自用户配置dubbo:registry中的 group 属性,默认是/dubbo
      • 服务接口下包含4类子目录,分别是providers、consumers、routers、configurators,这个路径是持久节点
      • 服务提供者目录(/dubbo/service/providers) 包含的接口有多个服务者URL元数据信息
      • 服务消费者目录(/dubbo/service/consumers) 包含的接口有多个消费者URL元数据信息
      • 路由配置目录(/dubbo/service/routers)下面包含多个用于消费者路由策略元数据信息
      • 动态配置目录(/dubbo/service/configurators)下面包含多个用于服务者动态配置URL元数据信息
        3.2 订阅/发布
  • ZooKeeper 的实现
    • 发布的实现
      • 服务提供者和消费者都需要把自己注册到注册中心。服务提供者的注册是为了让消费者感知服务的存在,从而发起远程调用;也让服务治理中心感知有新的服务提供者上线
    • 订阅的实现
      • 订阅通常有pull和push两种方式,一种是客户端定时轮询注册中心拉取配置,另一种是注册中心主动推送数据给客户端。目前Dubbo采用的是第一次启动拉取方式,后续接收事件重新拉取数据
        3.3 缓存机制
  • 消费者或服务治理中心获取注册信息后会做本地缓存。内存中会有一份,保存在Properties对象里,磁盘上也会持久化一份文件,通过file对象引用
  • 缓存的加载
    • 在服务初始化的时候,AbstractRegistry构造函数里会从本地磁盘文件中把持久化的注册数据读到Properties对象里,并加载到内存缓存中
  • 缓存的保存与更新
    • 缓存的保存有同步和异步两种方式。异步会使用线程池异步保存,如果线程在执行过程中出现异常,则会再次调用线程池不断重试
      3.4 重试机制
  • FailbackRegistry 继承了AbstractRegistry,并在此基础上增加了失败重试机制作为抽象能力
  • FailbackRegistry抽象类中定义了一个ScheduledExecutorService,每经过固定间隔(默认为5秒)调用FailbackRegistry#retry()方法
    3.5 设计模式
  • 模板模式
    • 整个注册中心的逻辑部分使用了模板模式

      • 在这里插入图片描述
      • AbstractRegistry实现了 Registry接口中的注册、订阅、查询、通知等方法,还实现了磁盘文件持久化注册信息这一通用方法。但是注册、订阅、查询、通知等方法只是简单地把URL加入对应的集合,没有具体的注册或订阅逻辑
    • FailbackRegistry又继承了 AbstractRegistry,重写了父类的注册、订阅、查询和通知等方法,并且添加了重试机制。此外,还添加了四个未实现的抽象模板方法

  • 工厂模式
    • 所有的注册中心实现,都是通过对应的工厂创建

    • 在这里插入图片描述

    • AbstractRegistryFactory 实现了 RegistryFactory 接口的 getRegistry(URL url)方法,是一个通用实现,主要完成了加锁,以及调用抽象模板方法createRegistry(URL url)创建具体实现等操作,并缓存在内存中

    • 每种注册中心都有自己具体的工厂类,在RegistryFactory接口中判断

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/42534.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何用轻叶H5制作一份调查问卷

在营销落地页中,问卷类H5是一种制作简单,易于传播的落地页,通过精巧的设计和严密的逻辑设置,问卷类H5的投放效果也是不容小觑的。 问卷类H5在制作中有以下不可缺少的要素: 清晰的标题和简要的说明 标题应该简明扼要地…

用pytorch实现AlexNet

AlexNet经典网络由Alex Krizhevsky、Hinton等人在2012年提出,发表在NIPS,论文名为《ImageNet Classification with Deep Convolutional Neural Networks》,论文见:http://www.cs.toronto.edu/~hinton/absps/imagenet.pdf &#xf…

C语言 常用工具型API ----------strchr()

函数原型 char *strchr(const char *str, int c) 参数 str-- 要被检索的 C 字符串。 c-- 在 str 中要搜索的字符。 功能 在参数str所指向的字符串中搜索第一次出现字符c&#xff08;一个无符号字符&#xff09;的位置 头文件 #include <string.h> 返回值 返回一…

【观察者设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

简介 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型模式。它定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。 观察者模式使用三个类Subject、Observer和Client。Subject…

PCI 总线树BUS 号

在一个处理器系统中&#xff0c;每一个host 主桥都推出一棵PCI 总线树。 一棵PCI 总线树中有多少个PCIB bridge , 就含有多少条PCI 总线。 系统软件在遍历当前PCI 总线树时&#xff0c;需要首先对这些PCI 总线进行编号&#xff0c;即初始化PCI 桥的primary, secondary 和Subord…

C++自学: virtual function

使用virtual关键字在base class中声明virtual function。你可以使用指针在derived class中调用和执行virtual function。 “virtual void MakeSound() 0;”这是一个pure virtual function。 有至少一个pure virtual function的class称为abstract class&#xff0c;所以Instr…

策略梯度方法

策略梯度方法 数学背景 给定一个标量函数 J ( θ ) J\left(\theta\right) J(θ)&#xff0c;利用梯度上升法&#xff0c;使其最大化&#xff0c;此时的 π θ \pi_\theta πθ​就是最优策略。 θ t 1 θ t α ∇ θ J ( θ t ) \theta_{t1}\theta_t\alpha \nabla_\theta…

Element Plus el-table 数据为空时自定义内容【默认为 No Data】

1. 通过 Table 属性设置 <div class"el-plus-table"><el-table empty-text"暂无数据" :data"tableData" style"width: 100%"><el-table-column prop"date" label"Date" width"180" /&g…

系统架构设计师---OSI七层协议

目录 OSI七层协议 各层主要功能和详细说明 Internet协议的主要协议及其层次关系

常用的请求 Content-Type 类型

application/json&#xff1a;用于发送 JSON 格式的数据&#xff0c;常用于 RESTful API 请求中。 application/x-www-form-urlencoded&#xff1a;在 POST 请求中以 URL 编码(key-value 对)的方式发送表单数据。 multipart/form-data&#xff1a;用于同时上传文件和其他表单…

vue + el-table 表格数据导出为excel表格

下载依赖 npm install --save xlsx file-saver引入插件 import * as XLSX from xlsx; import FileSaver from "file-saver";完整代码 <template><div class"administrativeCase-container"><div class"content-box"><di…

Java后端实现不用pagehelper。手写分页如何实现?

Java后端实现不用pagehelper。手写分页如何实现? 如果你不使用PageHelper这样的分页插件&#xff0c;你可以手动实现分页逻辑。下面是一个使用Java后端手写分页的示例&#xff1a; 首先&#xff0c;确定每页显示的数据量和当前页码。 int pageSize 10; // 每页显示的数据量…

移动通信系统的LMS自适应波束成形技术matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ..................................................................... idxx0; while idxx&…

Spring Bean的生命周期总结(包含面试题)

目录 一、Bean的初始化过程 1. 加载Spring Bean 2. 解析Bean的定义 3. Bean属性定义 4. BeanFactoryPostProcessor 扩展接口 5. 实例化Bean对象 6. Aware感知 7. 初始化方法 8. 后置处理 9. destroy 销毁 二、Bean的单例与多例模式 2.1 单例模式&#xff08;Sin…

游戏不再只是娱乐,更成为了一种学习和成长的途径

随着科技的飞速发展和游戏设计的创新&#xff0c;当下的游戏行业正经历着前所未有的繁荣时代。各种各样的游戏类型在不断涌现&#xff0c;为玩家们带来了丰富多彩的娱乐体验。这些火热的游戏类型不仅改变了我们的娱乐方式&#xff0c;还在无形中影响了我们的生活。 多元游戏类…

2023河南萌新联赛第(六)场:河南理工大学-F 爱睡大觉的小C

2023河南萌新联赛第&#xff08;六&#xff09;场&#xff1a;河南理工大学-F 爱睡大觉的小C https://ac.nowcoder.com/acm/contest/63602/F 文章目录 2023河南萌新联赛第&#xff08;六&#xff09;场&#xff1a;河南理工大学-F 爱睡大觉的小C题意解题思路 题意 新学期的概…

大数据平台中元数据库—MySQL的异常故障解决

本文的主要目标是解决大数据平台中元数据库MySQL的异常故障。通过分析应用响应缓慢的问题&#xff0c;找到了集群组件HIVE和元数据库MySQL的原因。通过日志分析、工具检测和专家指导等一系列方法&#xff0c; 最终确定问题的根源是大数据集群中租户的不规范使用所导致&#xff…

[Unity]Lua本地时间、倒计时和正计时。

惯例&#xff0c;直接上代码&#xff1a; --正计时开始时的时间戳 self.begin_time os.time() --倒计时时长&#xff0c;01:30:00 self.countdown_time 5400 --是否开始计时 self.is_update_local_time true--Unity Update function time_transition:update_local_timer()i…

Linux学习之iptables过滤规则的使用

cat /etc/redhat-release看到操作系统是CentOS Linux release 7.6.1810&#xff0c;uname -r看到内核版本是3.10.0-957.el7.x86_64&#xff0c;iptables --version可以看到iptables版本是v1.4.21。 iptables -t filter -A INPUT -s 10.0.0.8 -j ACCEPT会在最后一行插入。 10…

代码随想录day52

300最长递增子序列 class Solution { public:int lengthOfLIS(vector<int>& nums) {int piles 0; // 牌堆数初始化为 0vector<int> top(nums.size()); // 牌堆数组 topfor (int i 0; i < nums.size(); i) {int poker nums[i]; int left 0, right…