博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
springcloud之Ribbon负载均衡源码探究深入浅出
阅读量:4165 次
发布时间:2019-05-26

本文共 2286 字,大约阅读时间需要 7 分钟。

Ribbon负载均衡深入浅出

文章目录

一、Ribbon负载均衡

什么是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);

从端的角度负载均衡有两种

服务端负载均衡

客户端负载均衡
在这里插入图片描述

二、Ribbon负载均衡过程

进入注解 @LoadBalanced 查看源码:

在这里插入图片描述

负载均衡策略请求来之后进入到 excute 方法

在这里插入图片描述

RibbonLoadBalancerClient implements LoadBalancerClient

在这里插入图片描述

默认 DynamicServerListLoadBalancer

在这里插入图片描述

DynamicServerListLoadBalancer exteds BaseLoadBalancer

在这里插入图片描述

RibbonLoadBalancerClient 的 getServer 方法

在这里插入图片描述

这里调用 DynamicServerListLoadBalancer 的 chooseServer 方法,发现 DynamicServerListLoadBalancer 没有 chooseServer 方法,则查找其父类 BaseLoadBalancer

在这里插入图片描述

在这里插入图片描述

三、Ribbonn关键轮训算法

public Optional
chooseRoundRobinAfterFiltering(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; } }

四、Ribbon支持的负载均衡策略介绍

在这里插入图片描述

策略类 命名 描述
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/

你可能感兴趣的文章
Single Number II --出现一次的数(重)
查看>>
对话周鸿袆:从程序员创业谈起
查看>>
Mysql中下划线问题
查看>>
Xcode 11 报错,提示libstdc++.6 缺失,解决方案
查看>>
vue项目打包后无法运行报错空白页面
查看>>
Vue 解决部署到服务器后或者build之后Element UI图标不显示问题(404错误)
查看>>
element-ui全局自定义主题
查看>>
阿里p8程序员四年提交6000次代码的确有功,但一次错误让人唏嘘!
查看>>
一道技术问题引起的遐想,最后得出结论技术的本质是多么的朴实!
查看>>
985硕士:非科班自学编程感觉还不如培训班出来的,硕士白读了?
查看>>
码农:和产品对一天需求,产品经理的需求是对完了,可我代码呢?
查看>>
第六章 背包问题——01背包
查看>>
1136 . 欧拉函数
查看>>
面试题:强制类型转换
查看>>
Decorator模式
查看>>
Template模式
查看>>
Observer模式
查看>>
高性能服务器设计
查看>>
图文介绍openLDAP在windows上的安装配置
查看>>
Pentaho BI开源报表系统
查看>>