前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >spring cloud 之 Ribbon

spring cloud 之 Ribbon

作者头像
BUG弄潮儿
发布2022-12-05 20:42:04
3370
发布2022-12-05 20:42:04
举报
文章被收录于专栏:JAVA乐园

1.Ribbon是什么

Spring Cloud Ribbon 是一套基于 Netflix Ribbon 实现的客户端负载均衡和服务调用工具。Netflix Ribbon 是 Netflix 公司发布的开源组件,其主要功能是提供客户端的负载均衡算法和服务调用。Spring Cloud 将其与 Netflix 中的其他开源服务组件(例如 Eureka、Feign 以及 Hystrix 等)一起整合进 Spring Cloud Netflix 模块中,整合后全称为 Spring Cloud Netflix Ribbon。Ribbon 是 Spring Cloud Netflix 模块的子模块,它是 Spring Cloud 对 Netflix Ribbon 的二次封装。通过它,我们可以将面向服务的 REST 模板(RestTemplate)请求转换为客户端负载均衡的服务调用。Ribbon 是 Spring Cloud 体系中最核心、最重要的组件之一。它虽然只是一个工具类型的框架,并不像 Eureka Server(服务注册中心)那样需要独立部署,但它几乎存在于每一个使用 Spring Cloud 构建的微服务中。Spring Cloud 微服务之间的调用,API 网关的请求转发等内容,实际上都是通过 Spring Cloud Ribbon 来实现的·

2. 什么是负载均衡

在任何一个系统中,负载均衡都是一个十分重要且不得不去实施的内容,它是系统处理高并发、缓解网络压力和服务端扩容的重要手段之一。负载均衡(Load Balance) ,简单点说就是将用户的请求平摊分配到多个服务器上运行,以达到扩展服务器带宽、增强数据处理能力、增加吞吐量、提高网络的可用性和灵活性的目的。通俗来讲,将请求按照一定的策略均匀地发送到集群中的每一个节点上,保证不会出现某个节点承载大量请求,其他节点空闲的情况

3. 负载均衡的种类

3.1 服务端负载均衡

服务端负载均衡是最常见的负载均衡方式,如图:

服务端负载均衡是在客户端和服务端之间建立一个独立的负载均衡服务器,该服务器既可以是硬件设备(例如 F5),也可以是软件(例如 Nginx)。这个负载均衡服务器维护了一份可用服务端清单,然后通过心跳机制来删除故障的服务端节点,以保证清单中的所有服务节点都是可以正常访问的。当客户端发送请求时,该请求不会直接发送到服务端进行处理,而是全部交给负载均衡服务器,由负载均衡服务器按照某种算法(例如轮询、随机等),从其维护的可用服务清单中选择一个服务端,然后进行转发。服务端负载均衡具有以下特点:

  1. 需要建立一个独立的负载均衡服务器。
  2. 负载均衡是在客户端发送请求后进行的,因此客户端并不知道到底是哪个服务端提供的服务。
  3. 可用服务端清单存储在负载均衡服务器上。

3.2 客户端负载均衡

相较于服务端负载均衡,客户端服务在均衡则是一个比较小众的概念。如图:

客户端负载均衡是将负载均衡逻辑以代码的形式封装到客户端上,即负载均衡器位于客户端。客户端通过服务注册中心(例如 Eureka Server)获取到一份服务端提供的可用服务清单。有了服务清单后,负载均衡器会在客户端发送请求前通过负载均衡算法选择一个服务端实例再进行访问,以达到负载均衡的目的;客户端负载均衡也需要心跳机制去维护服务端清单的有效性,这个过程需要配合服务注册中心一起完成。客户端负载均衡具有以下特点:

  1. 负载均衡器位于客户端,不需要单独搭建一个负载均衡服务器。
  2. 负载均衡是在客户端发送请求前进行的,因此客户端清楚地知道是哪个服务端提供的服务。
  3. 客户端都维护了一份可用服务清单,而这份清单都是从服务注册中心获取的。

Ribbon 就是一个基于 HTTP 和 TCP 的客户端负载均衡器,当我们将 Ribbon 和 Eureka 一起使用时,Ribbon 会从 Eureka Server(服务注册中心)中获取服务端列表,然后通过负载均衡策略将请求分摊给多个服务提供者,从而达到负载均衡的目的。

4. 服务端负载均衡与客户端负载均衡对比

不同点

服务端负载均衡

客户端负载均衡

是否需要建立负载均衡服务器

需要在客户端和服务端之间建立一个独立的负载均衡服务器。

将负载均衡的逻辑以代码的形式封装到客户端上,因此不需要单独建立负载均衡服务器。

是否需要服务注册中心

不需要服务注册中心。

需要服务注册中心。在客户端负载均衡中,所有的客户端和服务端都需要将其提供的服务注册到服务注册中心上。

可用服务清单存储的位置

可用服务清单存储在位于客户端与服务器之间的负载均衡服务器上。

所有的客户端都维护了一份可用服务清单,这些清单都是从服务注册中心获取的。

负载均衡的时机

先将请求发送到负载均衡服务器,然后由负载均衡服务器通过负载均衡算法,在多个服务端之间选择一个进行访问;即在服务器端再进行负载均衡算法分配。简单点说就是,先发送请求,再进行负载均衡。

在发送请求前,由位于客户端的服务负载均衡器(例如 Ribbon)通过负载均衡算法选择一个服务器,然后进行访问。简单点说就是,先进行负载均衡,再发送请求。

客户端是否了解服务提供方信息

由于负载均衡是在客户端发送请求后进行的,因此客户端并不知道到底是哪个服务端提供的服务。

负载均衡是在客户端发送请求前进行的,因此客户端清楚的知道是哪个服务端提供的服务。

5. Ribbon的使用

Ribbon 可以与 RestTemplate(Rest 模板)配合使用,以实现微服务之间的调用。RestTemplate 是 Spring 家族中的一个用于消费第三方 REST 服务的请求框架。RestTemplate 实现了对 HTTP 请求的封装,提供了一套模板化的服务调用方法。通过它,Spring 应用可以很方便地对各种类型的 HTTP 请求进行访问。RestTemplate 针对各种类型的 HTTP 请求都提供了相应的方法进行处理,例如 HEAD、GET、POST、PUT、DELETE 等类型的 HTTP 请求,分别对应 RestTemplate 中的 headForHeaders()、getForObject()、postForObject()、put() 以及 delete() 方法。

  • 引入依赖
代码语言:javascript
复制
<!--Spring Cloud Ribbon 依赖-->
<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
  • 添加RestTemplate Bean声明
代码语言:javascript
复制
@Configuration
public class ConfigBean {

    @Bean
    @LoadBalanced  //开启负载均衡
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}
  • 调用
代码语言:javascript
复制
@RestController
@RequestMapping("api/v1/service2")
public class Controller {

   @Autowired
   private RestTemplate restTemplate;

   @GetMapping
   public TestEntity get() {
       // return restTemplate.getForObject("http://{spring.application.name}{接口路由}", 实体类class);
          return restTemplate.getForObject("http://service1/api/vi/service1", TestEntity.class);
  }
}

6. Ribbon负载均衡策略

Ribbon 是一个客户端的负载均衡器,它可以与 Eureka 配合使用轻松地实现客户端的负载均衡。Ribbon 会先从 Eureka Server(服务注册中心)去获取服务端列表,然后通过负载均衡策略将请求分摊给多个服务端,从而达到负载均衡的目的。Spring Cloud Ribbon 提供了一个 IRule 接口,该接口主要用来定义负载均衡策略,它有 7 个默认实现类,每一个实现类都是一种负载均衡策略。

负载均衡策略

说明

RoundRobinRule

按照线性轮询策略,即按照一定的顺序依次选取服务实例

RandomRule

随机选取一个服务实例

RetryRule

按照 RoundRobinRule(轮询)的策略来获取服务,如果获取的服务实例为 null 或已经失效,则在指定的时间之内不断地进行重试(重试时获取服务的策略还是 RoundRobinRule 中定义的策略),如果超过指定时间依然没获取到服务实例则返回 null 。

WeightedResponseTimeRule

WeightedResponseTimeRule 是 RoundRobinRule 的一个子类,它对 RoundRobinRule 的功能进行了扩展。 根据平均响应时间,来计算所有服务实例的权重,响应时间越短的服务实例权重越高,被选中的概率越大。刚启动时,如果统计信息不足,则使用线性轮询策略,等信息足够时,再切换到 WeightedResponseTimeRule。

BestAvailableRule

继承自 ClientConfigEnabledRoundRobinRule。先过滤点故障或失效的服务实例,然后再选择并发量最小的服务实例。

AvailabilityFilteringRule

先过滤掉故障或失效的服务实例,然后再选择并发量较小的服务实例。

ZoneAvoidanceRule

默认的负载均衡策略,综合判断服务所在区域(zone)的性能和服务(server)的可用性,来选择服务实例。在没有区域的环境下,该策略与轮询(RandomRule)策略类似。

7. 更换负载均衡策略

Spring Cloud Ribbon 默认使用轮询策略选取服务实例,我们也可以根据自身的需求切换负载均衡策略。切换负载均衡策略的方法很简单,我们只需要在服务消费者(客户端)的配置类中,将 IRule 的其他实现类注入到容器中即可。

代码语言:javascript
复制
@Configuration
public class ConfigBean {

   @Bean
   @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
   }

    @Bean
    public IRule myRule() {
        return  new RoundRobinRule();
   }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-08-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 BUG弄潮儿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.Ribbon是什么
  • 2. 什么是负载均衡
  • 3. 负载均衡的种类
    • 3.1 服务端负载均衡
      • 3.2 客户端负载均衡
      • 4. 服务端负载均衡与客户端负载均衡对比
      • 5. Ribbon的使用
      • 6. Ribbon负载均衡策略
      • 7. 更换负载均衡策略
      相关产品与服务
      负载均衡
      负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档