负载均衡系列专题

01-负载均衡基础知识

02-一致性 hash 原理

03-一致性哈希算法 java 实现

04-负载均衡算法 java 实现

本节我们来看一下如何实现一个一致性 hash 框架。

源码

普通 hash

我们首先定义一下 hash 接口,以及最简单的 jdk 实现:

  • IHash
public interface IHash {

    /**
* 计算 hash 值
* @param text 文本
* @return 结果
* @since 0.0.1
*/
int hash(String text); }
  • HashJdk.java
public class HashJdk implements IHash {

    @Override
public int hash(String text) {
return text.hashCode();
} }

Node 定义

用来定义一个节点:

此处省略了一些方法。

public class Node {

    /**
* 节点名称
* @since 0.0.1
*/
private String name; /**
* 节点 ip
* @since 0.0.1
*/
private String ip; public Node(String name, String ip) {
this.name = name;
this.ip = ip;
} public Node(String ip) {
this(ip, ip);
} //Getter & Setter & toString()
// equals && hashCode
}

核心实现

  • IConsistentHashing.java

一致性 hash 的接口定义。

public interface IConsistentHashing {

    /**
* 获取对应的节点
* @param key key
* @return 节点
* @since 0.0.1
*/
Node get(final String key); /**
* 添加节点
* @param node 节点
* @return this
* @since 0.0.1
*/
IConsistentHashing add(final Node node); /**
* 移除节点
* @param node 节点
* @return this
* @since 0.0.1
*/
IConsistentHashing remove(final Node node); /**
* 获取节点信息
* @return 节点
* @since 0.0.1
*/
Map<Integer, Node> nodeMap(); }
  • 默认实现
public class ConsistentHashing implements IConsistentHashing {

    /**
* 虚拟节点数量
* @since 0.0.1
*/
private final int virtualNum; /**
* hash 策略
* @since 0.0.1
*/
private final IHash hash; /**
* node map 节点信息
*
* key: 节点 hash
* Node: 节点
* @since 0.0.1
*/
private final TreeMap<Integer, Node> nodeMap = new TreeMap<>(); public ConsistentHashing(int virtualNum, IHash hash) {
this.virtualNum = virtualNum;
this.hash = hash;
} /**
* 沿环的顺时针找到虚拟节点
* @param key key
* @return 结果
* @since 0.0.1
*/
@Override
public Node get(String key) {
final int hashCode = hash.hash(key);
Integer target = hashCode; // 不包含时候的处理
if (!nodeMap.containsKey(hashCode)) {
target = nodeMap.ceilingKey(hashCode);
if (target == null && !nodeMap.isEmpty()) {
target = nodeMap.firstKey();
}
}
return nodeMap.get(target);
} @Override
public IConsistentHashing add(Node node) {
// 初始化虚拟节点
for (int i = 0; i < virtualNum; i++) {
int nodeKey = hash.hash(node.toString() + "-" + i);
nodeMap.put(nodeKey, node);
} return this;
} @Override
public IConsistentHashing remove(Node node) {
// 移除虚拟节点
// 其实这里有一个问题,如果存在 hash 冲突,直接移除会不会不够严谨?
for (int i = 0; i < virtualNum; i++) {
int nodeKey = hash.hash(node.toString() + "-" + i);
nodeMap.remove(nodeKey);
} return this;
} @Override
public Map<Integer, Node> nodeMap() {
return Collections.unmodifiableMap(this.nodeMap);
} }

完整代码

其他还有一些引导类等辅助工具。

完整代码参见 github

参考资料

consistent-hashing-redis

consistent-hash-algorithm

ConsistentHash

一致性hash的JAVA实现

【分布式】load balance 03-一致性哈希算法 java 实现的更多相关文章

  1. 分布式_理论_08_Consistent Hash(一致性哈希算法)

    一.前言 五.参考资料 1.分布式理论(八)—— Consistent Hash(一致性哈希算法)

  2. memcached分布式一致性哈希算法

    <span style="font-family: FangSong_GB2312; background-color: rgb(255, 255, 255);">如果 ...

  3. 一致性哈希算法(Consistent Hashing) .

    应用场景 这里我先描述一个极其简单的业务场景:用4台Cache服务器缓存所有Object. 那么我将如何把一个Object映射至对应的Cache服务器呢?最简单的方法设置缓存规则:object.has ...

  4. 五分钟理解一致性哈希算法(consistent hashing)

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法 ...

  5. 每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179     一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT) ...

  6. 一致性哈希算法(consistent hashing)【转】

    一致性哈希算法 来自:http://blog.csdn.net/cywosp/article/details/23397179       一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希 ...

  7. 一致性哈希算法原理及Java实现

     一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简 单 ...

  8. 一致性哈希算法(consistent hashing)(转)

    原文链接:每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)  一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网 ...

  9. hash环/consistent hashing一致性哈希算法

        一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的 ...

  10. 一致性哈希算法(consistent hashing)(转载)

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179     一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT) ...

随机推荐

  1. 【C++】类概念及使用

    类定义中不允许对数据成员初始化 类外只能访问公有部分 类成员必须指定访问属性 类的成员函数是实现对封装的数据成员进行操作的唯一途径 类定义中不允许定义本类对象,因无法预知大小 类与结构形式相同,唯一区 ...

  2. Vue - 父子级的相互调用

    父级调用子级 父级: <script> this.$refs.child.load(); 或 this.$refs.one.load(); </script> 子级: < ...

  3. UEditor 添加在线管理图片删除功能 (转载)

    第一,需要添加一个 php 文件来实现删除功能,文件添加到: ueditor\php\action_delete.php 代码内容: <?php /*---------------------- ...

  4. SQL联结

    1联结 那我们又该如何创建联结呢? So easy! 规定要联结的所有表以及它们如何关联就可以了. 在设置关联条件时,为避免不同表被引用的列名相同,我们需要使用完全限定列名(用一个点分隔表名和列名), ...

  5. Docker-02应用部署案例

    1.Docker部署mysql 拉取mysql镜像 # 查询mysql镜像 docker search mysql # 拉取镜像命令 docker pull centos/mysql-57-cento ...

  6. [转帖]Java 获取 Kafka 指定 topic 的消息总量

     发表于 2020-11-29  分类于 Java , Apache , JavaClass , Kafka  Valine: 0 Kafka Consumer API Kafka 提供了两套 API ...

  7. [转帖] 在Linux上查看活跃线程数与连接数

    https://www.cnblogs.com/codelogs/p/17178675.html   原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,非公众号转载保留此声明. 简介# 现 ...

  8. [转帖]HotSpot 虚拟机对象探秘

    https://www.cnblogs.com/xiaojiesir/p/15593092.html 对象的创建 一个对象创建的时候,到底是在堆上分配,还是在栈上分配呢?这和两个方面有关:对象的类型和 ...

  9. BPF的简单学习

    BPF的简单学习 前言 本来规划过年期间学习一下bpf相关的内容 但是因为自己没有坚持学习,所以到最后一天才开始整理. 本来想深入学习一下相关内容,但是已经感觉已经无法完成. 最近大半年进行了很多性能 ...

  10. 行云部署成长之路--慢SQL优化之旅 | 京东云技术团队

    ​ 当项目的SQL查询慢得像蜗牛爬行时,用户的耐心也在一点点被消耗,作为研发,我们可不想看到这样的事.这篇文章将结合行云部署项目的实践经验,带你走进SQL优化的奇妙世界,一起探索如何让那些龟速的查询飞 ...