当前位置: 首页 > news >正文

微服务-Ribbon负载均衡

文章目录

    • 负载均衡原理
      • 流程
      • 原理
        • 源码分析
        • 负载均衡流程
      • 负载均衡策略
      • 饥饿加载
      • 总结

负载均衡原理

流程

在这里插入图片描述

原理

@LoadBalanced
标记RestTemplate发起的http请求要被Ribbon进行拦截和处理

源码分析
  1. ctrl+shift+N搜索LoadBalancerInterceptor,进入。发现实现了ClientHttpRequestInterceptor(客户端Http请求拦截器)的intercept方法
    在这里插入图片描述
    拦截方法
    在这里插入图片描述
  2. 打一个断点,启动order-application,浏览器发送请求http://localhost:8080/order/104
  3. 在该方法中对http请求进行拦截,获取到了服务名serviceName = “userservice”,然后进入到了RibbonLoadBalancerClient的excute方法中。
    在这里插入图片描述
  4. 进入到excute方法,发现调用了该类的一个重载方法excute
    在这里插入图片描述
  5. step into到这个excute方法
    在这里插入图片描述发现serviceId = “userservice”,通过serviceId获取到ILoadBalancer,点开ILoadBalancer,发现里面存储了两个userservice,即成功拉取了2个userservice。获取的loadBalancer对象的名称为DynamicServerListLoadBalancer,动态服务列表负载均衡器。
    在这里插入图片描述
  6. 进入到getServer方法,下一步从loadBalancer的2个userservice中选择1个
    在这里插入图片描述再进入到chooseServer方法里,最终调用了父类的chooseServer方法
    在这里插入图片描述
    进入,最终调用了rule.choose方法
    在这里插入图片描述查看这个rule,发现是一个IRule类型,这是一个接口,ctrl+h查看实现该接口的类有哪些
    在这里插入图片描述发现有好几种规则,RoundRobin,Random等,正是通过这几种规则从多个userservice中选择出一个合适的userservice。
负载均衡流程

在这里插入图片描述

负载均衡策略

在这里插入图片描述在这里插入图片描述
通过定义IRule的实现可以修改负载均衡的策略

  1. 方式一,直接在配置类中定义。针对所有微服务而言。
@Bean
public IRule randomRule(){    return new RandomRule();
}
  1. 方式二,在application.yml中定义。针对某个微服务。
userservice:  ribbon:    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则 

饥饿加载

Ribbon默认采用的是懒加载,即第一次访问Ribbon服务的时候才会加载LoadBalanceClient,请求时间会很长;
而饥饿加载在项目启动时加载

ribbon:  eager-load:    enabled: true # 开启饥饿加载     clients: userservice # 指定对userservice这个服务饥饿加载
  1. 懒加载,第一次访问是409ms,后续10ms
    在这里插入图片描述
  2. 饥饿加载,第一次访问是236ms,后续10ms
    在这里插入图片描述
    在这里插入图片描述

总结

在这里插入图片描述

http://www.lryc.cn/news/212080.html

相关文章:

  • UC3845BD1R2G一款专门针对离线和 DC-DC 转换器应用 高性能电流模式PWM控制器
  • vivo自研AI大模型即将问世,智能手机行业加速迈向AI时代
  • 探索JavaScript事件流:DOM中的神奇旅程
  • 听GPT 讲Rust源代码--library/std(8)
  • Hbase基本使用,读写原理,性能优化学习
  • 添加主仓库后报错error: remote upstream already exists.
  • 香港服务器如何做负载均衡?
  • 前端 :用HTML , CSS ,JS 做一个秒表
  • BIOS MBR UEFI GPT详解
  • 2023NOIP A层联测20-点餐
  • 3D LUT 滤镜 shader 源码分析
  • 五分钟理解Java跨平台原理(适合小白)
  • 从初级测试工程师到测试专家,你的晋升路线是什么?
  • 合肥中科深谷嵌入式项目实战——人工智能与机械臂(四)
  • Zynq-Linux移植学习笔记之64- 国产ZYNQ在linux下配置国产5396芯片
  • 系统架构设计师-第19章-大数据架构设计理论与实践-软考学习笔记
  • 论坛搭建.
  • 三种前端埋点方式
  • html获取网络数据,列表展示 第二种
  • 【Python 算法】信号处理通过陷波滤波器准确去除工频干扰
  • Redis(08)| 线程模型
  • Java14-16新特性
  • 中兴再推爆款,双2.5G网口的巡天AX3000Pro+仅需299元
  • 【系统架构】架构风格专题
  • 【Qt】盒子布局、网格布局、表单布局和堆栈布局
  • GO语言,半自动打怪
  • 【Java 进阶篇】Java登录案例详解
  • Vue 菜单导航栏,轮播图
  • 讲述为什么要学习Adobe XD以及 Adobe XD下载安装
  • Netty复习:(1)Http server: hello world