Spring Cloud Ribbon 是什么?

本文内容如有错误、不足之处,欢迎技术爱好者们一同探讨,在本文下面讨论区留言,感谢。

文章目录

        • 简述
        • 作用
          • 客户端负载均衡
          • 负载均衡算法
        • 原理和使用
          • 核心类
          • 原理图
          • 使用
        • 小结
        • 参考资料

简述

Spring Cloud Ribbon 是基于 Netflix Ribbon 实现,Spring Cloud 对其进行了一层封装。
Ribbon 基于 HTTPTCP 的客户端负载均衡工具,可以让我们轻松地将面对服务的 REST 模块请求自动转换成客户端负载均衡的服务调用。

提供以下功能:

  • 负载均衡
  • 容错能力
  • 异步和响应模型中的多种协议(HTTP,TCP,UDP)支持
  • 缓存和批处理

不过通过官网提供的消息 Spring Cloud Netflix Ribbon is now deprecated. 已经被弃用了,建议使用 Spring Cloud LoadBalancer 进行负载均衡,可以看下这篇说明。

作用

Ribbon 主要作用是负载均衡,负载均衡又分为客户端负载均衡和服务端负载均衡,它们之间的区别在于:服务清单所在的位置。

  • 客户端负载均衡:自己维护自己要访问的服务实例清单(来源于服务注册中心)
  • 服务端负载均衡:由中间服务单独维护,然后通过心跳检测来剔除故障节点以保证服务清单中的节点都正常可用,通过负载均衡算法(线性轮询、按权重负载、按流量负载等)分配。

负载均衡的概念:

  1. 处理系统的高可用、缓解网络压力、处理内容扩容。
  2. 分为客户端负载均衡和服务端负载均衡。
  3. 按设备来分为硬件负载均衡和软件负载均衡。
  4. 硬件负载均衡主要通过在服务器节点之间安装专门用于负载均衡的设备,例如 F5 等。
  5. 软件负载均衡通过在服务器上安装一些具有负载均衡功能或模块的软件来完成请求的转发工作,例如 Nginx 等。
客户端负载均衡

客户端负载均衡是在 Spring Cloud Ribbon 中定义的。在分布式架构中,同一个Service 集群,当一个请求奔过来时,那么这多个 ServiceRibbon 通过策略决定本次请求使用哪个 Service 的方式就是客户端负载均衡。在 Spring Cloud 分布式框架中客户端负载均衡对开发者是透明的,只要使用 @LoadBalanced 就可以完成一个客户端负载均衡的创建。

负载均衡算法
  • 随机:通过随机选择服务进行执行;
  • 轮训:负载均衡默认实现方式,请求来之后排队处理,均衡的对待每一台服务器;
  • 加权轮训:通过对服务器性能的分型,给高配置,低负载的服务器分配更高的权重,均衡各个服务器的压力,Nginx 的负载均衡默认算法是加权轮询算法;
  • 随机轮训:将随机法和轮询法结合起来,在轮询节点时,随机选择一个节点作为开始位置 index,此后每次选择下一个节点来处理请求,即 (index+1)%size
  • 地址Hash:通过客户端请求的地址的 hash 值取模映射进行服务器调度;
  • 最小链接数:即使请求均衡了,压力不一定会均衡,最小连接数法就是根据后端服务器当前的连接情况,动态的选取其中当前积压连接数最少的一台服务器来处理当前请求,尽可能的提高后台服务器利用率,将负载合理的分流到每一台服务器;

原理和使用

核心类
  • @LoadBalanced 开启负载均衡,这个注解是用来标记 RestTemplate 用LoadBalancerClient 配置
  • LoadBalancerClient 使用从负载均衡器中挑选出的服务实例来执行请求内容
  • LoadBalancerAutoConfiguration 实现客户端负载均衡的自动配置类
  • LoadBalancerInterceptor 拦截 @LoadBalanced 注解的 RestTemplate 发送请求时,执行 LoadBalancerInterceptor 的 intercept 方法
  • RibbonLoadBalancerClient 具体的负载均衡器
  • ILoadBalancer 负载均衡器的一个抽象接口,主要定义了一系列的抽象操作
  • LoadLoadBalancerRequest
原理图

Spring Cloud Ribbon 是什么?_第1张图片
上图 A服务消费者1 需要消费 B功能, 向 Eureka Server (选择负载较少的那个)查询 B服务的服务列表,然后根据用户指定的策略,从 Eureka Server 取到的服务注册列表中选择一个地址。

使用

pom.xml 中配置 Ribbon 依赖

<dependency>
	<groupId>org.springframework.cloudgroupId>
	<artifactId>spring-cloud-starter-netflix-ribbonartifactId>
dependency>

应用启动类上使用 @EnableDiscoveryClient 开启 Ribbon 客户端

@SpringBootApplication
@EnableDiscoveryClient
public class RibbonDemoApplication {
}

Controller 类上 使用 @RibbonClient 注解,name 服务名称 configuration 配置类

@RestController
@RibbonClient(name = "say-hello", configuration = SayHelloConfiguration.class)
public class ConsumerController {

    @LoadBalanced
    @Bean
    RestTemplate restTemplate(){
        return new RestTemplate();
    }

    @Autowired
    RestTemplate restTemplate;

    @RequestMapping("/hi")
    private String helloConsumer(@RequestParam(value="name", defaultValue="Artaban") String name){
        String greeting = this.restTemplate.getForObject("http://say-hello/greeting", String.class);
        return String.format("%s, %s!", greeting, name);
    }
}

SayHelloConfiguration 配置类

public class SayHelloConfiguration {

    @Autowired
    IClientConfig ribbonClientConfig;

    @Bean
    public IPing ribbonPing(IClientConfig config) {
        return new PingConstant();
    }

    @Bean
    public IRule ribbonRule(IClientConfig config) {
        return new AvailabilityFilteringRule();
    }
}

application.yml 配置文件内容

spring:
  application:
    name: ribbon-demo

server:
  port: 8090

# stores 是自定义的
stores:
  ribbon:
    eureka:
      enabled: false
    listOfServers: localhost:8090,localhost:9092,localhost:9999
    ServerListRefreshInterval: 15000

小结

本文主要内容简单介绍了 Spring Cloud Ribbon ,以及其中的核心组件。

代码地址:github

参考资料

《Spring Cloud 微服务实战》 翟永超 著

Spring Cloud Ribbon

  • https://segmentfault.com/a/1190000015981984

Spring cloud 之Ribbon(一)基本使用

  • https://www.cnblogs.com/htyj/p/10705472.html

Spring Cloud Ribbon简介

  • https://blog.csdn.net/chengqiuming/article/details/81120921

Client Side Load Balancing with Ribbon and Spring Cloud(功能区和Spring Cloud的客户端负载平衡

  • https://spring.io/guides/gs/client-side-load-balancing/

Netflix/ribbon

  • https://github.com/Netflix/ribbon

等风来,不如追风去。

你可能感兴趣的:(Spring,Cloud)