在学习Ribbon之前,我们考虑一个问题:当服务器访问量过大导致服务器奔溃应该怎么解决?
主要可以通过以下俩种途径进行解决:
1、提高服务器的性能指标,无外乎就是CPU、内存与磁盘IO。主要可以从优化代码、优化数据库和尽可能的使用静态数据入手。
2、增加服务器的数量,通俗的讲就是多部署几套服务,哪个服务空闲、压力小就优先访问哪台服务器。
Ribbon
前提了解:
Ribbon其实就是一个负载均衡的客户端组件,他可以和其他所需的客户端组件进行结合使用,优先选择其中负载较小的服务进行使用。
Ribbon常用的负载均衡的算法:
Ribbon(默认)+Eureka结合使用
1、引入POM文件
2、集群版Eureka服务端配置信息
3、配置访问Http服务的方法
若使用默认的负载均衡注解需要将访问的地址通过服务名代替。
4、编写Controller进行
5、启动项目测试接口
访问/getUser:
访问使用负载均衡进行访问的接口/resfulUser:
使用默认的负载均衡算法一个注解即可!
Ribbon(自定义负载均衡算法)+Eureka结合使用
自定义负载均衡的算法主要区别是:
1、增加Ribbon的配置文件
2、启动类增加注解属性
3、增加Controller测试接口,当前我们已经将负载均衡算法自定义为随机
4、请求接口4次结果
则:自定义的随机算法已经修改成功!
以上的Ribbon自定义注解,其实就是将默认的负载均衡算法,修改成Ribbon的其他负载均衡算法。接下来我们自己定义一个负载均衡的算法:
定义一个接口:
实现计数功能,并进行服务选择:
@Component
public class MyLB implements LoadBalancer {
// 请求进来方法是多线程的,所以请求计数需要原子类进行计数,保证请求结果的正确性
private AtomicInteger atomicInteger = new AtomicInteger(0);
@Override
public ServiceInstance instance(List serviceInstances) {
int index = getAndIncrement()%serviceInstances.size();
return serviceInstances.get(index);
}
public final int getAndIncrement(){
int crrent;
int next;
do{
crrent = this.atomicInteger.get();
next = crrent >= 99 ? 0 : crrent + 1;
}while (!this.atomicInteger.compareAndSet(crrent,next));
System.out.println("获取的next的值为:" + next);
return next;
}
}
Controller层进行选择服务操作:
测试结果:
使用自己的算法,需要将@LoadBalanced注解注释掉,原因是:此注解是将Ribbon与访问Http请求结合使用,是通过服务名建立连接,而我们的是通过IP进行建立请求,故会出错。
后续可以和其它服务注册中心结合使用!
欢迎大家关注我的微信公众账号:小鱼说编程



