SpringCloud-----Ribbon手写轮询算法

网友投稿 251 2022-09-19

SpringCloud-----Ribbon手写轮询算法

1.在服务的消费方提供一个接口

public interface LoadBalancer{ // serviceInstanceList 为eureka中服务的数量 ServiceInstance instance(List serviceInstanceList);}

2.实现接口

@Component // 注意一定要将其注入到spring容器之中public class MyLb implements LoadBalancer{ // 原子类,保证多线程安全,赋予初始化值为0 private AtomicInteger atomicInteger = new AtomicInteger(0); // 获取第几次访问 // 使用 自旋锁 和 CAS private final int getAndIncrement(){ int current; int next; do{ current = this.atomicInteger.get(); next = current >= Integer.MAX_VALUE ? 0 : current+1; }while (!this.atomicInteger.compareAndSet(current,next)); // CAS 和内存的数据比较,没有更改,则改为期望的值 return next; } @Override public ServiceInstance instance(List serviceInstanceList) { // 算法: 实际调用服务器位置下标 = rest 接口第几次请求数 % 服务器集群总个数 int index = getAndIncrement() % serviceInstanceList.size(); return serviceInstanceList.get(index); }}

3.Controller接口实现 ,记住注释@LoadBalanced

public static final String PAYMENT_URL = " @Resource private DiscoveryClient discoveryClient; @Resource private LoadBalancer loadBalanced; @GetMapping(value = "/consumer/payment/lb") public String getPaymentLB(){ List instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE"); if(instances == null || instances.size()<=0){ return null; } ServiceInstance serviceInstance = loadBalanced.instance(instances); URI uri = serviceInstance.getUri(); return restTemplate.getForObject(uri+"/payment/lb",String.class); }

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:集合框架_去除ArrayList集合中的重复自定义对象元素案例
下一篇:Javaz整型数据类型、浮点型数据类型,取值范围
相关文章

 发表评论

暂时没有评论,来抢沙发吧~