一、Dubbo負載均衡的幾種方式
Dubbo支持以下幾種負載均衡方式:
- Random LoadBalance
- RoundRobin LoadBalance
- LeastActive LoadBalance
- ConsistentHash LoadBalance
- Forking LoadBalance
- Failover LoadBalance
- Failfast LoadBalance
- Failsafe LoadBalance
具體說明如下:
- Random LoadBalance:隨機選擇一個服務提供者。
- RoundRobin LoadBalance:輪詢選擇服務提供者。
- LeastActive LoadBalance:選取活躍調用數最小的服務提供者。
- ConsistentHash LoadBalance:一致性哈希負載均衡演算法。
- Forking LoadBalance:並行調用多個服務提供者,只要有一個成功就返回。
- Failover LoadBalance:失敗自動切換到其他服務提供者,通常用於非冪等性的遠程調用。
- Failfast LoadBalance:失敗快速失敗,通常用於冪等性的遠程調用。
- Failsafe LoadBalance:失敗安全,總是調用所有服務提供者,通常用於寫入審計日誌等操作。
二、Dubbo負載均衡策略
Dubbo負載均衡有兩種策略,即隨機和權重。下面給出Dubbo配置文件中的負載均衡配置示例:
這裡設置負載均衡策略為隨機,也可以設置為權重策略,示例如下:
三、Dubbo負載均衡源碼
Dubbo負載均衡的源碼在Dubbo的GitHub倉庫中,查看地址為:https://github.com/apache/dubbo/tree/master/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/loadbalance
四、Ribbon負載均衡
Ribbon是Netflix開源的負載均衡組件,Dubbo可以集成Ribbon實現負載均衡。Ribbon的負載均衡演算法可以自定義實現,Dubbo使用的是RoundRobin策略,示例配置如下:
五、Dubbo協議
Dubbo協議是Dubbo RPC通信協議的實現,其主要特點如下:
- Dubbo協議採用NIO非同步通信、多路復用技術,可以提高吞吐量。
- Dubbo協議支持長連接,減少連接建立的開銷。
- Dubbo協議支持多協議,可以在dubbo://、rest://等多種協議間切換。
六、Dubbo介面
Dubbo介面是Dubbo服務的提供方和消費方進行通信的契約。Dubbo服務提供者和消費者都必須引用相同的介面。
示例代碼:
public interface DemoService { String sayHello(String name); }
七、Dubbo負載均衡演算法
Dubbo負載均衡演算法有多種實現方式,例如RandomLoadBalance、RoundRobinLoadBalance等。下面給出RoundRobinLoadBalance的演算法簡述:
- 將所有可用服務提供者存入一個有序列表list
- 如果服務提供者列表為空,則返回空;如果只有一個服務提供者,則返回該服務提供者
- 如果服務提供者列表不為空,則獲取下一個服務提供者並返回
其Java代碼實現如下:
public class RoundRobinLoadBalance extends AbstractLoadBalance { private final AtomicPositiveInteger sequences = new AtomicPositiveInteger(); protected Invoker doSelect(List<Invoker> invokers, URL url, Invocation invocation) { int length = invokers.size(); // 調用的服務數 int maxWeight = 0; int minWeight = Integer.MAX_VALUE; final LinkedHashMap<Invoker, IntegerWrapper> invokersWightMap = new LinkedHashMap<Invoker, IntegerWrapper>(); int weightSum = 0; for (int i = 0; i < length; i++) { Invoker invoker = invokers.get(i); int weight = invoker.getUrl().getMethodParameter(invocation.getMethodName(), "weight", 100); invokersWightMap.put(invoker, new IntegerWrapper(weight)); weightSum += weight; maxWeight = Math.max(maxWeight, weight); minWeight = Math.min(minWeight, weight); } // 不同的權重轉換為相同的權重 if (maxWeight > 0 && minWeight 0) { for (Map.Entry<Invoker, IntegerWrapper> entry : invokersWightMap.entrySet()) { entry.setValue(new IntegerWrapper(entry.getValue().get() - minWeight)); } weightSum -= minWeight * length; } } // 循環列表進行輪轉 int sequence = sequences.getAndIncrement(); if (weightSum > 0 && sequence < Integer.MAX_VALUE) { int currentWeight = -1; Invoker selectedInvoker = null; int currentSequence = -1; for (int i = 0; i weightSum) { sequence = weightSum; } for (Map.Entry<Invoker, IntegerWrapper> entry : invokersWightMap.entrySet()) { selectedInvoker = entry.getKey(); currentWeight = entry.getValue().get(); currentSequence += currentWeight; if (currentSequence >= sequence) { return selectedInvoker; } } currentSequence = 0; } } // 相同權重,隨機選擇 return invokers.get(ThreadLocalRandom.current().nextInt(length)); } static class IntegerWrapper { private int value; public IntegerWrapper(int value) { this.value = value; } public int get() { return value; } public void set(int value) { this.value = value; } } }
八、Dubbo負載均衡原理
Dubbo負載均衡實現的原理如下:
- 獲取所有可用服務提供者的列表,計算出他們的權重
- 根據負載均衡策略選擇一個服務提供者
- 如果服務提供者無法響應,返回到第2步重新選擇
- 返回選取的服務提供者
九、Dubbo負載均衡在哪層
Dubbo負載均衡在服務層,屬於網路通信層。
十、Dubbo負載均衡策略如何配置選取
Dubbo負載均衡策略可以在Dubbo配置文件中進行配置,例如:
也可以通過代碼進行動態設置,例如:
public class DemoConsumer { public static void main(String[] args) { ReferenceConfig reference = new ReferenceConfig(); reference.setInterface(DemoService.class); reference.setLoadbalance("roundrobin"); DemoService demoService = reference.get(); String hello = demoService.sayHello("world"); System.out.println(hello); } }
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/312777.html