本文共 2286 字,大约阅读时间需要 7 分钟。
什么是Ribbon Ribbon是一个客户端负载均衡工具,通过Spring Cloud封装
注解: @LoadBalanced 标识ribbon负载均衡
/** * 负载均衡调用 * @return */ @LoadBalanced @Bean public RestTemplate restTemplate() { return new RestTemplate(); }// 使用 Object forObject = restTemplate.getForObject("http://被调用的服务名/api/v1/order/getProduct", Object.class);
从端的角度负载均衡有两种
服务端负载均衡
客户端负载均衡进入注解 @LoadBalanced 查看源码:
负载均衡策略请求来之后进入到 excute 方法
RibbonLoadBalancerClient implements LoadBalancerClient
默认 DynamicServerListLoadBalancer
DynamicServerListLoadBalancer exteds BaseLoadBalancer
RibbonLoadBalancerClient 的 getServer 方法
这里调用 DynamicServerListLoadBalancer 的 chooseServer 方法,发现 DynamicServerListLoadBalancer 没有 chooseServer 方法,则查找其父类 BaseLoadBalancer
public OptionalchooseRoundRobinAfterFiltering(List servers, Object loadBalancerKey) { // 这的服务信息,将有配置中心获取,所用的配置中心是Nacos List eligible = getEligibleServers(servers, loadBalancerKey); if (eligible.size() == 0) { return Optional.absent(); } // 根据下标获取服务【下标就是通过轮训算法算出来的】 return Optional.of(eligible.get(incrementAndGetModulo(eligible.size())));}// 关键轮训算法private final AtomicInteger nextIndex = new AtomicInteger(); // modulo 为在注册中 注册的被调用服务的这个服务实例数private int incrementAndGetModulo(int modulo) { for (;;) { int current = nextIndex.get(); int next = (current + 1) % modulo; if (nextIndex.compareAndSet(current, next) && current < modulo) return current; } }
策略类 | 命名 | 描述 |
---|---|---|
RandomRule | 随机策略 | 随机选择server |
RoundRobinRule | 轮询策略 | 按照顺序选择server(默认) |
RetryRule | 重试策略 | 当选择server不成功,短期内尝试选择一个可用的server |
AvailabilityFilteringRule | 可用过滤策略 | 过滤掉一直失败并被标记为circuit tripped的server,过滤掉那些高并发链接的server(active connections超过配置的阈值) |
WeightedResponseTimeRule | 响应时间加权重策略 | 根据server的响应时间分配权重,以响应时间作为权重,响应时间越短的服务器被选中的概率越大,综合了各种因素,比如:网络,磁盘,io等,都直接影响响应时间 |
ZoneAvoidanceRule | 区域权重策略 | 综合判断server所在区域的性能,和server的可用性,轮询选择server |
配置文件中自定义选择策略:
订单服务增加配置# 服务名称mesmile-video-service: ribbon: # 填写 IRule 实现类中负载均衡策略 这里测试 随机负载策略 NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
结论-》策略选择:
1、如果每个机器配置一样,则建议不修改策略 (推荐)
2、如果部分机器配置强,则可以改为 WeightedResponseTimeRule转载地址:http://lexxi.baihongyu.com/