#自定义ribbon的负载均衡策略—轮询
编写轮询算法
package com.ljj.LB.imp;
import com.ljj.LB.LoadBalance;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
@Component
public class LbImp implements LoadBalance {
/**
* AtomicInteger:原子类型数,常用在多线程操作同一资源时要保证原子性
* eg:a++ 要经过三个步骤
* (1)从主存中读取a的值
* (2)对a进行加1操作
* (3)把a重新刷新到主存
*/
private AtomicInteger atomicInteger = new AtomicInteger(0);
/**
* 这个方法得到的其实是请求次数,因为请求是多线程的所以用原子类型保持原子性
* while里面比较当前值与期望值,采用自旋锁的方式
* @return
*/
public final int getAndIncrement() {
int current;
int next;
do {
current = this.atomicInteger.get();
next = current >= 2147483647 ? 0 : current++;
} while (!this.atomicInteger.compareAndSet(current,next));
System.out.println(next+"......");
return next;
}
/**
* 得到本次该调用的服务
*
* @param serviceInstances
* @return
*/
@Override
public ServiceInstance serviceInstance(List<ServiceInstance> serviceInstances) {
int index=getAndIncrement()%serviceInstances.size();
return serviceInstances.get(index);
}
}
- ribbon=restTemplate+loadBalance
服务调用
/**
* 何为ribbon?
* ribbon就是RestTemplate+@LoadBalance
* 是实现再服务消费方的一种负载均衡策略
* <p>
* postForObject:返回的是普通的json
* postForEntity:返回的是带有请求头响应状态码等信息的json
* <p>
* 调用写的服务
*
* @param payment
* @returnhttp://
*/
@GetMapping("consumer/payment/lb")
public String testLb()
{
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUDPROVIDER-PAYMENT");
ServiceInstance serviceInstance = loadBalance.serviceInstance(instances);
URI uri = serviceInstance.getUri();
log.info("调用的实列的uri:"+uri);
return restTemplate.getForObject(uri+"provider/payment/lb",String.class);
}