Cloud微服务:Ribbon负载均衡

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~

个人主页:.29.的博客

学习社区:进去逛一逛~

Ribbon负载均衡


一、Ribbon - 负载均衡原理、流程

  • 服务消费者(order-service)根据服务名称发起请求,请求地址(url):http://userservice/user/1。
  • 请求被负载均衡拦截器:LoadBalancerInterceptor 拦截,给到了负载均衡客户端:RibbonLoadBalancerClient。
  • 负载均衡客户端:RibbonLoadBalancerClient 获取url中的服务名称:userservice 并给到动态服务列表负载均衡器:DynamicServiceListLoadBalancer。
  • 动态服务列表负载均衡器:DynamicServiceListLoadBalancer从EurekaServer中拉取服务提供者(user-service)的信息列表:localhost:8081、localhost:8082。
  • 动态服务列表负载均衡器:DynamicServiceListLoadBalancer 将得到的信息列表给到负载均衡规则器:IRule 进行负载均衡算法,选择一个服务信息,重新给到负载均衡客户端:RibbonLoadBalancerClient。
  • 负载均衡客户端:RibbonLoadBalancerClient修改请求地址(url):http://userservice/user/1,变为:http://localhost:8081/user/1,进而在浏览器成功访问。

二、Ribbon - 负载均衡策略

Ribbon的负载均衡策略是一个叫做IRule的接口来定义的,每一个子接口都是一种规则。

1.常见的负载均衡规则

2.调整负载均衡规则

①代码方式

在微服务的服务消费者(order-service)中的启动类OrderApplication类内部,定义一个新的IRule

java 复制代码
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
@EnableFeignClients(clients = UserClient.class,defaultConfiguration = DefaultFeignConfiguration.class)
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }

    /**
     * 创建RestTemplate并注入Spring容器
     */
    @Bean
    @LoadBalanced//实现负载均衡
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    //重新定义IRule,达到调整负载均衡规则的效果
    @Bean
    public IRule randomRule() {
        //默认是轮询规则,这里负载均衡策略调整成------随即规则
        return new RandomRule();//随机规则
    }
}
  • 此方式作用范围是全局的,配置后在此微服务中,无论调用哪一个其他的微服务,使用的都是此处配置的负载均衡规则。
②配置文件方式

这里在微服务的服务消费者(order-service)的配置文件application.yml中,添加新的配置也可以修改负载均衡规则,下述配置信息指定调用服务名称为:userservice的服务时,使用的负载均衡规则。

yaml 复制代码
userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule  # 负载均衡规则------随机规则
  • 此方式的作用范围仅针对当前微服务,因为配置文件中先指定了服务名称,再指定的负载均衡规则。

三、Ribbon - 饥饿加载

  • Ribbon加载策略:
    • 懒加载:默认采用的加载方式,在第一次访问时才会去创建LoadBalanceClient,请求时间会很长。
    • 饥饿加载:在项目启动时就将LoadBalanceClient加载好,降低第一次访问的耗时。

可通过在application.yml配置文件中添加配置相关信息,开启饥饿加载:

yaml 复制代码
ribbon:
  eager-load:
    enabled: true # 开启饥饿加载
    clients:
      - userservice  # 指定饥饿加载的服务名称,可加载多个

四、小结


相关推荐
字节渡客8 小时前
Redis键明明过期了,业务还在读到旧数据
数据库·redis·spring
我可能是个假开发9 小时前
FTP Unicode 文件名导致 `550` 的问题分析与解决方案
java·开发语言·spring
【JAVA】玩家10 小时前
Spring核心原理全解析:从零到生产实战
java·后端·spring
Wang's Blog11 小时前
Java框架 SpringCloud 快速入门: 实现 Feign 最佳实践(抽取方式)
java·spring cloud
hudd66816 小时前
JavaEE 初阶 - 多线程(初阶)
java·开发语言·java-ee
Wang's Blog16 小时前
Java框架 SpringCloud 快速入门: Feign 的性能优化
java·spring cloud·性能优化
打工仔折腾 AI17 小时前
System Prompt 替代 Few-shot:用规则约束大模型输出的省钱实践
java·人工智能·python·spring·langchain·prompt·ai agent 实战
一条大祥脚17 小时前
【CS336】lecture4 MoE|负载均衡|MoE并行|训练稳定性|Deepseek回顾
运维·负载均衡
vx-程序开发18 小时前
【计算机毕设】51300童装超市管理系统的设计与实现
java·vue.js·spring boot·源码·课程设计·毕设·大作业
IanSkunk18 小时前
从检查设备到训练方案:眼科与视光中心设备联动的数据通路、字段口径与校验规则
服务器·数据库·负载均衡