Ribbon负载均衡的深度分析和使用_ribbon eager-load enabled true(1)

}

public ClientHttpResponse intercept(final HttpRequest request, final byte[] body, final ClientHttpRequestExecution execution) throws IOException {
    URI originalUri = request.getURI();
    String serviceName = originalUri.getHost();
    Assert.state(serviceName != null, "Request URI does not contain a valid hostname: " + originalUri);
    return (ClientHttpResponse)this.loadBalancer.execute(serviceName, this.requestFactory.createRequest(request, body, execution));
}

}


找到Eureka服务列表并根据负载均衡算法选取一个服务



public T execute(String serviceId, LoadBalancerRequest request, Object hint) throws IOException {
ILoadBalancer loadBalancer = this.getLoadBalancer(serviceId);//根据服务名称找Eureka服务列表
Server server = this.getServer(loadBalancer, hint);//根据负载均衡算法从Eureka的server列表中选出一个
if (server == null) {
throw new IllegalStateException("No instances available for " + serviceId);
} else {
RibbonLoadBalancerClient.RibbonServer ribbonServer = new RibbonLoadBalancerClient.RibbonServer(serviceId, server, this.isSecure(server, serviceId), this.serverIntrospector(serviceId).getMetadata(server));
return this.execute(serviceId, (ServiceInstance)ribbonServer, (LoadBalancerRequest)request);
}
}



> 
> getLoadBalancer(serviceId):**根据服务id获取ILoadBalancer,而ILoadBalancer会拿着服务id去eureka中获取服务列表并保存起来**。getServer(loadBalancer):**利用内置的负载均衡算法,从服务列表中选择一个**。
> 
> 
> 


在BaseLoadBalancer.class的类下,利用IRule实现负载均衡的策略


跟进上面的getServer方法,继续跟踪源码在BaseLoadBalancer类下找到chooseServer方法



public Server chooseServer(Object key) {
if (this.counter == null) {
this.counter = this.createCounter();
}

    this.counter.increment();
    if (this.rule == null) {
        return null;
    } else {
        try {
            return this.rule.choose(key);//进行服务选择的Key
        } catch (Exception var3) {
            logger.warn("LoadBalancer [{}]: Error choosing server for key {}", new Object[]{this.name, key, var3});
            return null;
        }
    }
}

## 🚕Ribbon负载均衡策略


跟进上面的rule,rule,规则,即负载均衡的规则,有以下几种



public class BaseLoadBalancer extends AbstractLoadBalancer implements PrimeConnectionListener, IClientConfigAware {
private static Logger logger = LoggerFactory.getLogger(BaseLoadBalancer.class);
private static final IRule DEFAULT_RULE = new RoundRobinRule();//这里的rule默认值是一个RoundRobinRule的类型
private static final BaseLoadBalancer.SerialPingStrategy DEFAULT_PING_STRATEGY = new BaseLoadBalancer.SerialPingStrategy((SyntheticClass_1)null);
private static final String DEFAULT_NAME = “default”;
private static final String PREFIX = “LoadBalancer_”;
protected IRule rule;
protected IPingStrategy pingStrategy;
protected IPing ping;


![在这里插入图片描述](https://img-blog.csdnimg.cn/838c756b1de2433da1753b26f556d6e9.png#pic_center)


![在这里插入图片描述](https://img-blog.csdnimg.cn/e64fa409012c40cda4c7091ea07d26a1.png#pic_center)


RoundRobinRule(轮询策略):按照一定的顺序依次调用服务实例。多个服务轮流访问。**它是Ribbon默认的负载均衡规则。**  
 RandomRule(随机策略):**从服务提供者的列表中随机选择一个服务实例**。  
 WeightedResponseTimeRule(权重策略):根据每个服务提供者的响应时间分配⼀个权重,响应时间越长,权重越小,被选中的可能性也就越低。  
 RetryRule(重试策略):按照轮询策略来获取服务,如果获取的服务实例为 null 或已经失效,**则在指定的时间之内不断地进行重试来获取服务,如果超过指定时间依然没获取到服务实例则返回 null**。  
 AvailabilityFilteringRule(可⽤敏感性策略):先过滤掉⾮健康的服务实例,然后再选择连接数较⼩的服务实例。  
 ZoneAvoidanceRule(区域敏感策略):根据服务所在区域(zone)的性能和服务的可⽤性来选择服务实例,**在没有区域的环境下,该策略和轮询策略类似。**  
 BestAvailableRule(最小连接数策略):也叫最小并发数策略,它是遍历服务提供者列表,选取连接数最小的⼀个服务实例。如果有相同的最⼩连接数,那么会调⽤轮询策略进行选取。**即忽略那些短路的服务器,并选择并发数较低的服务器。**  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/73a609a63bb546cc826a03917a58046f.gif#pic_center)


## 🚙自定义负载均衡策略


我们需要在order-service中的OrderApplication类中,定义一个新的IRule:



@Bean
public IRule randomRule(){
return new RandomRule();
}


配置文件方式:在order-service的application.yml文件中,添加新的配置也可以修改规则:



userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则


## 🚎Ribbon设置饥饿加载


Ribbon默认是采用懒加载,就是第一次访问的时候才会去创建LoadBalanceClient,这样的情况下会导致请求时间很长,影响我们的使用效率。


**而饥饿加载则会在项目启动时创建,降低第一次访问的耗时**,以下是开启饥饿加载的配置



ribbon:
eager-load:

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

获取](https://bbs.csdn.net/topics/618545628)**

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 20
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值