关于如何实现一个自定义的集群容错模式,可以参考Dubbo源码中内置支持的汲取你容错模式的实现,6种模式对应的实现类如下所示:
[url=][/url]
com.alibaba.dubbo.rpc.cluster.support.FailoverClustercom.alibaba.dubbo.rpc.cluster.support.FailfastClustercom.alibaba.dubbo.rpc.cluster.support.FailsafeClustercom.alibaba.dubbo.rpc.cluster.support.FailbackClustercom.alibaba.dubbo.rpc.cluster.support.ForkingClustercom.alibaba.dubbo.rpc.cluster.support.AvailableCluster[url=][/url]
可能我们初次接触Dubbo时,不知道如何在实际开发过程中使用Dubbo的集群模式,后面我们会以Failover Cluster模式为例开发我们的分布式应用,再进行详细的介绍。
Dubbo服务负载均衡Dubbo框架内置提供负载均衡的功能以及扩展接口,我们可以透明地扩展一个服务或服务集群,根据需要非常容易地增加/移除节点,提高服务的可伸缩性。Dubbo框架内置提供了4种负载均衡策略,如下所示:
- ●Random LoadBalance:随机策略,配置值为random。可以设置权重,有利于充分利用服务器的资源,高配的可以设置权重大一些,低配的可以稍微小一些
- ●RoundRobin LoadBalance:轮询策略,配置值为roundrobin。
- ●LeastActive LoadBalance:配置值为leastactive。根据请求调用的次数计数,处理请求更慢的节点会受到更少的请求
- ●ConsistentHash LoadBalance:一致性Hash策略,具体配置方法可以参考Dubbo文档。相同调用参数的请求会发送到同一个服务提供方节点上,如果某个节点发生故障无法提供服务,则会基于一致性Hash算法映射到虚拟节点上(其他服务提供方)
在实际使用中,只需要选择合适的负载均衡策略值,配置即可,下面是上述四种负载均衡策略配置的示例:
[url=][/url]
<dubbo:service interface="org.shirdrn.dubbo.api.ChatRoomOnlineUserCounterService" version="1.0.0" cluster="failover" retries="2" timeout="1000" loadbalance="random" ref="chatRoomOnlineUserCounterService" protocol="dubbo" > <dubbo:method name="queryRoomUserCount" timeout="500" retries="2" loadbalance="leastactive" /> </dubbo:service> [url=][/url]
上述配置,也体现了Dubbo配置的继承性特点,也就是dubbo:service元素配置了loadbalance=”random”,则该元素的子元素dubbo:method如果没有指定负载均衡策略,则默认为loadbalance=”random”,否则如果dubbo:method指定了loadbalance=”leastactive”,则使用子元素配置的负载均衡策略覆盖了父元素指定的策略(这里调用queryRoomUserCount方法使用leastactive负载均衡策略)。当然,Dubbo框架也提供了实现自定义负载均衡策略的接口,可以实现com.alibaba.dubbo.rpc.cluster.LoadBalance接口,接口定义如下所示:
[url=][/url]
/*** LoadBalance. (SPI, Singleton, ThreadSafe)** <a href="http://en.wikipedia.org/wiki/Load_balancing_(computing)">Load-Balancing</a>** @see com.alibaba.dubbo.rpc.cluster.Cluster#join(Directory)* @author qian.lei* @author william.liangf*/@SPI(RandomLoadBalance.NAME)public interface LoadBalance { /** * select one invoker in list. * @param invokers invokers. * @param url refer url * @param invocation invocation. * @return selected invoker. */ @Adaptive("loadbalance") <T> Invoker<T> select(List<Invoker<T>> invokers, URL url, Invocation invocation) throws RpcException;}[url=][/url]
如何实现一个自定义负载均衡策略,可以参考Dubbo框架内置的实现,如下所示的3个实现类:
com.alibaba.dubbo.rpc.cluster.loadbalance.RandomLoadBalancecom.alibaba.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalancecom.alibaba.dubbo.rpc.cluster.loadbalance.LeastActiveLoadBalance |