Spring Cloud Ribbon
1 什么是负载均衡
当客户端访问后端服务时,我们可以将服务水平部署多台用以提高整个应用的吞吐量,但是单次请求具体应当访问哪一台服务这就是负载均衡所需要做的事情,它将前端的请求均匀的分布在后端的服务中,在真实场景下由于机器的性能和网络条件不同可以通过配置权重的方式使得请求的分布变得可控,这也是负载均衡所做的事
2 Ribbon简介
Spring Cloud Ribbon
是一个基于HTTP
和TCP
的客户端负载均衡工具,它基于Netflix Ribbon
实现。通过Spring Cloud
的封装,可以让我们轻松地将面向服务的REST模版
请求自动转换成客户端负载均衡的服务调用。Spring Cloud Ribbon
虽然只是一个工具类框架,它不像服务注册中心、配置中心、API网关那样需要独立部署,但是它几乎存在于每一个Spring Cloud
构建的微服务和基础设施中。因为微服务间的调用,API网关
的请求转发等内容,实际上都是通过Ribbon
来实现的,包括后续我们将要介绍的Feign
,它也是基于Ribbon
实现的工具。所以,对Spring Cloud Ribbon
的理解和使用,对于我们使用Spring Cloud
来构建微服务非常重要。
3 入门案例
我们需要注册至少2个以上的服务到注册中心中使得在进行服务调用时提供可负载均衡的实例
3.1 新增启动入口
为了可以看到调用情况我们修改/hello
接口如下添加一行控制台打印
@GetMapping("/hello")
public String hello(){
System.out.println("获得请求....");
return "hello!";
}
3.2 运行后查看实例
存在两个实例说明注册成功
3.3 消费者开启负载均衡
3.3.1 修改启动类
@SpringBootApplication
public class ServiceConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceConsumerApplication.class, args);
}
@Bean
@LoadBalanced//开启负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
代码说明:
1:在RestTemplate注册的bean上面添加 @LoadBalanced注解用以开启负载均衡
3.3.2 新增负载均衡方式的接口
在ConsumerController
中新增如下接口
@GetMapping("/hello-loadbanlance")
public String hello2(){
// 1.通过注册中心的服务名构建url
String url = "http://service-provider/hello";
// 2.发送请求
return restTemplate.getForObject(url,String.class);
}
代码说明:
1:url中的service-provider是注册在注册中心的服务提供者的名称,通过这种方式构建的url在restTemplate调用时restTemplate开启的负载均衡才可以生效。
3.3.3 启动消费者实例并发起调用
连续请求3次
http://localhost:8002/consumer/hello-loadbanlance
观察两个服务提供者实例的日志情况,可以看到请求被负载均衡到了两个实例中
实例1:
实例2:
4 负载均衡策略
4.1 负载均衡策略介绍
Ribbon
内置了多种负载均衡策略,内部负责负载均衡的顶级接口为:com.netflix.loadbalancer.IRule
,实现方式如下 :
- com.netflix.loadbalancer.RandomRule :随机策略
- com.netflix.loadbalancer.RetryRule :重试策略
- com.netflix.loadbalancer.RoundRobinRule :以轮询的方式进行负载均衡
- com.netflix.loadbalancer.WeightedResponseTimeRule :权重策略,会计算每个服务的权
重,越高的被调用的可能性越大 - com.netflix.loadbalancer.BestAvailableRule :最佳策略,遍历所有的服务实例,过滤掉
故障实例,并返回请求数最小的实例返回 - com.netflix.loadbalancer.AvailabilityFilteringRule :可用过滤策略,过滤掉故障和请
求数超过阈值的服务实例,再从剩下的实例中轮询调用(默认)
在服务消费者的application.yml配置文件中修改负载均衡策略,格式:
{服务提供者名称}.ribbon.NFLoadBalancerRuleClassName
4.2 负载均衡策略配置
在消费者服务端配置文件中添加如下配置
service-provider: # 服务提供者在注册中心的服务名
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡策略,此处为随机
重启服务,并连续多次调用,可以看到此时两个提供者被调用的次数并不平衡,说明策略配置生效:
实例1:
实例2:
.netflix.loadbalancer.RandomRule #负载均衡策略,此处为随机
重启服务,并连续多次调用,可以看到此时两个提供者被调用的次数并不平衡,说明策略配置生效:
实例1:
[外链图片转存中...(img-OvS3JDbA-1648308260872)]
 
实例2:
![image-20220313184318669](https://img-blog.csdnimg.cn/img_convert/c07b5ac3a41e4856eed4e9e865bb623d.png)