一、概述
1、介绍

Ribbon其实就是一个软负载均衡的客户端组件,他可以和其他所需请求的客户端结合使用,和eureka结合只是其中的一个实例。
2、负载均衡介绍

- 集中式负载均衡:

- 进程内负载均衡

3、客户端负载均衡和服务端负载均衡区别
二、实例
1、RestTemplate中getForObject和getForEntity区别
getForObject获取的是响应体中数据转化成的对象,可以看成json
getForEntity返回的是ResponseEntity对象,其中包含响应头、响应体、响应状态码等待。
2、核心组件IRule
IRule:根据特定算法从服务列表中选取一个要访问的服务
- RoundRobinRule:轮询
- RandomRule:随机
- RetryRule:先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重试
- WeightedResponseTimeRule :对RoundRobinRule的扩展,响应速度越快的实例选择权重越大,越容易被选择
- BestAvailableRule :会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
- AvailabilityFilteringRule : 先过滤掉故障实例,再选择并发较小的实例
- ZoneAvoidanceRule:默认规则,复合判断server所在区域的性能和server的可用性选择服务器

3、更换算法
首先在主启动类扫描不到的包中新建一个类
在此类中确定要使用的负载均衡算法
在主启动类上添加相应注解
4、手写轮询算法
采用面试接口编程
先定义一个规则接口:
然后有Mylb类实现此接口:
package com.ty.springcloud.lb;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.Component;
import java.lang.annotation.Annotation;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
@Component
public class MyLB implements LoadBanancer {
private AtomicInteger atomicInteger = new AtomicInteger(0);
/*获取当前访问次数并加一*/
private final int getAndIncrement(){
int current;
int next;
do{
current = atomicInteger.get();
next = current >= Integer.MAX_VALUE ? 0: current+1;
} while (!atomicInteger.compareAndSet(current,next));//第一个参数是期望值,第二个参数是修改值
System.out.println("**********第几次访问,next"+ next);
return next;
}
@Override
public ServiceInstance getServicerInstance(List<ServiceInstance> serviceInstances) {
int index = getAndIncrement() % serviceInstances.size();
return serviceInstances.get(index);
}
}
在controller类中实现:
@GetMapping("/consumer/payment/lb")
public String getLb(){
List<ServiceInstance> serviceInstances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
ServiceInstance serviceInstance = loadBanancer.getServicerInstance(serviceInstances);
return ""+serviceInstance.getPort();
}
通过访问此地址便可得到轮询的端口号
版权声明:本文为weixin_43946848原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。