1.前言
Ribbon是SpringCloud的负载均衡器,默认的算法是轮询。在这里为了方便负载均衡的原理,可以自己手写一个负载均衡器
2.自定义一个本地负载均衡器
2.1.ApplicationContextBean去掉注解@LoadBalanced
package com.itxiongmao.config;
/**
* @BelongsProject: springcloud2020
* @BelongsPackage: com.itxiongmao.config
* @CreateTime: 2020-07-09 12:27
* @Description: TODO
*/
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
public class ApplicationContextConfig {
//@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
2.2.LoadBalancer接口
package com.itxiongmao.lb;
import org.springframework.cloud.client.ServiceInstance;
import java.util.List;
public interface LoadBalaner {
ServiceInstance instance(List<ServiceInstance> instances);
}
2.3.MyLB
package com.itxiongmao.lb;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
public class MyLB implements LoadBalaner {
private AtomicInteger atomicInteger = new AtomicInteger(0);
public final int getIncrement() {
int current;
int next;
do {
current = this.atomicInteger.get();
next = current >= 2147483647 ? 0 : current+1;
}while (!this.atomicInteger.compareAndSet(current,next));
System.out.println("------------第几次访问:次数next"+next);
return next;
}
public ServiceInstance instance(List<ServiceInstance> instances) {
int index = getIncrement() % instances.size();
return instances.get(index);
}
}
2.5.OrderController
private DiscoveryClient discoveryClient;
private LoadBalaner loadBalaner;
("payment/lb/selectOne/{id}")
public String getPaymentLB( ("id") long id) {
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
if (instances == null || instances.size() == 0) {
return null;
}
ServiceInstance serviceInstance = loadBalaner.instance(instances);
URI uri = serviceInstance.getUri();
return restTemplate.getForObject(uri + "/payment/get", String.class);
}
2.6.测试