注册中心与服务发现
注册中心概述
注册中心是dubbo服务治理的核心组件,Dubbo依赖注册中心的协调实现服务发现,自动化的服务发现是微服务实现动态扩容、负载均衡、流量治理的基础。
Dubbo的服务发现机制经历了Dubbo2时代的接口级服务发现、Dubbo3时代的应用级服务发现。
基本使用
SpringBoot开发:在application.yaml中添加registry配置
dubbo:registry:address: { protocol }://${cluster-address}
- protocol:配置中心类型
- cluster-address:注册中心的集群地址,比如
address: nacos://127.0.0.1:8848
,如需要集群格式地址可使用backup参数:address: nacos://localhost:8848?backup=localshot:8846,localshot:8847
配置中心与元数据中心
配置中心、元数据中心是实现Dubbo高阶服务治理能力会依赖的组件,如流量管控规则等。
相比于注册中心,这两个组件的配置是可选的。
对于部分注册中心类型(如Zookeeper、Nacos等),dubbo会默认同时将其用作元数据中心和配置中心(建议保持默认开启状态)。
dubbo:registry:address: nacos://127.0.0.1:8848
dubbo解析后的默认行为:
dubbo:registry:address: nacos://localhost:8848config-center:address: nacos://localhost:8848metadata-report:address: nacos://localhost:8848
如果不想使用nacos作为配置中心,可以通过一下两个参数来调整默认行为:
dubbo:registry:address: nacos://localhost:8848use-as-config-center: falseuse-as-metadata-report: falseconfig-center:address: apollo://localhost:8848
Zookeeper 注册中心
基本配置
Maven依赖
<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>${dubbo.version}</version>
</dependency>
<!-- 推荐 Zookeeper Server 3.8.0+ 版本 -->
<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-zookeeper-curator5-spring-boot-starter</artifactId><version>${dubbo.version}</version>
</dependency>
<!-- 仅当 Zookeeper Server 版本是 3.4.x 及以下时,使用此依赖
<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-zookeeper-spring-boot-starter</artifactId><version>${dubbo.version}</version>
</dependency>
-->
非SpringBoot项目
<dependencies><dependency><groupId>org.apache.dubbo</groupId><version>${dubbo.version}</version><artifactId>dubbo</artifactId></dependency><!-- This dependency helps to introduce Curator and Zookeeper dependencies that are necessary for Dubbo to work with zookeeper as transitive dependencies. --><!-- 仅当 Zookeeper Server 版本是 3.4.x 及以下时,使用此依赖 --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-dependencies-zookeeper</artifactId><version>${dubbo.version}</version><type>pom</type></dependency><!-- 仅当 Zookeeper Server 版本是 3.5.x 及以上时,使用此依赖<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-dependencies-zookeeper-curator5</artifactId><version>${dubbo.version}</version><type>pom</type></dependency>--> </dependencies>
Zookeeper版本选择
Dubbo3 3.3 版本及以上
Zookeeper Server 版本 | Dubbo依赖 | Dubbo Starter 依赖(SpringBoot用户) |
---|---|---|
3.4.x 及以下 | dubbo-dependencies-zookeeper | dubbo-zookeeper-spring-boot-starter |
3.5.x 及以上 | dubbo-dependencies-zookeeper-curator5 | dubbo-zookeeper-curator5-spring-boot-starter |
Dubbo3 3.2 及以下、Dubbo2 2.7.x
Zookeeper Server 版本 | Dubbo依赖 | Dubbo Starter 依赖(SpringBoot用户) |
---|---|---|
3.4.x 及以下 | dubbo-dependencies-zookeeper | 不支持(自行管理) |
3.5.x 及以上 | 不支持(自行管理) | 不支持(自行管理) |
配置并启用Zookeeper
# application.yml
dubbo:registry:address: zookeeper://localhost:2181
高级配置
认证与鉴权
如果Zookeeper开启认证,
- Dubbo支持指定username、password的方式传入身份标识·。
# application.yml dubbo:registry:address: zookeeper://localhost:2181username: hellopassword: 123456
- 可以将参数扩展在address上
# application.yml dubbo:registry:address: zookeeper://hello:123456@localhost:2181
分组隔离
通过制定group属性,可以在同一个zookeeper集群内实现微服务地址的逻辑隔离。
dubbo:registry:address: zookeeper://127.0.0.1:2181group: zookeeper-pre
其它配置
dubbo:registry:address: zookeeper://127.0.0.1:2181timeout: 30 * 1000 # 连接超时时间,默认 30ssession: 60 * 1000 # 会话超时时间,默认 60s
工作原理
Zookeeper注册中心实现支持一下高可用能力:
- 当提供者出现断电等异常停机时,注册中心能自动删除提供者信息。
- 当注册中心重启时,能自动恢复注册数据,以及订阅请求。
- 当回话过期时,能自动恢复注册数据,以及订阅请求。
- 当设置
registry.check=false
时,记录失败注册和订阅请求,后台定时重试。
接口级服务发现
- 服务提供者启动时,向
/dubbo/com.doudou.demo.api.DemoService/providers
目录下写入自己的URL地址。 - 服务消费者启动时,订阅
/dubbo/com.doudou.demo.api.DemoService/providers
目录下提供的URL地址。并向/dubbo/com.doudou.demo.api.DemoService/consumers
目录下写入自己的URL地址。 - 监控中心启动时,订阅
/dubbo/com.doudou.demo.api.DemoService
目录下的所有提供者和消费者URL地址。
可通过registry.group
设置zookeeper的根节点,不配置使用默认的/dubbo
根节点。
应用级服务发现
应用级服务发放以应用名为粒度分发地址列表。服务提供者启动着启动时,向/service/app
目录下写入自己的URL地址。
应用级的URL只包含一些实例级别的参数,如tri://ip:port?region=hangzhou
。
可通过registry.group
设置zookeeper的根节点,默认使用/services
根节点。
在应用级服务发现模型中,接口级别的配置信息由服务提供者与服务消费者之间自行同步协商,不再由注册中心服务同步,从而大大减少了注册中心的地址同步压力。
接口应用映射
在应用级服务发现中,zookeeper注册中心还会存储一份额外的元数据,用于解决接口名到应用名
之间的映射。存储路径:/dubbo/mapping/service
。
元数据
如果使用应用级服务发现的集中式元数据模式,默认是点对点模式,可通过dubbo.registry.metadata-type=remote
开启。在zookeeper服务/dubbo/metadata
目录下会保存每个应用对于机器的元数据信息。
Nacos注册中心
基本配置
maven依赖
springboot应用
<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>3.3.0</version>
</dependency>
<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-nacos-spring-boot-starter</artifactId><version>3.3.0</version>
</dependency>
非springboot应用
<dependencies><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId><version>3.3.0</version></dependency><dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>2.1.0</version></dependency>
</dependencies>
Nacos版本
Dubbo | 推荐Nacos版本 | Nacos兼容范围 |
---|---|---|
3.3.0 | 2.3.0 | 2.x |
3.2.21 | 2.1.0 | 2.x |
3.1.11 | 2.0.9 | 2.x |
3.0.10 | 2.0.9 | 2.x |
2.7.21 | 1.x最新版本 | 1.x |
2.6.0 | 1.x最新版本 | 1.x |
配置并启用Nacos
# application.yml (Spring Boot)
dubbo:registry:address: nacos://localhost:8848
高级配置
认证
# application.yml (Spring Boot)
dubbo:registry:address: nacos://localhost:8848?username=nacos&password=nacos
或
# dubbo.properties
dubbo.registry.address: nacos://nacos:nacos@localhost:8848
自定义命名空间
# application.yml (Spring Boot)
dubbo:registry:address: nacos://localhost:8848?namespace=5cbb70a5-xxx-xxx-xxx-d43479ae0932
或
# application.yml (Spring Boot)
dubbo:registry:address: nacos://localhost:8848parameters.namespace: 5cbb70a5-xxx-xxx-xxx-d43479ae0932
自定义分组
# application.yml
dubbo:registry:address: nacos://localhost:8848group: dubbo
如果不配置的话,group 是由 Nacos 默认指定。group 和 namespace 在 Nacos 中代表不同的隔离层次,通常来说 namespace 用来隔离不同的用户或环境,group 用来对同一环境内的数据做进一步归组。
注册接口级消费者
Dubbo 3.0.0 版本以后,增加了是否注册消费者的参数,如果需要将消费者注册到 nacos 注册中心上,需要将参数(register-consumer-url)设置为true,默认是false。
# application.yml
dubbo:registry:address: nacos://localhost:8848?register-consumer-url=true
或
# application.yml
dubbo:registry:address: nacos://localhost:8848parameters.register-consumer-url: true
多注册中心
关联服务与多注册中心
全局默认注册中心
Dubbo框架会自动执行以下动作:
- 对于所有的Service服务,向所有全局默认注册中心注册服务地址。
- 对于所有的Reference服务,向所有全局默认注册中心订阅服务地址。
# application.yml (Spring Boot)
dubbo:registries:nacosPreRegistry:address: nacos://nacos:nacos@127.0.0.1:8848parameters.namespace: pregroup: DUBBO_GROUPnacosTestRegistry:address: nacos://nacos:nacos@127.0.0.1:8848parameters.namespace: test1group: DUBBO_GROUP
@DubboService
public class DemoServiceImpl implements DemoService {}@DubboService
public class HelloServiceImpl implements HelloService {}
设置全局默认注册中心
dubbo.registry.default
用来设置默认注册中心,默认值为true
,即被视作全局注册中心。
未指定注册中心的服务自动注册或订阅全局默认注册中心。
# application.yml (Spring Boot)
dubbo:registries:nacosPreRegistry:address: nacos://nacos:nacos@127.0.0.1:8848parameters.namespace: pregroup: DUBBO_GROUPdefault: true # 默认是truenacosTestRegistry:address: nacos://nacos:nacos@127.0.0.1:8848parameters.namespace: test1group: DUBBO_GROUPdefault: false
显示关联服务于注册中心
以下配置,DemoService只注册到nacosPreRegistry配置地址,HelloService只注册到nacosTestRegistry配置地址。
@DubboService(registry = {"nacosPreRegistry"})
public class DemoServiceImpl implements DemoService {}@DubboService(registry = {"nacosTestRegistry"})
public class HelloServiceImpl implements HelloService {}
多注册中心订阅
从单个服务订阅的视角,如果存在多个注册中心订阅的情况,则可以根据注册中心间的地址是否聚合分为两种情况:多注册中心地址不聚合;多注册中心地址聚合。
多注册中心地址不聚合
若注册中心标记为dubbo.registry.default:true
,则所有的服务都会某人注册到这些注册中心,消费者也会聚合订阅这些注册中心。
不聚合配置
- 取消全局默认标记:确保注册中心未配置
dubbo.registry.default:true
。 - 显示指定服务于注册中心的关系: 通过服务级配置隔离注册中心。
# application.yml (Spring Boot)
dubbo:registries:nacosPreRegistry:address: nacos://nacos:nacos@127.0.0.1:8848parameters.namespace: pregroup: DUBBO_GROUPdefault: true # 默认是truenacosTestRegistry:address: nacos://nacos:nacos@127.0.0.1:8848parameters.namespace: test1group: DUBBO_GROUPdefault: false
@DubboService(registry = {"nacosPreRegistry"})
public class DemoServiceImpl implements DemoService {}@DubboService(registry = {"nacosTestRegistry"})
public class HelloServiceImpl implements HelloService {}
多注册中心地址聚合
通过设置多个注册中心为全局默认,使服务同时注册到多个注册中心,消费者也从所有默认注册中心订阅地址。
服务提供者@DubboService或服务消费者@DubboReference为指定reigstry配置时,会订阅所有的默认注册中心。
# application.yml (Spring Boot)
dubbo:registries:nacosPreRegistry:address: nacos://nacos:nacos@127.0.0.1:8848parameters.namespace: pregroup: DUBBO_GROUPdefault: true # 默认是truenacosTestRegistry:address: nacos://nacos:nacos@127.0.0.1:8848parameters.namespace: test1group: DUBBO_GROUPdefault: true
Multicast注册中心
Multicast 注册中心不需要启动任何中心节点,只要广播地址一样,就可以互相发现。
使用
# 服务提供者与服务消费者
# application.yaml
dubbo:registry:address: multicast://224.5.6.7:1234
工作原理
基本流程
- 提供方启动时广播自己的地址。
- 消费方启动时广播订阅请求。
- 提供方接收到订阅请求时,单播自己的地址给订阅者,如果设置了
unicast=false
,则广播给订阅者。 - 消费方收到提供方地址后,连接该地址进行RPC调用。
使用限制
组播受网络结构限制,只适合小规模应用或开发阶段使用。组播地址段:224.0.0.0 - 239.255.255.255