1. /**
    * random load balance.
    *
    */
    public class RandomLoadBalance extends AbstractLoadBalance {
  2.  
  3. public static final String NAME = "random";
  4.  
  5. @Override
    protected <T> Invoker<T> doSelect(List<Invoker<T>> invokers, URL url, Invocation invocation) {
    int length = invokers.size(); // Number of invokers
    boolean sameWeight = true; // Every invoker has the same weight?
    int firstWeight = getWeight(invokers.get(0), invocation);
    int totalWeight = firstWeight; // The sum of weights
    //判断是否所有服务提供者的权重都相同
    for (int i = 1; i < length; i++) {
    int weight = getWeight(invokers.get(i), invocation);
    totalWeight += weight; // Sum
    if (sameWeight && weight != firstWeight) {
    sameWeight = false;
    }
    }
    //所有服务提供者的权重不都相同,且权重之和>0,则随机生成一个0-totalWeight的随机数,
    // 然后用此随机数循环减去服务提供者的权重直到改值<0,则此服务提供者为目标服务提供者
    if (totalWeight > 0 && !sameWeight) {
    // If (not every invoker has the same weight & at least one invoker's weight>0), select randomly based on totalWeight.
    int offset = ThreadLocalRandom.current().nextInt(totalWeight);
    // Return a invoker based on the random value.
    for (int i = 0; i < length; i++) {
    offset -= getWeight(invokers.get(i), invocation);
    if (offset < 0) {
    return invokers.get(i);
    }
    }
    }
    // If all invokers have the same weight value or totalWeight=0, return evenly.
    //所有服务提供者的权重都相同,则随机选取一个服务提供者,则此服务提供者为目标服务提供者
    return invokers.get(ThreadLocalRandom.current().nextInt(length));
    }
  6.  
  7. }
  8.  

【Dubbo源码学习】负载均衡算法(1)-随机算法的更多相关文章

  1. Dubbo源码(八) - 负载均衡

    前言 本文基于Dubbo2.6.x版本,中文注释版源码已上传github:xiaoguyu/dubbo 负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡.分摊到多个 ...

  2. Dubbo源码学习--集群负载均衡算法的实现

    相关文章: Dubbo源码学习文章目录 前言 Dubbo 的定位是分布式服务框架,为了避免单点压力过大,服务的提供者通常部署多台,如何从服务提供者集群中选取一个进行调用, 就依赖Dubbo的负载均衡策 ...

  3. Dubbo源码学习文章目录

    目录 Dubbo源码学习--服务是如何发布的 Dubbo源码学习--服务是如何引用的 Dubbo源码学习--注册中心分析 Dubbo源码学习--集群负载均衡算法的实现

  4. Dubbo源码学习--服务是如何引用的

    ReferenceBean 跟服务引用一样,Dubbo的reference配置会被转成ReferenceBean类,ReferenceBean实现了InitializingBean接口,直接看afte ...

  5. Dubbo源码学习--注册中心分析

    相关文章: Dubbo源码学习--服务是如何发布的 Dubbo源码学习--服务是如何引用的 注册中心 关于注册中心,Dubbo提供了多个实现方式,有比较成熟的使用zookeeper 和 redis 的 ...

  6. Dubbo源码学习--服务是如何发布的

    相关文章: Dubbo源码学习--服务是如何发布的 Dubbo源码学习--服务是如何引用的 ServiceBean ServiceBean 实现ApplicationListener接口监听Conte ...

  7. Dubbo源码学习--优雅停机原理及在SpringBoot中遇到的问题

    Dubbo源码学习--优雅停机原理及在SpringBoot中遇到的问题 相关文章: Dubbo源码学习文章目录 前言 主要是前一阵子换了工作,第一个任务就是解决目前团队在 Dubbo 停机时产生的问题 ...

  8. Dubbo源码学习(二)

    @Adaptive注解 在上一篇ExtensionLoader的博客中记录了,有两种扩展点,一种是普通的扩展实现,另一种就是自适应的扩展点,即@Adaptive注解的实现类. @Documented ...

  9. Spring Cloud Ribbon 源码分析---负载均衡算法

    上一篇分析了Ribbon如何发送出去一个自带负载均衡效果的HTTP请求,本节就重点分析各个算法都是如何实现. 负载均衡整体是从IRule进去的: public interface IRule{ /* ...

  10. Dubbo源码学习总结系列三 dubbo-cluster集群模块

    Dubbo集群模块的目的是将集群Invokers构造一个透明的Invoker对象,其中包含了容错机制.负载均衡.目录服务(服务地址集合).路由机制等,为RPC层提供高可用.高并发.自动发现.可治理的S ...

随机推荐

  1. vue-router+elelment-ui,实现导航栏激活高亮

    <el-menu :default-active="$route.path" class="el-menu-vertical-demo" backgrou ...

  2. WEB学习笔记6-正确闭合HTML标签

    自闭合标签(空元素,即不能包含任何内容,这些元素对应的HTML标签成为自闭合标签) area/base/br/col/command/embed/hr/img/input/keygen/link/me ...

  3. Linux中使用sed命令替换字符串小结

    sed替换的基本语法为: sed 's/原字符串/替换字符串/' 单引号里面,s表示替换,三根斜线中间是替换的样式,特殊字符需要使用反斜线”\”进行转义,但是单引号”‘”是没有办法用反斜线”\”转义的 ...

  4. Linux CPU瓶颈问题分析

    虚线部分为`下一步`的分析方向,图是网络抄的,放这里更容易找

  5. 【linux基础】linux不能进入系统

    博主遇到的这个问题其实主要原因是系统内核和NVIDIA的GPU版本不匹配. 主要是系统内核自动更新,而GPU驱动没有对应的更新造成的. 又要涉及NVIDIA驱动的安装,这个安装真的很鸡肋... 需要注 ...

  6. php7-编译安装参数

    ./configure \--with-fpm-user=www \--with-fpm-group=www \--prefix=/usr/local/php7 \--with-config-file ...

  7. 使用command line测试网速

    wget -O speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py --no ...

  8. Python全栈之路----常用模块----序列化(json&pickle&shelve)模块详解

    把内存数据转成字符,叫序列化:把字符转成内存数据类型,叫反序列化. Json模块 Json模块提供了四个功能:序列化:dumps.dump:反序列化:loads.load. import json d ...

  9. JVM垃圾收集器-Parallel Scavenge收集器

    今天我给大家讲讲JVM垃圾收集器-Parallel Scavenge收集器 Parallel Scavenge收集器 Parallel Scavenge收集器也是一个新生代收集器,它也是使用复制算法的 ...

  10. 各类排序算法的实现C#版

    using System;using System.CodeDom;using System.Collections.Generic;using System.Linq;using System.Ru ...