负载均衡之Ribbon简介

1.什么是负载均衡

  负载均衡其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。

2.Ribbon负载均衡

  Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具,它是基于 Netflix Ribbon 实现的。
  它不像 Spring Cloud 服务注册中心、配置中心、API 网关那样独立部署,它几乎 存在于每个 Spring Cloud 微服务中。包括 Feign 提供的声明式服务调用也是基于该 Ribbon 实现的。
  Ribbon 默认提供很多种负载均衡算法,例如轮询、随机等等。甚至包含自定义 的负载均衡算法。
  Ribbon 提供了一套微服务的负载均衡解决方案。

2.1 Ribbon 负载均衡策略

(1)轮询策略(默认)
  策略对应类名: RoundRobinRule
  实现原理:轮询策略表示每次都顺序取下一个 provider,比如一共有 5 个 provider,第 1 次取第 1 个,第 2 次取第 2 个,第 3 次取第 3 个,以此类推。
(2)权重轮询策略
  策略对应类名: WeightedResponseTimeRule
  实现原理: 根据每个 provider 的响应时间分配一个权重,响应时间越长,权重越小,被选 中的可能性越低。 原理:一开始为轮询策略,并开启一个计时器,每 30 秒收集一次每个 provider 的平均响应时间,当信息足够时,给每个 provider 附上一个权重,并按权重随机选择 provider,高权越重的 provider 会被高概率选中。
(3)随机策略
  策略对应类名: RandomRule
  实现原理:从 provider 列表中随机选择一个。
(4)最少并发数策略
  策略对应类名: BestAvailableRule
  实现原理:选择正在请求中的并发数最小的provider,除非这个provider在熔断中。
(5)重试策略
  策略对应类名: RetryRule
  实现原理:其实就是轮询策略的增强版,轮询策略服务不可用时不做处理,重 试策略服务不可用时会重新尝试集群中的其他节点。
(6)可用性敏感策略
  策略对应类名: AvailabilityFilteringRule
  实现原理:过滤性能差的 provider
    第一种:过滤掉在 Eureka 中处于一直连接失败的 provider。
    第二种:过滤掉高并发(繁忙)的 provider。
(7)区域敏感性策略
  策略对应类名:ZoneAvoidanceRule

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

  目前业界主流的负载均衡方案可以分成两类:
  (1)集中式负载均衡(服务器负载均衡),即在 consumer 和 provider 之间使用独立 的负载均衡设施,由该设施负责 把访问请求通过某种策略转发至 provider;

  (2)进程内负载均衡(客户端负载均衡),将负载均衡逻辑集成到 consumer, consumer 从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择 出一个合适的 provider。Ribbon 属于后者,它只是一个类库,集成于 consumer 进程,consumer 通过它来获取 provider 的地址。

4.Ribbon负载均衡策略设置

4.1 全局设置

在启动类或配置类中注入负载均衡策略对象。所有服务请求均使用该策略。
@Bean
public RandomRule randomRule() {
return new RandomRule();
}

4.2局部设置

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

# 负载均衡策略
# service-provider 为调用的服务的名称
service-provider:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

5.Ribbon 点对点直连

点对点直连是指绕过注册中心,直接连接服务提供者获取服务,一般在测试阶 段使用比较多。

5.1 添加依赖

在调用方 pom 文件中引入 ribbon 依赖,需要注意的是如果 pom 中有 Eureka 的依赖,则需要去除 Eureka 的依赖。

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

5.2 配置文件

配置文件中关闭 Eureka,添加直连的服务地址。如果不设置负载均衡策略默认 使用轮询策略。

# 负载均衡策略
# 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:关闭,true:开启

5.3 访问

关闭 Eureka 注册中心,服务提供者由于无法连接至注册中心所以会报连接异 常。但是服务是可以正常可消费的,所以目前使用的是点对点的方式来进行调用的。

6spring cloud使用ribbon实现负载负载均衡消费

搭建一个ribbon-consumer
pom.xml

    <packaging>jar</packaging>
 <name>ribbon-consumer</name>
 <dependencies>
        <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>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>

application.properties

spring.application.name=ribbon-consumer

server.port=31000

eureka.client.serviceUrl.defaultZone=http://localhost:20000/eureka/

RibbonConsumerApplication

@SpringBootApplication
@EnableDiscoveryClient
public class RibbonConsumerApplication {

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

    public static void main(String[] args) {
        new SpringApplicationBuilder(RibbonConsumerApplication.class)
                .web(WebApplicationType.SERVLET)
                .run(args);
    }

}

Controller

@RestController
public class Controller {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/sayHi")
    public String sayHi() {
        return restTemplate.getForObject(
                "http://eureka-client/sayHi",
                String.class);
    }

}

RibbonConfiguration
负载均衡的消费策略配置如下

@Configuration
public class RibbonConfiguration {

     @Bean
    public IRule defaultLBStrategy() {
        //可以在这里指定负载均衡的消费策略
        //return new RandomRule();使用随机的负载均衡消费策略
         //return new RetryRule 
        return new RoundRobinRule();//默认的消费策略
    }

}

以上就是ribbon的简单实现。

测试
使用上一篇文章的两个项目eureka-client和eureka-server两个项目 然后重新在搭建一个eureka-client-ribbon项目。eureka-client-ribbon是和eureka-client代码是一样的只是启动端口不同。
启动

分别启动四个项目。
项目启动的顺序依次是:eureka-serve->eureka-client->eureka-client-ribbon->ribbon-consumer

启动成功后再eureka控制台查看:

说明就启动成功
点击第一下是在30005的eureka-client项目上

点击第二下就跳到了30002的eureka-client-ribbon项目上了

这样就实现了ribbon负载均衡。

原文链接:https://blog.csdn.net/qq_40297844/article/details/109724138

原文链接:https://blog.csdn.net/JanuaryFM/article/details/120854666

posted @ 2024-03-07 16:34  慎终若始  阅读(13)  评论(0编辑  收藏  举报