springboot+Ribbon实现负载均衡+以及如何实现⼿写⼀个负载均衡算法
@Configuration
public class ApplicationContextConfig {
@Bean
//使⽤轮询的负载均衡 @LoadBalanced
amen
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
总结:Ribbon其实就是⼀个软负载均衡的客户端组件,他可以和其他所需请求的客户端结合使⽤,和eu
reka结合只是其中的⼀个实例。在新的spring-cloud-starter-netflix-eureka-client中默认是有Ribbon的所以不⽤再添加pom
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
在spring-cloud-starter-consul-discovery也是默认存在Ribbon的
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
在 spring-cloud-starter-zookeeper-discovery也是默认存在Ribbon的
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
后续如果还有别的默认Ribbon的将再更新
Ribbon出了默认的轮询还有哪些负载均衡算法
shame>uu
BestAvailableRule 会先过滤掉由于多次访问故障⽽处于断路器跳闸状态的服务,然后选择⼀个并发量
最⼩的服务
AvailabilityFilteringRule 先过滤掉故障实例,再选择并发较⼩的实例
rain cats and dogs
ZoneAvoidanceRule默认规则,复合判断rver所在区域的性能和rver的可⽤性选择服务器
日本语这些算法都可以通过替换轮询来⾃定义实现Ribbon的负载均衡
消费者需要修改
这⾥我就将修改的部分贴出需要其他内容的看上⾯的连接有志者事竟成 英文
新建⼀个不被@ComponentScan扫描到的路径然后在该路径下新建⼀个配置类MySelfRule
成考英语作文范文50篇@Configuration
public class MySelfRule {
@Bean
public IRule myRule(){
return new RandomRule();//定义为随机
}
}
然后在启动类上添加注解@RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration = MySelfRule.class)
这样就表⽰使⽤⾃定义的负载均衡算法代替默认的轮询算法
2012年考研成绩查询@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name ="CLOUD-PAYMENT-SERVICE",configuration = MySelfRule.class)
public class OrderMain {
public static void main(String[] args){
SpringApplication.run(OrderMain.class,args);
}
}
启动项⽬运⾏接⼝就可以看到随机访问。
⼿写⼀个简单的负载均衡算法
服务器轮询负载均衡原理
Ribbon各种算法的结构树
⼿写⼀个简单的轮询算法
在⽣产者的controller中添加⼀个获取当前端⼝号的⽅法
@GetMapping(value ="/payment/lb")public String getPaymentLB(){return rverPort;}
消费者端先将ApplicationContextBean去掉@LoadBalanced
写⼀个LoadBalancer接⼝
public interface LoadBalancer {
//收集服务器总共有多少台能够提供服务的机器,并放到list⾥⾯
ServiceInstance instances(List<ServiceInstance> rviceInstances);}
实现LoadBalancer接⼝
avoided
@Component
public class MyLB implements LoadBalancer {
private AtomicInteger atomicInteger =new AtomicInteger(0);//坐标
private final int getAndIncrement(){
int current;
int next;
do{
current = ();
next = current >=2147483647?0: current +1;
}while(!pareAndSet(current,next));//第⼀个参数是期望值,第⼆个参数是修改值是 System.out.println("*******第⼏次访问,次数next: "+next);return next;}
@Override
gentle什么意思public ServiceInstance instances(List<ServiceInstance> rviceInstances){
//得到机器的列表
int index =getAndIncrement()%rviceInstances.size();
//得到服务器的下标位置
(index);}}
controller类
@GetMapping(value ="/consumer/payment/lb")
public String getPaymentLB(){
List<ServiceInstance> instances = Instances("CLOUD-PAYMENT-SERVICE");
if(instances ==null|| instances.size()<=0){
return null;
}
ServiceInstance rviceInstance = loadBalancer.instances(instances);
URI uri = Uri();
ForObject(uri+"/payment/lb",String.class);}