Ribbon学习记录

Ribbon

  1. nacos:注册中心,解决服务的注册与发现
  2. Ribbon:客户端的负载均衡器,解决的是服务实例列表的负载均衡的问题

Ribbon简介

Ribbon是Netflix公司开源的一个负载均衡的项目,是一个"客户端"负载均衡器,运行在客户端上

Ribbon在项目中的使用案例

首先是pom依赖:springcloud alibaba 对Ribbon做了兼容,只需要@LoadBalanced注解,在RestTemplate类上加注解即可。在nacos官网——Nacos Spring Cloud菜单下也有介绍

Ribbon的工作流程

  1. Ribbon拦截所有的远程调用
  2. 解析URL中的host,获取servicename
  3. 根据servicename获取实例列表(先从本地缓存中获取),如果有,则获取列表,然后通过相应的均衡策略,获取一个实例;如果没有,必须请求nacos-server,获取实例列表,然后cache到本地缓存中
  4. 发送远程调用

切换Ribbon负载均衡策略

  1. Ribbon核心组件IRule:根据特定算法从服务列表中选取一个需要访问的服务;
  2. 其中IRule是一个接口,有七个自带的落地实现类,可以实现不同的负载均衡算法规则:
策略名策略声明策略描述(算法)
BestAvailableRulepublic class BestAvailableRule extends ClientConfigEnabledRoundRobinRule选择一个最小的并发请求的server
AvailabilityFilteringRulepublic class AvailabilityFilteringRule extends PredicateBasedRule先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,还有并发的连接数量超过阈值的服务,然后对剩余的服务进行轮询
WeightedResponseTimeRulepublic class WeightedResponseTimeRule extends RoundRobinRule根据平均响应时间计算服务的权重。统计信息不足时会按照轮询,统计信息足够会按照响应的时间选择服务
RetryRulepublic class RetryRule extends AbstractLoadBalancerRule正常时按照轮询选择服务,若过程中有服务出现故障,在轮询一定次数后依然故障,则会跳过故障的服务继续轮询。
RoundRobinRulepublic class RoundRobinRule extends AbstractLoadBalancerRule轮询规则
RandomRulepublic class RandomRule extends AbstractLoadBalancerRule随机
ZoneAvoidanceRule(默认)public class ZoneAvoidanceRule extends PredicateBasedRuleZoneAvoidanceRule中的过能条作是以ZoneAvoidancePredicate,为主过滤条件和以AvailabilityPredicate为次过滤条件组成的—个叫做CompositePredicate的组合过滤条件,过滤成功之后,继续采用线性轮询的方式从过滤结果中选择一个出来。

第一步:新建类MyRule

注意这个配置类必须放在@ConponentScan默认扫描的范围外

package com.rule;

import com.netflix.loadbalancer.BestAvailableRule;
import com.netflix.loadbalancer.IRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//注意这个配置类必须放在@ConponentScan默认扫描的范围外
@Configuration
public class MyRule {

    @Bean
    public IRule getRule() {
        return new BestAvailableRule();
    }
}


第二步:在启动类加注解

name指定调用的服务名称,configuration加载的配置信息。 意思是将来调用cloud-goods服务时,采用的负载均衡策略是MyRule.class里设置的

@RibbonClient(name = "cloud-goods",configuration = {MyRule.class})

end
  • 作者:(联系作者)
  • 更新时间:2022-08-15 14:59
  • 版权声明:自由转载-非商用
  • 转载声明:如果是转载栈主转载的文章,请附上原文链接