Ribbon负载均衡

文章目录

1. Ribbon
  • Spring Cloud Ribbon 是一套基于 Netflix Ribbon 实现的客户端负载均衡和服务调用工具。
  • Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡器,当我们将 Ribbon 和 Eureka 一起使用时,Ribbon 会从 Eureka Server(服务注册中心)中获取服务端列表,然后通过负载均衡策略将请求分摊给多个服务提供者,从而达到负载均衡的目的。
2.负载均衡原理
  • 将用户的请求平摊分配到多个服务器上运行,以达到扩展服务器带宽、增强数据处理能力、增加吞吐量、提高网络的可用性和灵活性的目的。
  • 常见的负载均衡方式有两种:服务端负载均衡、客户端负载均衡
1.服务端负载均衡
  • 当客户端发送请求时,该请求发送到负载均衡服务器,由负载均衡服务器按照某种算法(例如轮询、随机等),从其维护的可用服务清单中选择一个服务端,然后进行转发。
  • 服务端负载均衡的特点:
    • 需要建立一个独立的负载均衡服务器。
    • 负载均衡是在客户端发送请求后进行的,客户端并不知道是哪个服务端提供的服务。
    • 可用服务端清单存储在负载均衡服务器上。
2.客户端负载均衡
  • 客户端负载均衡是将负载均衡逻辑以代码的形式封装到客户端上。客户端通过服务注册中心获取到一份服务端提供的可用服务清单。负载均衡器会在客户端发送请求前通过负载均衡算法选择一个服务端实例再进行访问,以达到负载均衡的目的;
  • 客户端负载均衡的特点:
    • 负载均衡器位于客户端,不需要单独搭建一个负载均衡服务器。
    • 负载均衡是在客户端发送请求前进行的,因此客户端清楚地知道是哪个服务端提供的服务。
    • 客户端都维护了一份可用服务清单,而这份清单都是从服务注册中心获取的。
3.负载均衡流程
4.负载均衡策略
内置负载均衡规则类 规则描述
RoundRobinRule 简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则
AvailabilityFilteringRule 对以下两种服务器进行忽略: (1)在"短路"状态服务器(2)并发数过高的服务器。
WeightedResponseTimeRule 为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择
ZoneAvoidanceRule 以区域可用的服务器为基础进行服务器的选择。而后再对Zone内的多个服务做轮询,默认的实现就是ZoneAvoidanceRule,是一种轮询方案
BestAvailableRule 忽略那些短路的服务器,并选择并发数较低的服务器
RandomRule 随机选择一个可用的服务器
RetryRule 重试机制的选择逻辑
5.自定义负载均衡策略

通过定义IRule实现可以修改负载均衡规则,有两种方式:代码方式、配置文件方式

1.代码方式
  • 在order-service中的OrderApplication类中,定义一个新的IRule
java 复制代码
    /**
     * 创建 RestTemplate 并注入 Spring 容器
     * @return
     */
    @Bean
    @LoadBalanced
    public IRule restTemplate(){
        return new RandomRule();
    }
2.配置文件方式
  • 在order-service的application.yml文件中,添加新的配置也可以修改规则
yml 复制代码
user-service: # 给某个微服务配置负载均衡规则
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则

一般用默认的负载均衡规则,不做修改

6.饥饿加载
  • Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。而饥饿加载则会在项目启动时创建,降低第一次访问的耗时

  • 在order-service的application.yml文件中,添加新的配置也可以修改规则,开启饥饿加载

yml 复制代码
ribbon:
  eager-load:
    enabled: true
    clients: user-service
相关推荐
weixin_456321643 小时前
生产环境下微服务网关选型与实战指南(基于SpringCloud生态)
java·spring cloud
黎明丶之前5 小时前
Spring Cloud Gateway 升级与 Bucket4j 限流实践
java·spring cloud
2501_921649496 小时前
从WebSocket到SQL查询:金融数据落库存储及查询接口全流程开发
java·sql·websocket·程序人生·spring cloud·金融·系统架构
薛定谔的码*7 小时前
双机热备份MSTP+VRRP+负载均衡
运维·网络·负载均衡
LSL666_7 小时前
nginx——方向代理和负载均衡
运维·nginx·负载均衡·反向代理
梵得儿SHI7 小时前
SpringCloud 秒杀系统生产级落地:Sentinel+Redis 联合优化,从限流防刷到库存闭环,彻底解决超卖 / 宕机 / 恶意刷
redis·spring cloud·sentinel·分布式限流·百万级·瞬时高并发·产级秒杀系统解决方案
语戚7 小时前
Nginx vs Ribbon:负载均衡的两种核心范式(反向代理 vs 客户端负载)
java·nginx·spring·spring cloud·面试·ribbon·负载均衡
我不是程序猿儿7 小时前
【嵌入式】第2讲:USB CDC 从“插上电脑”到“出现 COM 口”,枚举过程到底发生了什么
服务器·stm32·单片机·嵌入式硬件·电脑·负载均衡
jwt7939279379 小时前
RabbitMQ HAProxy 负载均衡
rabbitmq·负载均衡·ruby
biuba10241 天前
28 openclaw负载均衡实现:应对高并发场景的解决方案
运维·ai·负载均衡·编程·技术