概述
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套 客户端 负载均衡
的工具。
简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供 客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们很容易使用Ribbon实现自定义的负载均衡算法。
负载均衡 + RestTemplate 调用
集中式与进程内
集中式 LB
即在服务的消费方和提供方之间使用独立的 LB 设施(可以是硬件,如 F5,也可以是软件,如 Nginx),又该设施负责把访问请求通过某种策略转发至服务的提供方。
进程内
将 LB 逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。
Ribbon 就属于进程内 LB
,他只是一个类库,集成于消费方进程,消费方通过他来获取到服务提供方的地址。
工作步骤
- 第一步:选择 EurekaServer,他优先选择在同一区域内负载较少的 server。
- 第二步:再根据用户指定的策略,从 server 取到服务注册列表中选择一个地址。
- 策略:轮询、随机和根据响应时间加权。
Ribbon核心组件IRule
IRule:根据特定算法中从服务列表中选取一个要访问的服务。
- com.netflix.loadbalancer.RoundRobinRule:轮询;
- com.netflix.loadbalancer.RandomRule:随机;
- com.netflix.loadbalancer.RetryRule:先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重试,获取可用的服务;
- WeightedResponseTimeRule:对RoundRobinRule的扩展,响应速度越快的实例选择权重越大,越容易被选择;
- BestAvailableRule:会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务 ,然后选择一个并发量最小的服务;
- AvailabilityFilteringRule:先过滤掉故障实例,再选择并发较小的实例;
- ZoneAvoidanceRule:默认规则,复合判断server所在区域的性能和server的可用性选择服务器;
更改默认的负载均衡算法
官方文档明确给出了警告:
这个自定义配置类不能放在 @ComponentScan(启动类的同级或子级) 所扫描的当前包下以及子包下,否则我们自定义的这个配置类就会被所有的 Ribbon 客户端所共享,达不到特殊化定制的目的了。
自定义配置类
package com.atguigu.myrule;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MySelfRule {
@Bean
public IRule myRule() {
// 定义为随机
return new RandomRule();
}
}
启动类上加注解
package com.atguigu.springcloud;
import com.atguigu.myrule.MySelfRule;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE", configuration = MySelfRule.class)
public class OrderMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderMain80.class, args);
}
}
@RibbonClient(name = “CLOUD-PAYMENT-SERVICE”, configuration = MySelfRule.class)
主要就是这一行注释:
name:客户端的名称,也就是需要请求的地址;
configuration:功能区客户端的自定义;
负载均衡算法
原理
负载均衡算法:rest 接口第几次请求数 % 服务器集群总数量 = 实际调用服务器位置下标,每次服务重启动后 rest 接口计数从 1 开始。
List<ServiceInstance> instances = discobveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
如:
List[0] instances = 127.0.0.1:8002;
List[1] instances = 127.0.0.1:8001;
8001 + 8002 组合成为集群,他们共计 2 台机器,集群总数为 2,按照轮询算法原理:
当总请求数为 1 时:1 % 2 = 1 对应下标位置为 1,则获得服务地址为 127.0.0.1:8001;
当总请求数为 2 时:2 % 2 = 0 对应下标位置为 0,则获得服务地址为 127.0.0.1:8002;
当总请求数为 3 时:3 % 2 = 1 对应下标位置为 1,则获得服务地址为 127.0.0.1:8001;
当总请求数为 4 时:4 % 2 = 0 对应下标位置为 0,则获得服务地址为 127.0.0.1:8002;
如此类推…….
原创文章,作者:carmelaweatherly,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/245560.html