手写类似Ribbon 实现本地负载均衡,so easy,一眼你就懂
Posted fishness
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手写类似Ribbon 实现本地负载均衡,so easy,一眼你就懂相关的知识,希望对你有一定的参考价值。
实现思想:
负载均衡算法:请求书%服务器数量得到实际服务器下标HttpClient进行调用
利用DiscoveryClient
1.注入@Autowired
private DiscoveryClient discoveryClient
2.List<ServiceInstance> discoveryClientInstances = discoveryClient.getInstances("服务器别名"); //获得该别名集群的所有服务信息
计算:list下标 = 访问次数 % discoveryClientInstances.size()
假设 : 第一次访问 : 1(访问次数) % 2(有两个服务信息) = 访问下标1
第一次访问 : 2(访问次数) % 2(有两个服务信息) = 访问下标0
以此类推,获得服务器地址将进行轮询
源码示例:
/**
* @author fish
*/
@RestController
public class FishRibbonController {
@Autowired
private DiscoveryClient discoveryClient;
@Autowired
private RestTemplate restTemplate;
private int reqNub = 1;
@RequestMapping(value = "myRibbon")
public String myRibbon(){
String insAdd = serviceUri() + "/index";
System.out.println(insAdd);
return restTemplate.getForObject(insAdd,String.class);
}
public String serviceUri(){
List<ServiceInstance> discoveryClientInstances = discoveryClient.getInstances("provider");
if(discoveryClientInstances == null || discoveryClientInstances.size() == 0){
return null;
}
int instances = discoveryClientInstances.size();
int serviceIndex = reqNub % instances;
reqNub++;
return discoveryClientInstances.get(serviceIndex).getUri().toString();
}
}
以上是关于手写类似Ribbon 实现本地负载均衡,so easy,一眼你就懂的主要内容,如果未能解决你的问题,请参考以下文章
SpringCloud03_Ribbon的概述核心组件IRule负载均衡算法底层原理手写Ribbon轮询算法
SpringCloud-2.0(8. 负载均衡 - Ribbon)