一、简介

1. 是什么

  • spring cloud ribbon是基于netflix ribbon实现的一套客户端负载均衡的工具。
  • 简单的说,ribbon是netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。
  • 官方文档
  • 目前已进入维护状态,以后可以通过open feign作为替代方案
  • 负载均衡+resttemplate,实现负载均衡调用

2. 负载均衡

  • 负载均衡(load balance,lb),即将用户的请求平摊到多个服务上,从而达到系统的高可用(ha)
  • 负载均衡分为两种方案:集中式lb、进程内lb

2.1 集中式lb

  • 即服务方和消费方之间使用独立的lb设施,由该设备负责把访问请求通过某种策略转发至服务提供方。
  • 比如说nginx、gateway、zuul等

2.2 进程内lb

  • 负载均衡的算法集成到消费方,消费方在注册中心中获取可用地址,然后通过lb算法选择出一个合适的服务器。
  • ribbon就属于进程内lb,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务方提供的地址。

二、实验

ribbon集成在spring-cloud-starter-netflix-eureka-client中,可以参考。在此基础上简单修改一下,就可以完成服务调用及负载均衡

1. resttemplate

  • 官网
  • 通过resttemplate,可以实现httpclient的功能,只需要给它提供一个url及返回类型,即可实现远程方法调用。

1.1 加入到ioc容器

首先,将其加入到ioc容器中。@loadbalanced表示开启负载均衡。

1.2 resttemplate 远程调用

也可以使用getforentity()方法,获取整个响应,自己在响应中获取想要的内容。

如果使用post方法,就将get改成post就好了。

1.3 配置文件

url,可以写具体的地址,表示直接调用该地址;也可以写在eureka的服务名,首先在eureka中获取该服务的所有地址,再通过lb选择一个。

2. loadbalancer

上面通过@loadbalanced开启了负载均衡。默认使用轮询算法,也可以修改成其他算法。

class 算法
com.netflix.loadbalancer.roundrobinrule 轮询,默认算法
com.netflix.loadbalancer.randomrule 随机算法,通过产生随机数选择服务器
com.netflix.loadbalancer.retryrule 先按照roundrobinrule的策略获取服务,如果获取服务失败则在指定时间内会进行重试,获取可用的服务
weightedresponsetimerule 对roundrobinrule的扩展,响应速度越快的实例选择权重越大,越容易被选择
bestavailablerule 会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
availabilityfilteringrule 先过滤掉故障实例,再选择并发较小的实例
zoneavoidancerule 默认规则,复合判断server所在区域的性能和server的可用性选择服务器

2.1 修改负载均衡算法

如果想让该算法只针对某个服务,则不能将其放在componentscan够得到的地方,否则会修改所有服务的负载均衡算法。因此,最好在外面再新建一个package,用来放这个lb

在主启动类上,标识一下服务与算法直接的映射关系

如果嫌这种方法麻烦,也可以使用配置文件的方法

3. 负载均衡算法源码

以默认的roundrobinrule作为阅读的源码,其他的源码基本上很类似,只是修改的选择服务器的代码。

  • roundrobinrule父类为abstractloadbalancerrule,abstractloadbalancerrule实现了接口irule

3.1 irule

3.2 abstractloadbalancerrule

基本没什么作用,只是将公共的部分提取了出来进行实现。

3.3 roundrobinrule

简单来说,就是通过一个计数器,实现了轮询

简单来说,该方法就是根据目前的状态,选择一个服务器返回。

简单来说,就是将目前的计数器+1取余,获取一个下标,并返回。为了避免高并发的危险,采用cas的方法进行设置。

以上就是spring cloud调用ribbon的步骤的详细内容,更多关于spring cloud调用ribbon的资料请关注www.887551.com其它相关文章!