Dubbo的容错方式
Dubbo默认提供了6中容错方式,默认为Failover cluster。如果这6中容错方式不能满足还可以支持自定义拓展,几乎所有的功能都采用了插拔式的拓展;
- failover cluster:失败自动切换;当服务调用失败后,会切换到集群中的其它机器进行重试,默认重试此时为2,可以通过retries=2来修改次数。重试可能带来网络延迟,并且容易造成数据重复操作,所以一般情况下这种模式通常用于读操作;
- failfast cluster:当服务调用失败后,立即报错,也就是只发起一次调用,通常用于一些幂等的写操作,比如新增数据等操作;
- failsafe cluster:失败安全,也就是出现异常时直接忽略;
- failback cluster:失败后自动回复,服务调用出现异常时,在后台记录这条失败的请求定时重发,这种模式适用于消息通知操作,保证这个消息一定发送成功;
- forking cluster:并行调用集群中的多个服务,只有一个成功就返回;可以通过forks-2来设置最大并行数;
- broadcast cluster:广播调用所有的服务提供者,任意一个服务报错则表示服务调用失败,这种机制通常用于通知所有的服务提供者更新缓存或者本地资源信息:
负载均能
在Dubbo中他工了4种负载均衡策略,默认的负载均衡策略是random。同样,如果这4种策略不能满足实际需求,我们可以基于Dubbo中的Spi机制来进行拓展。
random loadbalance:随机算法。可以针对性能较好的服务器设置较大的权重值,权重值越大,随机的概率也会越大;
- roundRobin loadbalance:轮询,按照公约后的权重设置轮询比例。
- LeastActive loadbalance:最少活跃调用,处理较慢的借点将会收到更少的请求。
- consistenHash loadbalance:一致性hash。相同请求参数的请求总是发送到同一个服务提供者。
容错与负载均衡的配置方式在指定服务的@Service服务上增加一个注解即可
@Service(cluster="failfast",loadbalance="random")
public class HelloServiceImpl implements HelloService{
}
Dubbo的服务降级
Dubbo提供了一种mock配置来实现服务降级,也就是说党服务提供方出现网络异常无法访问是,客户端不会抛出异常,而是返回降级数据具体操作如下:
在Customer服务中重写需要降级的接口
public class MockHelloService implement HelloService{
public String getMock(String param){
return "服务降级数据!"
}
}
在controller中修改@Reference注解增加mock参数,并设置容错机制
@RestController
public class HelloController{
@Autowired
@Reference(mock="xxx.xxx.xxx.MockHelloService",cluster="failfast")
private HelloService helloService;
public String sayHello(){
return HelloService.sayHello("mic");
}
}
Dubbo核心SPI