你现在还不会使用Ribbon嘛?5分钟带你快速了解

Spring Cloud Ribbon

1 什么是负载均衡

当客户端访问后端服务时,我们可以将服务水平部署多台用以提高整个应用的吞吐量,但是单次请求具体应当访问哪一台服务这就是负载均衡所需要做的事情,它将前端的请求均匀的分布在后端的服务中,在真实场景下由于机器的性能和网络条件不同可以通过配置权重的方式使得请求的分布变得可控,这也是负载均衡所做的事

2 Ribbon简介

Spring Cloud Ribbon是一个基于HTTPTCP的客户端负载均衡工具,它基于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!";
}
复制代码

image-20220313180908732

image-20220313180928533

image-20220313181123769

3.2 运行后查看实例

image-20220313181207841

image-20220313181241575

存在两个实例说明注册成功

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:

image-20220313182428265

实例2:

image-20220313182448342

4 负载均衡策略

4.1 负载均衡策略介绍

Ribbon内置了多种负载均衡策略,内部负责负载均衡的顶级接口为:com.netflix.loadbalancer.IRule ,实现方式如下 :

image-20220313183557783

  • 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:

image-20220313184254421

实例2:

image-20220313184318669

猜你喜欢

转载自juejin.im/post/7079432648036188196
今日推荐