注册中心上保存四种类型的数据:
providers: 服务提供者目录,记录着服务提供者的ip、端口等信息。
consumers: 服务消费者目录,记录服务消费者的元数据信息,服务提供者并不会用到服务消费者的信息,这里要记录消费者的信息,是给服务治理中心(dubbo-admin)使用的。
routers: 用于消费者路由策略元数据信息。
configurators:用于服务者动态配置URL元数据信息。
以zookeeper作为注册中心
持久和临时节点
持久节点:节点会一直存在,就算建立该节点的会话断线,节点也会存在。
临时节点:会话存在,节点就存在;会话断开,节点就会被删除。
Watch机制
zookeeper节点发生变化(Znode本身的增加,删除,修改,以及子Znode的变化),zookeeper注册中心可以通过Watch机制通知到客户端。
服务消费者的服务列表
每一个服务消费者都会在本地维持一张服务提供者的列表,在消费者第一次启动的时候,回去注册中心拉取一次完整的服务列表,然后通过watch机制监听routers、configuration、provider这三个目录的变化。如果新增了服务提供者,或者某一个提供者下线了,消费者就会收到通知,去更新自己的服务列表。
服务提供者的注册操作
当启动一个新的服务,会把服务的ip和端口注册provider下,作为一个临时节点,假如服务提供者宕机,由于是临时节点,所以节点会被删除,这样就可以触发watch机制,服务提供者启动后会监听configuration。
DUBBO控制台搭建
下载源码,打包部署!
服务重试
集群容错
负载均衡
有多种级别的配置:服务端服务/方法级别、客户端服务/方法级别
多个配置是有覆盖关系的, 配置的优先级是:
1. 客户端方法级别配置;(最优先)
2. 客户端接口级别配置;
3. 服务端方法级别配置;
4. 服务端接口级别配置;(最后使用)
<!-- 服务端服务级别 -->
<dubbo:service interface="..." loadbalance="roundrobin" />
<!-- 客户端服务级别 -->
<dubbo:reference interface="..." loadbalance="roundrobin" />
<!-- 服务端方法级别 -->
<dubbo:service interface="...">
<dubbo:method name="hello" loadbalance="roundrobin"/>
</dubbo:service>
<!-- 客户端方法级别 -->
<dubbo:reference interface="...">
<dubbo:method name="hello" loadbalance="roundrobin"/>
</dubbo:reference>
虽说以上配置有全封闭服务端配置的,有针对客户端配置的,但是,真正使负载均衡起作用的是,客户端在发起调用的时候,使用相应负载均衡算法进行选择调用。(服务端不可能有这能力)
另外,控制台可以设置负载均衡!!!
Dubbo中,先通过路由,从多个 Provider 中按照路由规则,选出一个子集。再根据负载均衡从子集中选出一个 Provider 进行本次调用。如果调用失败了,根据集群容错策略,进行重试或定时重发或快速失败等。 可以看到Dubbo中的路由,负载均衡和集群容错发生在一次RPC调用的不同阶段。最先是路由,然后是负载均衡,最后是集群容错。