1。完全随机算法缺点:所有服务器的访问概率相同。包com.example.demo.core.random;导入java.util.Arrays;导入java.util.List;导入java.util.Random;/***负载均衡算法*完全随机算法*/publicclassRandomServer{publicstaticListlist=Arrays.asList("10.180.11.126:8888","10.180.11.128:8888","10.180.11.130:8888");静态随机随机=新随机();publicstaticStringgetServer(){intnumber=random.nextInt(list.size());返回list.get(number);}publicstaticvoidmain(String[]args){for(inti=0;i<15;i++){System.out.println(getServer());}}}2.加权随机算法场景:部分服务器性能较高,可以增加随机访问本服务器的可能性这里我建了一个前端学习交流群:132667127,最新的前端资料和进阶自己整理的开发教程。如果愿意,可以进群一起学习交流。缺点:权重低的服务器可能会长时间访问不到3packagecom.example.demo.core.random;导入java.util.*;/***负载均衡算法**如果某台服务器性能高,则设置访问权重高**加权随机算法*/publicclassWeightRandomServer{publicstaticMapmap=newHashMap<>();静止的{map.put("10.180.11.126:8888",2);map.put("10.180.11.128:8888",7);map.put("10.180.11.130:8888",1);}static随机random=newRandom();/***当权重设置太大时,列表容易爆裂*@return*/publicstaticStringgetServer(){Listlist=newArrayList<>();for(Map.Entryentry:map.entrySet()){//根据权重,决定加入多少次for(inti=0;ip).sum();intnumber=random.nextInt(weight);返回列表.get(number);}/***优化后*@return*/publicstaticStringgetServer1(){//计算总权重intweight=map.values().stream().mapToInt(p->p).sum();//随机一个随机数intindex=random.nextInt(weight);//遍历服务地图for(Map.Entryentry:map.entrySet()){//如果权重大于索引if(entry.getValue()>=index){//返回此服务returnentry.getKey();}//否则,index=当前索引-当前服务权重index=index-entry.getValue();}返回””;}publicstaticvoidmain(String[]args){for(inti=0;i<15;i++){//System.out.println(getServer());System.out.println(getServer1());}}}3.完全轮询算法的缺点:从头到尾轮询,不能根据服务器性能包com.example.demo.core.poll设置权重;导入java.util.Arrays;导入java.util.List;/***完整的轮询算法*/publicclassPollServer{publicstaticListlist=Arrays.asList("10.180.11.126:8888","10.180.11.128:8888","10.180.11.130:8888");静态整数索引;publicstaticStringgetServer(){if(index==list.size()){index=0;}返回list.get(index++);}发布icstaticvoidmain(String[]args){for(inti=0;i<15;i++){System.out.println(getServer());}}}4.weightedround-robin算法有点:可以性能设置访问权重的缺点:可能某台服务器权重大,执行时间长。当遇到一个耗时的请求时,压力会很大packagecom.example.demo.core.poll;导入java.util.HashMap;导入java。实用程序地图;/***weightedround-robinalgorithm*在实践中,一台服务器可能压力大,运行时间长*/publicclassWeightPollServer{publicstaticMapmap=newHashMap<>();static{map.put("10.180.11.126:8888",2);map.put("10.180.11.128:8888",7);map.put("10.180.11.130:8888",5);}静态整数索引;publicstaticStringgetServer(){intweight=map.values().stream().mapToInt(p->p).sum();intnumber=(index++)%重量;for(Map.Entryentry:map.entrySet()){if(entry.getValue()>=number){返回条目。获取密钥();}number=number-entry.getValue();}返回””;}publicstaticvoidmain(String[]args){for(inti=0;i<15;i++){System.out.println(getServer());}}}5.smoothweightedroundrobinalgorithm优点:按权重分配服务,同时保证权重低的服务可以接入机器包com.example.demo.core.smooth;/***平滑权重*/publicclassSmoothWeight{priv吃完体重;私人诠释当前重量;私有字符串地址;publicintgetWeight(){返回重量;}publicvoidsetWeight(intweight){this.weight=weight;}publicintgetCurrentWeight(){返回当前重量;}publicvoidsetCurrentWeight(intcurrentWeight){this.currentWeight=currentWeight;}publicStringgetAddress(){返回地址;}publicvoidsetAddress(Stringaddress){this.address=address;}publicSmoothWeight(intweight,intcurrentWeight,Stringaddress){this.weight=weight;this.currentWeight=currentWeight;this.address=地址;}}包com.example.demo.core.smooth;导入java.util.HashMap;导入java.util.Map;/***平滑轮询算法*/publicclassSmoothWeightPollServer{publicstaticMapmap=newHashMap<>();静态{map.put("10.180.11.126:8888",newSmoothWeight(5,5,"10.180.11.126:8888"));map.put("10.180.11.128:8888",newSmoothWeight(2,2,"10.180.11.128:8888"));map.put("10.180.11.130:8888",newSmoothWeight(4,4,"10.180.11.130:8888"));}publicstaticStringgetServer(){SmoothWeightmaxSmoothWeight=null;intweight=map.values().stream().mapToInt(SmoothWeight::getWeight).sum();for(Map.Entryentry:map.entrySet()){SmoothWeightcurrentSmoothWeight=entry.getValue();if(maxSmoothWeight==null||currentSmoothWeight.getCurrentWeight()>maxSmoothWeight.getCurrentWeight()){maxSmoothWeight=currentSmoothWeight;}}assertmaxSmoothWeight!=null;maxSmoothWeight.setCurrentWeight(maxSmoothWeight.getCurrentWeight()-weight);for(Map.Entryentry:map.entrySet()){SmoothWeight当前ntSmoothWeight=entry.getValue();currentSmoothWeight.setCurrentWeight(currentSmoothWeight.getCurrentWeight()+currentSmoothWeight.getWeight());}返回maxSmoothWeight.getAddress();}publicstaticvoidmain(String[]ifor0;i<15;i++){System.out.println(getServer());}}}6.哈希加载算法包com.example.demo.core.hash;导入java.util.Arrays;导入java。util.List;导入java.util.SortedMap;导入java.util.TreeMap;/***hashload算法*在集群环境下,让同一个用户的访问分布到固定的机器上*/publicclassHashServer{publicstaticListlist=Arrays.asList("10.180.11.126:8888","10.180.11.128:8888","10.180.11.130:8888");publicstaticStringgetServer(Stringclient){intnodeCount=40;TreeMaptreeMap=newTreeMap<>();for(Strings:list){for(inti=0;isortedMap=treeMap.tailMap(client.hashCode());整数firstHash=(sortedMap.size()>0)?sortedMap.firstKey():treeMap.firstKey();返回treeMap.get(firstHash);}publicstaticvoidmain(String[]args){for(inti=0;i<100;i++){System.out.println(getServer("用户:"+i+"访问"));}}}