zoukankan      html  css  js  c++  java
  • 负载均衡的几种算法Java实现代码

    轮询:

     1 package class2.zookeeper.loadbalance;
     2 
     3 import java.util.ArrayList;
     4 import java.util.HashMap;
     5 import java.util.Map;
     6 import java.util.Set;
     7 
     8 /**
     9  * 負載均衡算法,輪詢法
    10  * @author guoy
    11  *
    12  */
    13 public class TestRoundRobin {
    14 
    15     
    16     static Map<String,Integer> serverWeigthMap  = new HashMap<String,Integer>();
    17 
    18      static{
    19         serverWeigthMap.put("192.168.1.12", 1);
    20         serverWeigthMap.put("192.168.1.13", 1);
    21         serverWeigthMap.put("192.168.1.14", 2);
    22         serverWeigthMap.put("192.168.1.15", 2);
    23         serverWeigthMap.put("192.168.1.16", 3);
    24         serverWeigthMap.put("192.168.1.17", 3);
    25         serverWeigthMap.put("192.168.1.18", 1);
    26         serverWeigthMap.put("192.168.1.19", 2);
    27     }
    28      Integer  pos = 0;
    29      public  String roundRobin()
    30         {
    31             //重新建立一個map,避免出現由於服務器上線和下線導致的並發問題
    32             Map<String,Integer> serverMap  = new HashMap<String,Integer>();
    33             serverMap.putAll(serverWeigthMap);
    34             //獲取ip列表list
    35             Set<String> keySet = serverMap.keySet();
    36             ArrayList<String> keyList = new ArrayList<String>();
    37             keyList.addAll(keySet);
    38             
    39             String server = null;
    40             
    41             synchronized (pos) {
    42                 if(pos >=keySet.size()){
    43                     pos = 0;
    44                 }
    45                 server = keyList.get(pos);
    46                 pos ++;
    47             }
    48             return server;
    49         }
    50         
    51         public static void main(String[] args) {
    52             TestRoundRobin robin = new TestRoundRobin();
    53             for (int i = 0; i < 20; i++) {
    54                 String serverIp = robin.roundRobin();
    55                 System.out.println(serverIp);
    56             }
    57         }
    58 }

    加权轮询:

     1 package class2.zookeeper.loadbalance;
     2 
     3 import java.util.ArrayList;
     4 import java.util.HashMap;
     5 import java.util.Iterator;
     6 import java.util.List;
     7 import java.util.Map;
     8 import java.util.Random;
     9 import java.util.Set;
    10 
    11 /**
    12  * 加權隨機载均衡算法
    13  * @author guoy
    14  *
    15  */
    16 public class TestWeightRandom {
    17     
    18     static Map<String,Integer> serverWeigthMap  = new HashMap<String,Integer>();
    19 
    20      static{
    21         serverWeigthMap.put("192.168.1.12", 1);
    22         serverWeigthMap.put("192.168.1.13", 1);
    23         serverWeigthMap.put("192.168.1.14", 2);
    24         serverWeigthMap.put("192.168.1.15", 2);
    25         serverWeigthMap.put("192.168.1.16", 3);
    26         serverWeigthMap.put("192.168.1.17", 3);
    27         serverWeigthMap.put("192.168.1.18", 1);
    28         serverWeigthMap.put("192.168.1.19", 2);
    29     }
    30 
    31     public static String weightRandom()
    32     {
    33         //重新建立一個map,避免出現由於服務器上線和下線導致的並發問題
    34         Map<String,Integer> serverMap  = new HashMap<String,Integer>();
    35         serverMap.putAll(serverWeigthMap);
    36         //獲取ip列表list
    37         Set<String> keySet = serverMap.keySet();
    38         Iterator<String> it = keySet.iterator();
    39 
    40         List<String> serverList = new ArrayList<String>();
    41 
    42         while (it.hasNext()) {
    43             String server = it.next();
    44             Integer weight = serverMap.get(server);
    45             for (int i = 0; i < weight; i++) {
    46                 serverList.add(server);
    47             }
    48         }        
    49         Random random = new Random();
    50         int randomPos = random.nextInt(serverList.size());
    51         
    52         String server = serverList.get(randomPos);
    53         return server;
    54     }
    55     
    56     public static void main(String[] args) {
    57         String serverIp = weightRandom();
    58         System.out.println(serverIp);
    59     }
    60 }

    随机:

     1 package class2.zookeeper.loadbalance;
     2 
     3 import java.util.ArrayList;
     4 import java.util.HashMap;
     5 import java.util.Map;
     6 import java.util.Random;
     7 import java.util.Set;
     8 
     9 /**
    10  * 隨機负载均衡算法
    11  * @author guoy
    12  *
    13  */
    14 public class TestRandom {
    15     
    16     static Map<String,Integer> serverWeigthMap  = new HashMap<String,Integer>();
    17 
    18      static{
    19         serverWeigthMap.put("192.168.1.12", 1);
    20         serverWeigthMap.put("192.168.1.13", 1);
    21         serverWeigthMap.put("192.168.1.14", 2);
    22         serverWeigthMap.put("192.168.1.15", 2);
    23         serverWeigthMap.put("192.168.1.16", 3);
    24         serverWeigthMap.put("192.168.1.17", 3);
    25         serverWeigthMap.put("192.168.1.18", 1);
    26         serverWeigthMap.put("192.168.1.19", 2);
    27     }
    28 
    29     public static String random()
    30     {
    31         //重新建立一個map,避免出現由於服務器上線和下線導致的並發問題
    32         Map<String,Integer> serverMap  = new HashMap<String,Integer>();
    33         serverMap.putAll(serverWeigthMap);
    34         //獲取ip列表list
    35         Set<String> keySet = serverMap.keySet();
    36         ArrayList<String> keyList = new ArrayList<String>();
    37         keyList.addAll(keySet);
    38         
    39         Random random = new Random();
    40         int randomPos = random.nextInt(keyList.size());
    41         
    42         String server = keyList.get(randomPos);
    43         return server;
    44     }
    45     
    46     public static void main(String[] args) {
    47         String serverIp = random();
    48         System.out.println(serverIp);
    49     }
    50 }

    加权随机:

     1 package class2.zookeeper.loadbalance;
     2 
     3 import java.util.ArrayList;
     4 import java.util.HashMap;
     5 import java.util.Iterator;
     6 import java.util.List;
     7 import java.util.Map;
     8 import java.util.Random;
     9 import java.util.Set;
    10 
    11 /**
    12  * 加權隨機载均衡算法
    13  * @author guoy
    14  *
    15  */
    16 public class TestWeightRandom {
    17     
    18     static Map<String,Integer> serverWeigthMap  = new HashMap<String,Integer>();
    19 
    20      static{
    21         serverWeigthMap.put("192.168.1.12", 1);
    22         serverWeigthMap.put("192.168.1.13", 1);
    23         serverWeigthMap.put("192.168.1.14", 2);
    24         serverWeigthMap.put("192.168.1.15", 2);
    25         serverWeigthMap.put("192.168.1.16", 3);
    26         serverWeigthMap.put("192.168.1.17", 3);
    27         serverWeigthMap.put("192.168.1.18", 1);
    28         serverWeigthMap.put("192.168.1.19", 2);
    29     }
    30 
    31     public static String weightRandom()
    32     {
    33         //重新建立一個map,避免出現由於服務器上線和下線導致的並發問題
    34         Map<String,Integer> serverMap  = new HashMap<String,Integer>();
    35         serverMap.putAll(serverWeigthMap);
    36         //獲取ip列表list
    37         Set<String> keySet = serverMap.keySet();
    38         Iterator<String> it = keySet.iterator();
    39 
    40         List<String> serverList = new ArrayList<String>();
    41 
    42         while (it.hasNext()) {
    43             String server = it.next();
    44             Integer weight = serverMap.get(server);
    45             for (int i = 0; i < weight; i++) {
    46                 serverList.add(server);
    47             }
    48         }        
    49         Random random = new Random();
    50         int randomPos = random.nextInt(serverList.size());
    51         
    52         String server = serverList.get(randomPos);
    53         return server;
    54     }
    55     
    56     public static void main(String[] args) {
    57         String serverIp = weightRandom();
    58         System.out.println(serverIp);
    59     }
    60 }

    ip hash:

     1 package class2.zookeeper.loadbalance;
     2 
     3 import java.util.ArrayList;
     4 import java.util.HashMap;
     5 import java.util.Map;
     6 import java.util.Set;
     7 
     8 /**
     9  * 负载均衡 ip_hash算法
    10  * @author guoy
    11  *
    12  */
    13 public class TestIpHash {
    14 
    15     
    16     static Map<String,Integer> serverWeigthMap  = new HashMap<String,Integer>();
    17 
    18      static{
    19         serverWeigthMap.put("192.168.1.12", 1);
    20         serverWeigthMap.put("192.168.1.13", 1);
    21         serverWeigthMap.put("192.168.1.14", 2);
    22         serverWeigthMap.put("192.168.1.15", 2);
    23         serverWeigthMap.put("192.168.1.16", 3);
    24         serverWeigthMap.put("192.168.1.17", 3);
    25         serverWeigthMap.put("192.168.1.18", 1);
    26         serverWeigthMap.put("192.168.1.19", 2);
    27     }
    28 
    29      /**
    30       * 获取请求服务器地址
    31       * @param remoteIp 负载均衡服务器ip
    32       * @return
    33       */
    34     public static String ipHash(String remoteIp)
    35     {
    36         //重新建立一個map,避免出現由於服務器上線和下線導致的並發問題
    37         Map<String,Integer> serverMap  = new HashMap<String,Integer>();
    38         serverMap.putAll(serverWeigthMap);
    39         //獲取ip列表list
    40         Set<String> keySet = serverMap.keySet();
    41         ArrayList<String> keyList = new ArrayList<String>();
    42         keyList.addAll(keySet);
    43         
    44         int hashCode =remoteIp.hashCode();
    45         int serverListSize = keyList.size();
    46         int serverPos = hashCode % serverListSize;
    47         
    48         return keyList.get(serverPos);
    49     }
    50     
    51     public static void main(String[] args) {
    52         String serverIp = ipHash("192.168.1.12");
    53         System.out.println(serverIp);
    54     }
    55 
    56 }
  • 相关阅读:
    Raft论文的一些问题
    乱序日志同步成员变更方案
    OceanBase RPC机制简要说明
    OceanBase server处理网络包的回调逻辑
    比较下OceanBase的选举协议和Raft的选举协议的区别
    TokuDB调研文档
    给MySQL官方提交的bug report备忘
    记录一个__lll_lock_wait_private错误
    关于MySQL redo log,挖些坑,慢慢填
    A little problem for pt-pmp
  • 原文地址:https://www.cnblogs.com/lr393993507/p/5702854.html
Copyright © 2011-2022 走看看