(二)SpringCloud之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、负载均衡不同方案的区别

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

  • 集中式负载均衡(服务器负载均衡)
  • 进程式负载均衡(客户端负载均衡,Ribbon就属于该方案)

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、入门使用

Provider02添加依赖

Eureka中包含Ribbon依赖

<!-- 项目依赖 -->
    <dependencies>
        <!-- netflix eureka client 依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!-- spring boot web 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- lombok 依赖 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>
        <!-- spring boot actuator 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!-- spring boot test 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

Provider配置文件

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

server:
  port: 7070 # 端口

spring:
  application:
    name: service-provider # 应用名称(集群下相同)

# 配置 Eureka Server 注册中心
eureka:
  instance:
    prefer-ip-address: true       # 是否使用 ip 地址注册
    instance-id: ${
    
    spring.cloud.client.ip-address}:${
    
    server.port} # ip:port
  client:
    service-url:                  # 设置服务注册中心地址
      defaultZone: http://root:123456@localhost:8761/eureka/,http://root:123456@localhost:8762/eureka/
# 度量指标监控与健康检查
management:
  endpoints:
    web:
      exposure:
        include: shutdown         # 开启 shutdown 端点访问
  endpoint:
    shutdown:
      enabled: true               # 开启 shutdown 实现优雅停服

配置完成,默认就是轮询策略。

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原有的Eureka依赖,添加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:7071
# 关闭Eureka实现Ribbon点对点直连
ribbon:
  eureka:
    enabled: false  # false关闭

猜你喜欢

转载自blog.csdn.net/Asdzxc968/article/details/107104148
今日推荐