Ribbon入门与使用

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