最近公司做自己的网关去控制一些 请求相对应的服务 自己结合网上大神的思路跟自己总结了一下 写了一个简单的demo 

新手上路 大神勿喷


import java.math.BigInteger;
import java.util.*;/*** 随机 轮训 一致性哈希 算法*/
public class Algorithm {/*** 假设节点有三个*/private static List<String>  node =new ArrayList<>();/*** 加权轮训节点*/private static List<Map<String,Object>>  weightNode =new ArrayList<>();private static int currentIndex;private static int totalServer;private static int currentWeight;private static int maxWeight;private static int gcdWeight;//key表示服务器的hash值,value表示服务器private static SortedMap<Integer, String> sortedMap = new TreeMap<Integer, String>();static{//=============================node.add("192.168.1");node.add("192.168.2");node.add("192.168.3");//=============================Map<String,Object> map = new HashMap<>();map.put("ip","192.168.1");map.put("weight",5);weightNode.add(map);Map<String,Object> map1 = new HashMap<>();map1.put("ip","192.168.2");map1.put("weight",10);weightNode.add(map1);Map<String,Object> map2 = new HashMap<>();map2.put("ip","192.168.3");map2.put("weight",15);weightNode.add(map2);//=============================totalServer = node.size();currentIndex = totalServer - 1;maxWeight = maxWeight();gcdWeight = serverGcd();//=============================for (int i=0; i<node.size(); i++) {int hash = getHash(node.get(i));System.out.println("[" + node.get(i) + "]加入集合中, 其Hash值为" + hash);sortedMap.put(hash, node.get(i));}}//=============================/*** 随机算法*/public static void random(){//得到一共有多少个节点int nodeSize=node.size();Random ra =new Random();int i = ra.nextInt(nodeSize);System.out.println("随机下标为: "+i+" 获取节点为:"+ node.get(i));}//=============================/*** 普通轮训算法*/public static void loop(){currentIndex = (currentIndex + 1) % totalServer;System.out.println("轮训获取节点为:"+ node.get(currentIndex));}//=============================/*** 加权轮训算法*/public  static void round() {while (true) {currentIndex = (currentIndex + 1) % totalServer;if (currentIndex == 0) {currentWeight = currentWeight - gcdWeight;if (currentWeight <= 0) {currentWeight = maxWeight;if(currentWeight == 0) {System.out.println("currentWeight==0");break;}}}if(Integer.parseInt(weightNode.get(currentIndex).get("weight").toString()) >= currentWeight) {System.out.println("加权轮训获取节点为:"+ weightNode.get(currentIndex));break;}}}/*** 返回所有服务器的权重的最大公约数** @return*/private static int serverGcd() {int comDivisor = 0;for (int i = 0; i < totalServer - 1; i++) {if (comDivisor == 0) {//我只是图个方便用的map 大家可以封装一个类comDivisor = gcd(Integer.parseInt(weightNode.get(i).get("weight").toString()), Integer.parseInt(weightNode.get(i + 1).get("weight").toString()));} else {comDivisor = gcd(comDivisor, Integer.parseInt(weightNode.get(i + 1).get("weight").toString()));}}return comDivisor;}/*** 获得服务器中的最大权重** @return*/private static int maxWeight() {int max =Integer.parseInt( weightNode.get(0).get("weight").toString());int tmp;for (int i = 1; i < totalServer; i++) {tmp =Integer.parseInt(weightNode.get(i).get("weight").toString());if (max < tmp) {max = tmp;}}return max;}/*** 求两个数的最大公约数 4和6最大公约数是2** @param num1* @param num2* @return*/private static int gcd(int num1, int num2) {BigInteger i1 = new BigInteger(String.valueOf(num1));BigInteger i2 = new BigInteger(String.valueOf(num2));return i1.gcd(i2).intValue();}//=============================//使用FNV1_32_HASH算法计算服务器的Hash值,这里不使用重写hashCode的方法,最终效果没区别private static int getHash(String str) {final int p = 16777619;int hash = (int) 2166136261L;for (int i = 0; i < str.length(); i++){hash = (hash ^ str.charAt(i)) * p;}hash += hash << 13;hash ^= hash >> 7;hash += hash << 3;hash ^= hash >> 17;hash += hash << 5;// 如果算出来的值为负数则取其绝对值if (hash < 0) {hash = Math.abs(hash);}return hash;}//得到应当路由到的结点private static String getServer(String key) {//得到该key的hash值int hash = getHash(key);//得到大于该Hash值的所有MapSortedMap<Integer, String> subMap = sortedMap.tailMap(hash);if(subMap.isEmpty()){//如果没有比该key的hash值大的,则从第一个node开始Integer i = sortedMap.firstKey();//返回对应的服务器return sortedMap.get(i);}else{//第一个Key就是顺时针过去离node最近的那个结点Integer i = subMap.firstKey();//返回对应的服务器return subMap.get(i);}}/*** 一致性哈希*/public  static void consistentHashing(){String[] keys = {"张三的查询请求", "李四的修改请求", "王五的删除请求","赵六的新增请求"};for(int i=0; i<keys.length; i++){System.out.println("[" + keys[i] + "]的hash值为" +getHash(keys[i]) + ", 被路由到结点[" + getServer(keys[i]) + "]");}}public static void main(String[] args) {for (int i = 0; i <10 ; i++) {//随机//random();//轮训// loop();//加权轮训//round();//一致性哈希// consistentHashing();}}}

复制我的代码跑一下吧~

springboot 实现随机 轮训 加权轮训 一致性哈希 算法相关推荐

  1. 16 张图解带你掌握一致性哈希算法

    摘要:一致性哈希是什么,使用场景,解决了什么问题? 本文分享自华为云社区<16 张图解 | 一致性哈希算法>,作者:小林coding. 如何分配请求? 大多数网站背后肯定不是只有一台服务器 ...

  2. 算法高级(24)-一致性哈希算法在分布式系统中的使用场景

    本文将会从实际应用场景出发,介绍一致性哈希算法(Consistent Hashing)及其在分布式系统中的应用. 一.一致性Hash算法背景 一致性哈希算法在1997年由麻省理工学院的Karger等人 ...

  3. 面试时遇到一致性哈希算法这样回答会让面试官眼前一亮

    [CSDN 编者按]很多人都知道什么是哈希函数,在后端面试和开发中会遇到"一致性哈希",那什么是一致性哈希呢,当面试官问到你又该如何给出漂亮的回答. 作者 | 丁威       责 ...

  4. 哈希分布与一致性哈希算法简介

    前言 在我们的日常web应用开发当中memcached可以算作是当今的标准开发配置了.相信memcache的基本原理大家也都了解过了,memcache虽然是分布式的应用服务,但分布的原则是由clien ...

  5. 一致性哈希算法以及其PHP实现

    在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括:  轮循算法(Round Robin).哈希算法(HASH).最少连接算法(Least Connection).响应速度算法(Respons ...

  6. 一致性哈希算法及其在分布式系统中的应用

    摘要 本文将会从实际应用场景出发,介绍一致性哈希算法(Consistent Hashing)及其在分布式系统中的应用.首先本文会描述一个在日常开发中经常会遇到的问题场景,借此介绍一致性哈希算法以及这个 ...

  7. java 取绝对值_Java实现一致性哈希算法,并搭建环境测试其负载均衡特性

    实现负载均衡是后端领域一个重要的话题,一致性哈希算法是实现服务器负载均衡的方法之一,你很可能已在一些远程服务框架中使用过它.下面我们尝试一下自己实现一致性哈希算法. 一. 简述一致性哈希算法 这里不详 ...

  8. 一文搞懂负载均衡中的一致性哈希算法

    一致性哈希算法在很多领域有应用,例如分布式缓存领域的 MemCache,Redis,负载均衡领域的 Nginx,各类 RPC 框架.不同领域场景不同,需要顾及的因素也有所差异,本文主要讨论在负载均衡中 ...

  9. 白话解析:一致性哈希算法 consistent hashing

    在了解一致性哈希算法之前,最好先了解一下缓存中的一个应用场景,了解了这个应用场景之后,再来理解一致性哈希算法,就容易多了,也更能体现出一致性哈希算法的优点,那么,我们先来描述一下这个经典的分布式缓存的 ...

最新文章

  1. Robosense 32线lidar ——SLAM
  2. [20150113]关于oracle的存储结构.txt
  3. 华为MSTP配置教程(二)
  4. scrapy提取数据
  5. Android中Toast的用法简介
  6. Wi-Fi速度慢的十个原因以及解决办法
  7. linux数据流重定向
  8. ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第二篇:第一个页面
  9. jpa jsf_完整的Web应用程序Tomcat JSF Primefaces JPA Hibernate –第1部分
  10. Checkpointing
  11. CST,CET,UTC,GMT,DST,Unix时间戳几种常见时间概述与关系(转)
  12. Android局域网工具,NetX(局域网管理工具)
  13. python word 公式转png图片处理方式
  14. 关于 Android 的 OMA DRM 验证
  15. wdcp虚拟主机管理系统注入漏洞
  16. 【微信小程序开发】(一)开发环境和小程序公众号申请
  17. linux 内存告警门限,H3C LA系列无线网关 配置指导(V7)-R0304-6W100_基础配置指导_设备管理配置-新华三集团-H3C...
  18. java开发工程师转大数据,一招彻底弄懂!
  19. 如何卸载Oracle数据库
  20. keep-alive上加v-if导致缓存失效

热门文章

  1. 自学自动化遇到的问题
  2. 02-链表结构(Linked list)
  3. android shape 画虚线
  4. 面试时被问:为什么裁员只裁你,不裁别人,该怎么回答?
  5. 路径规划的最优控制Matlab代码分享
  6. 如何使用DPA华为备份一体机备份达梦数据库
  7. Postman入门到入土
  8. 盒子模型、div盒子、边框粗细、外边距
  9. 复杂的事情简单做,简单的事情重复做,重复的事情用心做!
  10. 爱好-文化-冢:象冢