Ribbon负载均衡的使用

Ribbon负载均衡的使用

1、什么是Ribbon

Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。Spring Cloud Ribbon虽然只是一个工具类框架,它不像服务注册中心、配置中心、API网关那样需要独立部署,但是它几乎存在于每一个Spring Cloud构建的微服务和基础设施中。包括Feign提供的声明式服务嗲用也是基于该Ribbon实现的。

Ribbon默认提供7种负载均衡算法

  • 轮询策略(默认)
  • 权重轮询策略
  • 随机策略
  • 最少并发策略
  • 重试策略
  • 可用性敏感策略
  • 区域敏感策略

如果以上七种算法都不满足需求,还可以自定义负载均衡算法

2、Ribbon的作用是什么

Ribbon提供了一套适用于微服务的负载均衡解决方案。

3、负载均衡不同方案的区别

目前业界主流的负载均衡方案可以分为两类

  • 集中式负载均衡(服务器负载均衡)
  • 进程式负载均衡(客户端负载均衡)

3.1、集中式负载均衡

集中式负载均衡既是在Consumer和provider之间使用独立的负载均衡设置(硬件或者软件),由该设置负责把访问请求通过某种策略转发只provider。

在这里插入图片描述

3.2、进程内负载均衡

将负载均衡逻辑集成到Consumer,Consumer从服务注册中心货值有哪些地址可以使用,然后自己再从这些地址中选择出一个适合的Provider。Ribbon就属于这种,它只是一个雷虎,集成与Consumer进程,Consumer通过它来获取Provider的地址。

在这里插入图片描述

4、负载均衡策略

4.1、轮询策略(默认)

ClassName:RoundRobinRule

实现原理:按照顺序依次获取,每次都获取下一个,循环。

4.2、权重轮询策略

ClassName:WeightedResponseTimeRule

实现原理:根据每个Provider的相应时间分配一个权重,相应时间越长,权重越小,被选中的可能性就越低。一开始为轮询策略,并开启一个计时器,每30秒收集一次每个Provider的平均响应时间,当信息足够时,给每个Provider附上一个权重,并按权重随机选择Provider,权重越高的Provider会被高概率选中。

4.3、随机策略

ClassName:RandomRule

实现原理:从Provider中随机选取一个。

4.4、最少并发数策略

ClassName:BestAvailableRule

实现原理:选在请求中并发量最小的Provider,排除熔断的Provider。

4.5、重试策略

ClassName:RetryRule

实现原理:轮询策略的增强版,区别在于,轮询策略当服务器不可用时,不会做任何处理,而重试策略在服务不可用时会重新尝试集群中的其他节点。

4.6、可用性策略

ClassName:AvailabilityFilteringRule

实现原理:过滤掉性能差的Provider,过滤掉Eureka中处于一直连接失败的Provide。过滤掉高并发的Provider。

4.7、区域敏感策略

ClassName:ZoneAvoidanceRule

实现原理:以一个区域为单位,一旦这个这个区域中的服务出现不可用,则丢弃整个区域,从其他区域中选取可用的Provider。如果这个IP区域中有一个或多个实例不可达或响应变慢,都会降低该区域内其他IPs被选中的权重。

5、使用

5.1、入门使用

Provider添加依赖

Eureka中包含Ribbon依赖

<!-- netflix eureka server 依赖 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

Provider配置文件

多个Provider之间端口不可重复。但是应用名称要一致。

spring:
  application:
    name: service-provider       # 应用名称
server:
  port: 6060                  # 端口

# 配置 Eureka Server 注册中心
eureka:
  instance:
    prefer-ip-address: true   # 是否使用ip地址注册
    instance-id: ${
    
    spring.cloud.client.ip-address}:${
    
    server.port}   # ip:端口
  client:
    service-url:                  # 注册中心对外暴露的注册地址
      defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/

启动程序即可,默认就是轮询策略。

5.2、指定其他负载均衡策略

Ribbon是进程内负载均衡,所以需要在Consumer中进行指定要使用的负载均衡策略。

5.2.1、全局

在启动类中或配置类中注入负载均衡策略对象,则所有的服务在请求时均使用该策略。

// IOC容器注入RandomRule
// RandomRule轮询策略
@Bean
public RandomRule randomRule(){
    
    
    return new RandomRule();
}

5.2.2、局部

修改配置文件指定服务的负载均衡策略

# service-provider是服务的名称
service-provider:
  ribbon:
    # 指定负载均衡策略类名
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

6、点对点直连

在开发中,每次测试都从注册中心获取服务,比较麻,所以可以直接绕过注册中心,直连服务提供者获取服务。这种就叫做点对点直连。

添加修改依赖

注释掉Consumer原有的Rureka依赖,添加Ribbon依赖

<!-- netflix eureka server 依赖 -->
<!--    <dependency>-->
<!--      <groupId>org.springframework.cloud</groupId>-->
<!--      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>-->
<!--    </dependency>-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

修改Consumer配置文件

# service-provider是服务的名称
service-provider:
  ribbon:
    # 指定负载均衡策略类名
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
    # Provider服务列表,多个服务之间使用,分隔
    listOfServers: http://localhost:7070,http://localhost:6060
# 关闭Eureka实现Ribbon点对点直连
ribbon:
  eureka:
    enabled: false  # false关闭

猜你喜欢

转载自blog.csdn.net/Asdzxc968/article/details/106584411