一起写RPC框架(二十一)RPC服务消费者三--服务消费者负载策略
来源:互联网 发布:网站制作软件培训 编辑:程序博客网 时间:2024/06/06 03:10
所谓负载策略,其实相对比较简单,某个消费者去远程调用某个服务,不过提供这个服务不止一个实例,那么建立的长连接就不止一个,所以需要做的事情就是根据某个策略在这个长连接中选择一个进行通讯
本Demo RPC只实现了三个比较常用的负载策略
1)随机
2)加权随机
3)轮询
下面给出实现:
package org.laopopo.client.loadbalance;import java.util.Random;import java.util.concurrent.CopyOnWriteArrayList;import java.util.concurrent.ThreadLocalRandom;import java.util.concurrent.atomic.AtomicInteger;import org.laopopo.common.utils.ChannelGroup;/** * * @author BazingaLyn * @description 负载均衡算法 * @time 2016年9月1日17:48:47 * @modifytime 2016年9月8日 */public enum LoadBalanceStrategies {//随机RANDOMSTRATEGIES(new LoadBalance(){@Overridepublic ChannelGroup select(CopyOnWriteArrayList<ChannelGroup> arrayList) {Random random = new Random();int randomPos = random.nextInt(arrayList.size());return arrayList.get(randomPos);}}),//加权随机WEIGHTRANDOMSTRATEGIES(new LoadBalance(){@Overridepublic ChannelGroup select(CopyOnWriteArrayList<ChannelGroup> arrayList) {int count = arrayList.size();if (count == 0) {throw new IllegalArgumentException("empty elements for select");}if (count == 1) {return arrayList.get(0);}int totalWeight = 0;int[] weightSnapshots = new int[count];for (int i = 0; i < count; i++) {totalWeight += (weightSnapshots[i] = getWeight(arrayList.get(i)));}boolean allSameWeight = true;for (int i = 1; i < count; i++) {if (weightSnapshots[0] != weightSnapshots[i]) {allSameWeight = false;break;}}ThreadLocalRandom random = ThreadLocalRandom.current();// 如果权重不相同且总权重大于0, 则按总权重数随机if (!allSameWeight && totalWeight > 0) {int offset = random.nextInt(totalWeight);// 确定随机值落在哪个片for (int i = 0; i < count; i++) {offset -= weightSnapshots[i];if (offset < 0) {return arrayList.get(i);}}}return (ChannelGroup) arrayList.get(random.nextInt(count));}private int getWeight(ChannelGroup channelGroup) {return channelGroup.getWeight();}}), ROUNDROBIN(new LoadBalance(){AtomicInteger position = new AtomicInteger(0);@Overridepublic ChannelGroup select(CopyOnWriteArrayList<ChannelGroup> arrayList) {int count = arrayList.size();if (count == 0) {throw new IllegalArgumentException("empty elements for select");}if (count == 1) {return arrayList.get(0);}ChannelGroup channelGroup = arrayList.get(position.getAndIncrement() / count);return channelGroup;}});private final LoadBalance loadBalance;LoadBalanceStrategies(LoadBalance loadBalance) { this.loadBalance = loadBalance; }public ChannelGroup select(CopyOnWriteArrayList<ChannelGroup> arrayList){return loadBalance.select(arrayList);}interface LoadBalance {ChannelGroup select(CopyOnWriteArrayList<ChannelGroup> arrayList);}}
0 0
- 一起写RPC框架(二十一)RPC服务消费者三--服务消费者负载策略
- 一起写RPC框架(二十)RPC服务消费者二--服务消费者订阅服务
- 一起写RPC框架(二十二)RPC服务消费者四--服务消费者服务编织
- 一起写RPC框架(十九)RPC服务消费者一--服务消费者简介
- 一起写RPC框架(二十五)RPC测试篇二---服务消费者和服务提供者直连测试
- 一起写RPC框架(十一)RPC服务提供端三--服务的调用
- 一起写RPC框架(十七)RPC注册中心四--注册中心服务消费者端的处理
- 一起写RPC框架(十)RPC服务提供端二--服务的编织和注册
- 一起写RPC框架(十二)RPC服务提供端四--服务的限流
- 一起写RPC框架(十三)RPC服务提供端四--服务的降级
- 一起写RPC框架(十六)RPC注册中心三--注册中心服务提供者端的处理
- 一起写RPC框架(八)RPC服务提供端开篇--人生若只如初见
- 一起写RPC框架(九)RPC服务提供端一--服务端的基本代码结构
- 一起写RPC框架(二)RPC之项目搭建
- 一起写RPC框架(二十七)RPC 写在最后
- 一起写RPC框架(二十六)RPC测试篇三---限流的测试
- RPC服务框架(二) 简单RPC实现
- 如何写一个RPC框架(三):服务注册与服务发现
- 记一次docker部署web服务性能瓶颈解决过程
- String类常用api
- VectorDrawable-第一章
- Android开发中libs包下面的mips、armeabi、armeabi-v7a和x86
- 使用QRCode实现二维码生成
- 一起写RPC框架(二十一)RPC服务消费者三--服务消费者负载策略
- 常用php函数
- NSFileManager创建与拷贝文件
- 给Unity开发者的C#内存管理(第二部分) C# Memory Management for Unity Developers (part 2 of 3)
- MyEclipse安装Eclipse Memory Analyzer插件,并进行错误文件分析流程
- 操作给其它表做外键的数据
- centos7 saltstack快速安装+自定义模块实例
- android 必看知识点
- 单链表基础操作C++实现