图解Dubbo,六种扩展机制详解( 五 )


下面是Dubbo的负载均衡扩展机制的时序图:

图解Dubbo,六种扩展机制详解

文章插图
负载均衡扩展机制
2、负载均衡扩展机制的使用示例Dubbo的负载均衡扩展机制可以通过在服务提供方和服务消费方的配置文件中指定负载均衡策略来使用 。
例如 , 在服务提供方的配置文件中可以添加以下配置:
<dubbo:service interface="com.xxx.XxxService" loadbalance="roundrobin" />在服务消费方的配置文件中可以添加以下配置:
<dubbo:reference interface="com.xxx.XxxService" loadbalance="random" /> 
这样就可以实现使用Dubbo内置的轮询
3、自定义负载均衡策略的实现示例用户可以通过实现Dubbo的LoadBalance接口来自定义负载均衡策略 。
以下是一个示例:
public class MyLoadBalance implements LoadBalance {@Overridepublic <T> Invoker<T> select(List<Invoker<T>> invokers, URL url, Invocation invocation) throws RpcException {// 自定义负载均衡算法实现return invokers.get(0);}} 
七、Dubbo的容错机制扩展1、Dubbo的容错机制概述
Dubbo的容错机制是指当Dubbo服务调用出现异常时 , Dubbo框架会根据预设的容错机制进行处理 , 以保证服务的高可用性 。
Dubbo框架默认提供了多种容错机制 , 如Failover、Failfast、Failsafe、Failback、Forking等 , 也支持自定义容错机制 。
Dubbo的容错机制通常是通过在客户端代理层实现的 , 当远程服务调用出现异常时 , 客户端代理会根据预设的容错机制进行重试或处理 , 以保证服务的高可用性 。
图解Dubbo,六种扩展机制详解

文章插图
容错机制
在Dubbo的容错机制中 , ClusterInvoker负责调用远程服务 , 并进行容错处理 。当调用远程服务发生异常时 , Dubbo会按照以下顺序进行容错处理:
  1. ClusterInvoker处理异常;
  2. 如果ClusterInvoker处理异常失败 , 则交由Router处理异常;
  3. 如果Router处理异常失败 , 则交由LoadBalance处理异常;
  4. 如果LoadBalance处理异常失败 , 则抛出异常给InvokerInvocationHandler , 最终抛出给Consumer 。同时 , Dubbo还会将异常信息进行监控 , 并更新调用统计信息 。
2、容错机制扩展的使用示例Dubbo默认的容错机制是Failover , 即自动切换重试其他节点 , 达到容错和负载均衡的效果 。如果需要使用其他容错机制 , 可以通过在服务提供方和服务消费方的配置文件中进行配置 。
例如 , 我们可以通过以下方式配置使用Failfast容错机制:
在服务提供方的配置文件中增加如下配置:
<dubbo:service interface="com.example.service.SomeService" retries="0"/>在服务消费方的配置文件中增加如下配置:
<dubbo:reference interface="com.example.service.SomeService" check="false" cluster="failfast"/> 
这样 , 在服务调用出现异常时 , Dubbo框架会自动使用Failfast容错机制进行处理 , 即只进行一次调用 , 若调用失败则立即抛出异常 , 不进行重试 。
3、自定义容错策略的实现示例如果需要实现自定义的容错策略 , 可以通过继承org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker?类 , 并实现org.apache.dubbo.rpc.Invoker接口 , 来自定义容错策略的实现 。
例如 , 我们可以通过以下代码实现一个自定义的容错策略:
public class MyClusterInvoker<T> extends AbstractClusterInvoker<T> {public MyClusterInvoker(Directory<T> directory) {super(directory);}@Overrideprotected Result doInvoke(Invocation invocation, List<Invoker<T>> invokers, LoadBalance loadbalance) throws RpcException {// 自定义容错逻辑...}} 在实现自定义容错策略后 , 需要在服务提供方和服务消费方的配置文件中进行配置 。
例如 , 在服务提供方的配置文件中增加如下配置:
 
<dubbo:service interface="com.example.service.SomeService" cluster="myClusterInvoker"/>


推荐阅读