在学习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(ListserviceInstances) { 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进行建立请求,故会出错。
后续可以和其它服务注册中心结合使用!
欢迎大家关注我的微信公众账号:小鱼说编程
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)