dubbo user guider笔记之四Demos----Start check && Fault Tolerance Strategy

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提供了一系列的容错策略,并使用默认的故障转移重试。
image

节点间的关系如下:

  • 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">

自定义策略:

  1. 拓展org.apache.dubbo.rpc.cluster.Cluster接口
  2. 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 {
                // ...
            }
        };
    }
}
  1. META-INF/dubbo/org.apache.dubbo.rpc.cluster.Cluster:
xxx=com.xxx.XxxCluster
  1. 目录结构图
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)
  1. 使用的时候
<dubbo:protocol cluster="xxx" />
或
<dubbo:provider cluster="xxx" />
原文地址:https://www.cnblogs.com/po-shi/p/11251269.html