Check on start up(启动检查)
Dubbo默认会在启动的时候检查它依赖的服务是否可用。当发现服务不可用的时候它会抛出一个异常来组织spring完成初始化,这回促使你在应用发布之前及早地发现问题,默认配置:check=。
可以使用check=false来关闭检查。例如,测试环境的时候有些服务不需要关心,或者必须先启动一个来防止循环依赖的场景。
另外,假如你的spring bean是懒加载的,需要先关闭检查,否则当一个服务临时不可用的时候,你的服务会抛出一个异常,进而得到一个空的引用。如果你配置了check=false,你会得到一个引用,当服务重启的时候会自动重连。
Example
Use the spring configuration file
禁用一个服务的启动检查
<dubbo:reference interface = "com.foo.BarService" check = "false" />
禁用所有服务的启动检查
<dubbo:consumer check = "false" />
禁用注册中心的启动检查
<dubbo:registry check="false" />
Use the spring configuration file
dubbo.reference.com.foo.BarService.check = false
dubbo.reference.check = false
dubbo.consumer.check = false
dubbo.registry.check = false
Use the -D parameter
java -Ddubbo.reference.com.foo.BarService.check = false
java -Ddubbo.reference.check = false
java -Ddubbo.consumer.check = false
java -Ddubbo.registry.check = false
Fault Tolerance Strategy (容错策略)
当集群调用失败时,Dubbo提供了一系列的容错策略,并使用默认的故障转移重试。
节点间的关系如下:
- Invoker :Invoker 是Provider中可调用服务的抽象,Invoker打包了Provider的地址和Service的接口;
- Directory :Directory 代表了多个Invoker,可以认为它是List
,但是不像list,这个的值可以动态被改变,比如当registry 推送变化的时候; - Cluster :Cluster 将Directory中的多个Invoker伪装成一个Invoker,它是上层的透明的封装的处理过程,包括了容器逻辑,调用失败,试试另一个。
- Router :Router 负责从多个Invokers中根基于调用规则选择出一个子集出来,比如读写分离,应用隔离等;
- LoadBalance:LoadBalance负责从多个Invoker中选择出一个特殊的作为本次调用。选择的过程包括了负载均衡,假如调用失败了,它回去重新选择。
Cluster fault-tolerant mode
可以自定义集群的容错策略
默认策略:
- 【failfast】
快速失效,只发起一次调用,失败立即报错。通常用于非幂等性写操作,比如说新增记录
<dubbo:service cluster="failfast">
或者
<dubbo:reference cluster="failfast"
- 【failsafe】
失败安全,出现异常时,直接忽略,通常用于写入审计日志等操作
<dubbo:service cluster="failsafe">
或者
<dubbo:reference cluster="failsafe">
- 【failback】
失败自动恢复,后台记录失败请求,定时重发,通常用于消息通知操作
<dubbo:service cluster="failback">
或者
<dubbo:reference cluster="failback">
- 【forking】
并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多的服务器资源。可通过forks=“2”来设置最大并行数。
<dubbo:service cluster="forking">
或者
<dubbo:reference cluster="forking">
自定义策略:
- 拓展org.apache.dubbo.rpc.cluster.Cluster接口
- XxxCluster.java:
package com.xxx;
import org.apache.dubbo.rpc.cluster.Cluster;
import org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker;
import org.apache.dubbo.rpc.cluster.Directory;
import org.apache.dubbo.rpc.cluster.LoadBalance;
import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.Invocation;
import org.apache.dubbo.rpc.Result;
import org.apache.dubbo.rpc.RpcException;
public class XxxCluster implements Cluster {
public <T> Invoker<T> merge(Directory<T> directory) throws RpcException {
return new AbstractClusterInvoker<T>(directory) {
public Result doInvoke(Invocation invocation, List<Invoker<T>> invokers, LoadBalance loadbalance) throws RpcException {
// ...
}
};
}
}
- META-INF/dubbo/org.apache.dubbo.rpc.cluster.Cluster:
xxx=com.xxx.XxxCluster
- 目录结构图
src
|-main
|-java
|-com
|-xxx
|-XxxCluster.java (Cluster implementation)
|-resources
|-META-INF
|-dubbo
|-org.apache.dubbo.rpc.cluster.Cluster (plain text file with the content: xxx=com.xxx.XxxCluster)
- 使用的时候
<dubbo:protocol cluster="xxx" />
或
<dubbo:provider cluster="xxx" />