【分布式】load balance 04-java 从零手写实现负载均衡
负载均衡系列专题
本节我们来看一下如何实现一负载均衡框架。
源码
核心接口定义
public interface ILoadBalance {
/**
* 选择下一个节点
*
* 返回下标
* @param context 上下文
* @return 结果
* @since 0.0.1
*/
IServer select(final ILoadBalanceContext context);
}
1. 随机策略
public class LoadBalanceRandom extends AbstractLoadBalance{
public LoadBalanceRandom(List<IServer> servers) {
super(servers);
}
@Override
protected IServer doSelect(ILoadBalanceContext context) {
Random random = ThreadLocalRandom.current();
int nextIndex = random.nextInt(servers.size());
return servers.get(nextIndex);
}
}
2. 轮训
public class LoadBalanceRoundRobbin extends AbstractLoadBalance {
/**
* 位移指针
* @since 0.0.1
*/
private final AtomicLong indexHolder = new AtomicLong();
public LoadBalanceRoundRobbin(List<IServer> servers) {
super(servers);
}
@Override
protected IServer doSelect(ILoadBalanceContext context) {
long index = indexHolder.getAndIncrement();
int actual = (int) (index % servers.size());
return servers.get(actual);
}
}
3. 有权重的轮训
这个需要对数据进行初始化处理,计算数组的最大公约数。
public class LoadBalanceWeightRoundRobbin extends AbstractLoadBalance {
/**
* 位移指针
* @since 0.0.1
*/
private final AtomicLong indexHolder = new AtomicLong();
/**
* 处理后的列表
* @since 0.0.1
*/
private final List<IServer> actualList = new ArrayList<>();
public LoadBalanceWeightRoundRobbin(List<IServer> servers) {
super(servers);
// 初始化真实列表
this.init(servers);
}
@Override
protected IServer doSelect(ILoadBalanceContext context) {
long index = indexHolder.getAndIncrement();
// 基于真实的列表构建
int actual = (int) (index % actualList.size());
return actualList.get(actual);
}
/**
* 初始化
* @param serverList 服务列表
* @since 0.0.1
*/
private void init(final List<IServer> serverList) {
//1. 过滤掉权重为 0 的机器
List<IServer> notZeroServers = CollectionUtil.filterList(serverList, new IFilter<IServer>() {
@Override
public boolean filter(IServer iServer) {
return iServer.weight() <= 0;
}
});
//2. 获取权重列表
List<Integer> weightList = CollectionUtil.toList(notZeroServers, new IHandler<IServer, Integer>() {
@Override
public Integer handle(IServer iServer) {
return iServer.weight();
}
});
//3. 获取最大的权重
int maxDivisor = MathUtil.ngcd(weightList);
//4. 重新计算构建基于权重的列表
for(IServer server : notZeroServers) {
int weight = server.weight();
int times = weight / maxDivisor;
for(int i = 0; i < times; i++) {
actualList.add(server);
}
}
}
}
4. 普通哈希
public class LoadBalanceCommonHash extends AbstractLoadBalanceHash {
public LoadBalanceCommonHash(List<IServer> servers, IHash hash) {
super(servers, hash);
}
@Override
protected IServer doSelect(ILoadBalanceContext context) {
final String hashKey = context.hashKey();
int hashCode = Math.abs(hash.hash(hashKey));
int index = servers.size() % hashCode;
return servers.get(index);
}
}
5. 一致性哈希
这里将我们前面实现的一致性哈希,与负载均衡结合。
public class LoadBalanceConsistentHash extends AbstractLoadBalanceHash {
/**
* 一致性 hash 实现
* @since 0.0.1
*/
private final IConsistentHashing<IServer> consistentHashing;
public LoadBalanceConsistentHash(List<IServer> servers, IHash hash) {
super(servers, hash);
this.consistentHashing = ConsistentHashingBs
.<IServer>newInstance()
.hash(hash)
.nodes(servers)
.build();
}
@Override
protected IServer doSelect(ILoadBalanceContext context) {
final String hashKey = context.hashKey();
return consistentHashing.get(hashKey);
}
}
后期 Road-Map
还有基于系统最小压力,最小连接的实现,暂时没有放在这里。
后续将加入对应的实现。
完整开源代码
其他还有一些引导类等辅助工具。
完整代码参见 load-balance

【分布式】load balance 04-java 从零手写实现负载均衡的更多相关文章
- Neutron: Load Balance as a Service(LBaaS)负载均衡
load balancer 负责监听外部的连接,并将连接分发到 pool member. LBaaS 有三个主要的概念: Pool Member,Pool 和 Virtual IP Pool M ...
- Azure Load Balancer(二) 基于内部的负载均衡来转发为访问请求
一,引言 上一节,我们使用 Azure Load Balancer 类型为外部的,来转发我们的 Web 服务.今天我们看看另一种类型为 “Internal” 的 Azure Load Balancer ...
- 分布式的几件小事(四)dubbo负载均衡策略和集群容错策略
1.dubbo负载均衡策略 ①random loadbalance 策略 默认情况下,dubbo是random loadbalance 随机调用实现负载均衡,可以对provider不同实例设置不同的权 ...
- 【mq】从零开始实现 mq-07-负载均衡 load balance
前景回顾 [mq]从零开始实现 mq-01-生产者.消费者启动 [mq]从零开始实现 mq-02-如何实现生产者调用消费者? [mq]从零开始实现 mq-03-引入 broker 中间人 [mq]从零 ...
- OpenStack Neutron 之 Load Balance
OpenStack Neutron 之 Load Balance 负载均衡(Load Balance)是 OpenStack Neutron 支持的功能之一.负载均衡能够将网络请求分发到多个实际处理请 ...
- 章文嵩博士和他背后的负载均衡(LOAD BANLANCER)帝国
案首语: 阿里集团技术大牛,@正明,淘宝基础核心软件研发负责人.LVS创始人.阿里云首席科学家章文嵩博士从阿里离职,去追求技术人生另一段历程,让阿里像我一样的很多热爱技术的工程师都有一丝牵动和感触. ...
- 负载均衡的几种算法Java实现代码
轮询 package class2.zookeeper.loadbalance; import java.util.ArrayList; import java.util.HashMap; impor ...
- 负载均衡(Load Balancing)学习笔记(二)
概述 文章负载均衡(Load Balancing)学习笔记(一) 讲述了负载均衡的一般性原理,本文继续介绍常见的实现负载均衡的方法. HTTP重定向 HTTP重定向服务器是一台普通的Web服务器,用户 ...
- java 从零开始手写 RPC (04) -序列化
序列化 java 从零开始手写 RPC (01) 基于 socket 实现 java 从零开始手写 RPC (02)-netty4 实现客户端和服务端 java 从零开始手写 RPC (03) 如何实 ...
- Vertica7 Native Connection Load Balance
原文链接:Vertica7 Native Connection Load Balance 在Vertica7曾经的版本号中,Vertica是通过Linux的Virtual IP来实现连接的负载均衡的, ...
随机推荐
- 【Git】用法小记
解决windows环境下的CRLF与unix环境下的LF问题,windows提交时CRLF=>LF,签出时LF=>CRLF,unix环境保留 git config --global cor ...
- SpringBoot - 阿里云OSS - 上传和删除
1,首先在 pom.xml 中加入maven依赖 <!-- 阿里云oss --> <dependency> <groupId>com.aliyun.oss</ ...
- [转帖]使用 goofys 挂载 S3 bucket 为文件系统
https://xie.infoq.cn/article/7f178e0a1315f758d77c6c2bb 背景 公司的 gitlab 目前都是直接存储在物理盘上,为了确保数据不会丢失,需要重复多次 ...
- [转帖]《Linux性能优化实战》笔记(七)—— CPU瓶颈快速分析及性能优化思路
相当于是前面篇章的小结 一. CPU 性能指标 常见指标包括: 平均负载 CPU 使用率(user.iowait.system.软硬中断等) 进程上下文切换(自愿.非自愿) CPU 缓存的命中率 CP ...
- [转帖]Redhat、CentOS添加静态路由的方法
https://www.diewufeiyang.com/post/1174.html 我们经常遇到需要在系统默认路由的基础上,额外添加静态路由的需求.为了使得下次系统启动这些静态路由依旧生效,我们可 ...
- [转帖]Skywalking介绍
https://www.jianshu.com/p/ffa7ddcda4ab 微服务架构已经是一个很通用的系统架构,常见的技术栈如下图所示,这张架构图基本涵括了当前微服务体系下的各种技术栈,可能不同的 ...
- [转帖]QPS 最高提升 91% | 腾讯云 TKE 基于 Cilium eBPF 提升 k8s Service 性能
https://my.oschina.net/cncf/blog/5121393 朱瑜坚,腾讯云后台工程师,主要负责腾讯云 TKE 容器网络的构建和相关网络组件的设计.开发和维护工作.张浩,腾讯云 ...
- rfc7230 Message Syntax and Routing
rfc7230 目录 rfc7230 2 Architecture 2.6 Protocol Versioning 3 Message Format 3.1 Start Line 3.1.1 Requ ...
- 大模型应用开发:为产品创建一个AI客服/智能助手
欢迎阅读本系列文章!我将带你一起探索如何使用OpenAI API来开发GPT应用.无论你是编程新手还是资深开发者,都能在这里获得灵感和收获. 本文将继续展示AI助手的开发方式,在OpenAPI中它的名 ...
- 如何减缓vm中慢插入的次数
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 偶然发现vm-storage的监控里有这样一个指标:vm_ ...