Java中的权重算法(如Dubbo的负载均衡权重)详解

 更新时间:2023年08月15日 09:00:56   作者:SSS_HuLiang  
这篇文章主要介绍了Java中的权重算法(如Dubbo的负载均衡权重)详解,负载均衡,其含义就是指将负载进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务,需要的朋友可以参考下

负载均衡

首先了解一下负载均衡。

百度百科:

负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。

个人理解,负载均衡,顾名思义,就是让硬件或服务,所受的负载,尽量均衡一点。

物尽其用,如250G固态硬盘和1T机械硬盘。

作为系统盘,则选择用250G的固态,读取和写入的速度块。

有很多学习资源要存,容量较大,那么就会1T的机械硬盘。

择优选择,打疫苗时,A,B,C三个医院,A医院爆满,C医院人数较少,那么就去C医院。

Dubbo四种负载均衡

  1. 随机权重(Random LoadBalance)
    • dubbo默认 A:权重40  占比2/5 B:权重20  占比1/5 C:权重40  占比2/5 则每次请求,都是随机访问的,可能A,可能B,可能C。数据量大的情况下,就会形成权重的比例。
  2. 轮询(RoundRobin LoadBalance)
    • 轮循,按公约后的权重设置轮循比率。(可以根据权重轮询,如2/5,1/5,2/5。5个请求,则 A-B-C-A-C)无权重则A-B-C-A-B-C.... 存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。
  3. 最少活跃调用数(LeastActive LoadBalance)
    • 最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。 使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。 A:200ms B:200ms C:300ms 先看一下上次调用时间,请求优先调用A和B,随机选择。统计上一次的调用时间
  4. 一致性hash(ConsistentHash LoadBalance)
    • 一致性 Hash,相同参数的请求总是发到同一提供者。 当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。 算法参见://en.wikipedia.org/wiki/Consistent_hashing 缺省只对第一个参数 Hash,如果要修改,请配置 <dubbo:parameter key="hash.arguments" value="0,1" /> 缺省用 160 份虚拟节点,如果要修改,请配置 <dubbo:parameter key="hash.nodes" value="320" />

方法名,和第一个参数名,getUser?id=1,调用服务A,则下次同方法同参数,会继续调用服务A,除非服务A挂掉,那么就会根据虚拟节点,平摊给其他服务提供者。算法处理。

个人理解的权重算法  

 /**
  * <h3>根据权重获取对应服务,传入服务:权重map</h3>
  *
  * @param map 服务:权重map
  * @return java.lang.String
  * @author Hubers 
  * @date 2021/6/15 16:16
  **/
 public static String getServerByWeight(Map<String, Integer> map) {
        if (map.isEmpty()){
            return null;
        }
        Integer total = 0;
        // 计算所有权重,如100+200+300=600
        for (Integer value : map.values()) {
            total += value;
        }
        Random random = new Random();
        // 在权重范围内随机,600以内随机
        int nextInt = random.nextInt(total);
        // 遍历所有服务提供者provide的ip地址
        for (String ip : map.keySet()) {
            // 取出权重值
            Integer weight = map.get(ip);
            // 权重在范围内,则返回对应ip
            if (nextInt < weight) {
                return ip;
            }
            // 否则减去权重,继续下一次循环,匹配对应的ip
            nextInt -= weight;
        }
        return null;
    }
public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("192.168.1.1", 10);
        map.put("192.168.1.2", 10);
        map.put("192.168.1.3", 10);
        map.put("192.168.1.4", 10);
        for (int i = 0; i < 10; i++) {
            String weight = getServerByWeight(map);
            if (Objects.isNull(weight)) {
                throw new RuntimeException("无可用服务");
            }
            System.out.println(weight);
        }
    }

到此这篇关于Java中的权重算法(如Dubbo的负载均衡权重)详解的文章就介绍到这了,更多相关Java权重算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Mybatis-Plus逻辑删除的用法详解

    Mybatis-Plus逻辑删除的用法详解

    这篇文章主要为大家详细介绍了Mybatis-Plus 逻辑删除的用法,文中有详细的代码示例,对我们的学习或工作有一定的帮助,需要的朋友可以参考下
    2023-07-07
  • Java中joda日期格式化工具的使用示例

    Java中joda日期格式化工具的使用示例

    这篇文章主要介绍了Java中joda日期格式化工具的使用示例,帮助大家更好的利用Java处理时间,感兴趣的朋友可以了解下
    2021-01-01
  • 使用IntelliJ IDEA2020.2.2 x64 新建java项目并且输出Hello World

    使用IntelliJ IDEA2020.2.2 x64 新建java项目并且输出Hello World

    这篇文章主要介绍了使用IntelliJ IDEA2020.2.2 x64 新建java项目并且输出Hello World,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Java中数组array和列表list相互转换

    Java中数组array和列表list相互转换

    这篇文章主要介绍了Java中数组array和列表list相互转换,在Java中,可以将数组(array)和列表(list)相互转换,但需要注意一些细节和限制,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • java网络编程基础知识介绍

    java网络编程基础知识介绍

    这篇文章主要介绍了java网络编程基础知识介绍,涉及OSI分层模型和TCP/IP分层模型的对应关系、IP地址、端口号、tcp、udp等相关内容,还是比较不错的,这里分享给大家,供需要的朋友参考。
    2017-11-11
  • SWT(JFace) 图片浏览器 实现代码

    SWT(JFace) 图片浏览器 实现代码

    SWT(JFace)小制作:图片浏览器
    2009-06-06
  • Java中的序列化机制详细解读

    Java中的序列化机制详细解读

    这篇文章主要介绍了Java中的序列化机制详细解读,序列化:将对象的状态信息转换为可以存储或传输的数据形式(比如二进制)的过程,反序列化:与序列化相对,把序列化转换成的可以存储或传输的数据形式转化为对象的状态信息的过程,需要的朋友可以参考下
    2023-11-11
  • MyBatis的SUM映射问题及解决

    MyBatis的SUM映射问题及解决

    这篇文章主要介绍了MyBatis的SUM映射问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 优化Java虚拟机总结(jvm调优)

    优化Java虚拟机总结(jvm调优)

    这篇文章主要介绍了优化Java虚拟机总结(jvm调优),具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • SpringBoot+MDC实现链路调用日志的方法

    SpringBoot+MDC实现链路调用日志的方法

    MDC是 log4j 、logback及log4j2 提供的一种方便在多线程条件下记录日志的功能,这篇文章主要介绍了SpringBoot+MDC实现链路调用日志,需要的朋友可以参考下
    2022-12-12

最新评论