Ribbon入门与使用
ribbon 官方github地址:https://github.com/Netflix/ribbon
Ribbon是springcloud生态广泛使用的负载均衡组件。
Ribbon提供了10种策略供开发者使用。
RoundRobinRule |
轮训策略 |
RandomRule |
随机策略 |
BestAvailableRule |
过滤出故障服务器后,选择一个并发量最小的 |
WeightedResponseTimeRule |
针对响应时间加权轮询 |
AvailabilityFilteringRule |
可用过滤策略,先过滤出故障的或并发请求大于阈值的一部分服务实例,然后再以线性轮询的方式从过滤后的实例清单中选出一个; |
ZoneAvoidanceRule |
从最佳区域实例集合中选择一个最优性能的服务实例 |
RetryRule |
选择一个Server,如果失败,重新选择一个Server重试 |
开始一个Hello World
利用 BaseLoadBalancer
来测试一个简单的负载均衡
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| @Test public void testBaseLoadBalancer() throws ClientException { List<Server> serverList = new ArrayList<>(); serverList.add(createServer("华南", 8001)); serverList.add(createServer("华东", 7001)); serverList.add(createServer("华东", 7002));
serverList.add(createServer("华北", 6001)); serverList.add(createServer("华北", 6002)); serverList.add(createServer("华北", 6003)); serverList.add(createServer("华北", 6004));
BaseLoadBalancer lb = new BaseLoadBalancer(); lb.addServers(serverList);
for (int i = 0; i < 10; i++) { String choose = lb.choose(null); System.out.println("choose = " + choose); } }
private Server createServer(String zone, int index) { Server server = new Server(zone + ".com", index); server.setZone(zone); return server; }
|
可以看到输出结果如下
choose = 华东.com:7001 choose = 华东.com:7002 choose = 华北.com:6001
choose = 华北.com:6002 choose = 华北.com:6003 choose = 华北.com:6004
choose = 华南.com:8001 choose = 华东.com:7001 choose = 华东.com:7002
choose = 华北.com:6001
默认情况下ribbon是采用轮询策略,假设我使用
RandomRule
,可以更改代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| @Test public void testBaseLoadBalancer() throws ClientException { List<Server> serverList = new ArrayList<>(); serverList.add(createServer("华南", 8001)); serverList.add(createServer("华东", 7001)); serverList.add(createServer("华东", 7002));
serverList.add(createServer("华北", 6001)); serverList.add(createServer("华北", 6002)); serverList.add(createServer("华北", 6003)); serverList.add(createServer("华北", 6004));
BaseLoadBalancer lb = new BaseLoadBalancer(); lb.addServers(serverList);
RandomRule randomRule = new RandomRule(); for (int i = 0; i < 10; i++) { Server choose = randomRule.choose(lb, null); System.out.println("choose = " + choose); } }
private Server createServer(String zone, int index) { Server server = new Server(zone + ".com", index); server.setZone(zone); return server; }
|
输出的结果每次是不同的,示例输出如下:
choose = 华北.com:6004 choose = 华北.com:6002 choose = 华北.com:6004
choose = 华南.com:8001 choose = 华北.com:6002 choose = 华北.com:6003
choose = 华北.com:6002 choose = 华北.com:6003 choose = 华北.com:6003
choose = 华北.com:6004