前言
Ribbon简单入门的时候已经讲过了负载均衡算法公式,本次自己动手写一个简单的轮询算法实现服务调用,代码是参考尚硅谷周阳老师的视频
准备工作
-
消费者80服务关闭@LoadBalanced注解
@Configuration public class BeanConfig { @Bean //@LoadBalanced //开启负载均衡的功能 public RestTemplate getRestTemplate(){ return new RestTemplate(); } }
-
服务提供者增加以下业务类
/** * 简单返回该服务的端口号 * @return */ @GetMapping(value = "port") public String getPort() { return port; }
轮询算法编写
-
消费者80端增加如下接口
public interface TestLoadBalancedInter { /** * * @param list :服务列表 * @return 具体的服务实例 */ ServiceInstance getServiceInstance(List<ServiceInstance> list); }
-
具体的轮询算法实现类
/** * 轮询算法实现类 */ @Component @Slf4j public class TestLoadBalancedInterImpl implements TestLoadBalancedInter { /** * 定义一个原子类,初始值为0 */ private AtomicInteger nextServerCyclicCounter = new AtomicInteger(0); /** * 获取请求次数 * @return */ public final Integer incrementAndGetModulo(){ int current; //当前值 int next; //下一个值 do { current = this.nextServerCyclicCounter.get(); next = current >= Integer.MAX_VALUE ? 0 : current+1; /** * current和next相等时跳出循环,否则一直循环 */ }while (!this.nextServerCyclicCounter.compareAndSet(current,next)); log.info("第"+next+"次访问。。。"); return next; } /** * * @param list 服务列表 * @return 返回具体的服务实例 */ @Override public ServiceInstance getServiceInstance(List<ServiceInstance> list) { int index = incrementAndGetModulo() % list.size(); //计算下标 ServiceInstance serviceInstance = list.get(index); //获取具体的服务实例 return serviceInstance; } }
-
消费者80端增加业务类
@Resource private RestTemplate restTemplate; /** * 注入自定义的轮询算法接口 */ @Autowired private TestLoadBalancedInter testLoadBalancedInter; /** * DiscoveryClient:为客户端提供简单的API */ @Resource private DiscoveryClient discoveryClient; @GetMapping(value = "/port") public String getPort(){ //根据服务名称获取集群服务列表 List<ServiceInstance> list = discoveryClient.getInstances("EUREKA-CLIENT-SERVICE"); //获取具体的服务实例 ServiceInstance serviceInstance = testLoadBalancedInter.getServiceInstance(list); URI uri = serviceInstance.getUri(); return restTemplate.getForObject(uri+"/port",String.class); }
-
自定义的轮询效果如下