《深入理解Apache Dubbo与实战》第三章的阅读笔记

本文详细介绍了Dubbo中注册中心的作用,包括动态加入、发现和服务调整。重点阐述了Zookeeper作为注册中心的工作原理,如持久节点的使用,以及发布/订阅机制。同时,文章还探讨了Redis作为注册中心的实现方式,利用其key/Map结构存储服务元数据,并通过过期机制和发布/订阅通道管理服务。此外,文中还提及了Dubbo的缓存机制和涉及的设计模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

本文是《深入理解Apache Dubbo与实战》第三章的阅读笔记。
第三章的主要内容是讲注册中心,书中主要围绕:
1.注册中心的工作流程
2.注册中心的数据结构
3.订阅发布的实现
4.缓存机制
5.重试机制
6.设计模式
这几个部分讲解

一、注册中心概述

1.简介

Dubbo通过注册中心实现了分布式环境中各服务之间的注册与发现。其作用如下:
1.动态加入。一个服务提供者可以通过注册中心动态的把自己暴露给消费者,无需依赖于消费者主动去更新
2.动态发现。一个消费者可以动态地感知新的配置、路由规则和新的服务提供者。
3.动态调整。注册中心可以支持参数的动态调整,新参数自动更新到所有相关的服务中。
4.统一配置。避免本地配置导致每个服务的配置不一的问题。

dubbo的注册中心源码在dubbo-registry中,里面包含了五个子模块
在这里插入图片描述

模块 介绍
api 包含注册中心所有API和抽象类实现
zookeeper 使用zookeeper作为注册中心实现
redis 使用redis作为注册中心
default 基于内存的默认实现
multicast multicast模式的服务注册与发现

而dubbo主要是使用zookeeper作为注册中心。

2.工作流程

1.服务容器负责启动,加载,运行服务提供者。
2. 服务提供者在启动时,向注册中心注册自己提供的服务。
3.服务消费者在启动时,向注册中心订阅自己所需的服务。
4.注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
5.服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
6.服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

二、Zookeeper注册

1.原理

Zookeeper的节点类型分为持久节点、持久顺序节点、临时节点、临时顺序节点。而Dubbo在使用注册中心时只会创建持久节点和临时节点。
/dubo/com.foo.BarService/providers是服务提供者在zookeeper注册中心的路径示例。该结构分为四层:root(根节点,对应示例的dubbo)、service(对应示例中的com.foo.BarService)、四种服务目目录(对应示例中的providers,省略的有consumers,routers,configurators)。

Dubbo中服务元数据中的所有参数都是以键值对的方式存储的。
在Dubbo中启用注册中心可以通过以下方式

<beans>
    <!--适用于一个集群多个节点-->
    <dubbo:registry protocal="zookeeper" address="ip:port,ip:port"/>
    <!--适用于多个集群多个节点 -->
    <dubbo:registry protocal="zookeeper" address="ip:port|ip:port"/>
</beans>  

2.发布/订阅

发布的实现
服务提供者和消费者都需要把自己注册到注册中心。服务提供者的注册是为了让消费者感知服务的存在,而消费者注册是为了让服务提供者发现自己。
服务发布与取消主要是用如下几个方法

zkClient.create(toUrlPath(url));//发布,toUrlPath会反复调用几个获得url的方法,最最终得到url
url.getParameter(Constans.DYNAMIC_KEY, true);
zkClient.detele(toUrlPath(url));取消发布

订阅的实现
订阅有pull和push两种方式,一种是客户端定时轮询注册中心拉取配置,一种是注册中心主动推送。目前dubbo采取第一次启动拉取方式,后续接受事件重新拉取数据。

zookeeper采用的是”客户端拉取“+”事件通知“的方式,客户端在第一次连接上注册中心会拉取全量的数据,然后通过watcher监控节点的变化,若变化则拉取节点下的全量数据。

下面是全量订阅服务的代码

 if (Constants.ANY_VALUE.equals(url.getServiceInterface())) {
    //订阅所有的服务,ANY_VALUE的值为”*“,第一次注册会将service层设成”*“,所以这个条件为真
                String root = toRootPath();</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值