• spring cloud之负载均衡


    负载均衡客户端组件Ribbon

    简介

    - 官网:https://github.com/Netflix/ribbon
    - spring cloud ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过spring cloud的封装,可以轻松面向服务的REST模板请求转换成客户端负载均衡的服务调用
    
    • 1
    • 2

    Ribbon组件实现负载均衡原理

    - 根据调用服务的服务ID(spring.application.name指定的服务名)去注册中心获取对应的服务列表,并将服务列表拉取到本地进行缓存,然后在本地通过默认的轮询的负载均衡策略在现有列表中选择一个可用节点提供服务。
    
    - Ribbon是客户端的负载均衡
    
    • 1
    • 2
    • 3

    Ribbon负载均衡策略算法

    - RoundRobinRule   轮询策略
    	按顺序循环选择server
    - RandomRule    随机策略    
    	随机选择server
    - AvailabilityFilteringRule   可用过滤策略
    	会先过滤由于多次访问故障而处于断路器跳闸状态的服务,还有并发的连接数量超过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问
    - WeightedResponseTimeRule  响应时间加权策略
    	根据平均响应的时间计算所有服务的权重,响应时间越快,服务权重越大,被选中的概率越高。
    	刚启动时,如果统计信息不足,则使用RoundRobinRule策略,等统计信息足够会切换到WeightedResponseTimeRule策略
    - RetryRule    重试策略
    	先按照RoundRobinRule策略获取服务,如果获取失败则在指定的时间内进行重试,获取可用的服务
    - BestAvailableRule   最低并发策略
    	会先过滤由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
    ......
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    图片待补充

    Ribbon负载均衡源码分析路径

    1.查看loadBalancerClient.choose("ORDER")源码。顶层接口ServiceInstanceChooser#ServiceInstance choose(String serviceId)
    2.RibbonLoadBalancerClient实现接口顶层接口ServiceInstanceChooser,重写ServiceInstance choose(String serviceId)方法
    3.调用RibbonLoadBalancerClient中的方法ServiceInstance choose(String serviceId, Object hint)
    	- Server server = getServer(getLoadBalancer(serviceId), hint);
    	- Server getServer(ILoadBalancer loadBalancer, Object hint)
    	- loadBalancer.chooseServer(hint != null ? hint : "default")
    4.ZoneAwareLoadBalancer#Server chooseServer(Object key)
    	- ZoneAwareLoadBalancer继承BaseLoadBalancer
    5.BaseLoadBalancer#Server chooseServer(Object key)
    	- private final static IRule DEFAULT_RULE = new RoundRobinRule()
    	- protected IRule rule = DEFAULT_RULE;
    6.最后根据IRule选择负载均衡算法(由BaseLoadBalancer类成员rule变量定义可知,默认为轮询)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    修改Ribbon负载均衡策略

    # 修改用户服务调用订单服务的Ribbon负载均衡策略(默认是轮询)   ORDER:服务名
    ORDER.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
    
    • 1
    • 2

    Ribbon已停止维护

    ribbon-core、ribbon-loadbalancer依然在大规模生产实践中使用,如果需要实现服务间通信负载均衡依然可以用Ribbon
    
    • 1
  • 相关阅读:
    【JavaEE初阶】多线程 _ 进阶篇 _ 锁的优化、JUC的常用类、线程安全的集合类
    安全测试目录内容合集
    Vue的仓库vuex
    2022-33周(8.08-8.14) 项目问题整理
    基于知识图谱的学术资源推荐系统设计与实现
    Spring 中注入 Bean 的各种骚操作做
    图解LeetCode——854. 相似度为 K 的字符串(难度:困难)
    计算机网络填空题
    【Docker】容器
    数据指标体系建设思考(一)
  • 原文地址:https://blog.csdn.net/weixin_41858020/article/details/134407000