当前位置: 首页 > 科技观察

Java进阶深入理解负载均衡的五种算法实现原理_0

时间:2023-03-20 02:17:03 科技观察

本文转载自微信公众号《Android开发编程》,作者Android开发编程。转载本文请联系Android开发编程公众号。前言什么是负载均衡:是指由多台服务器对称组成的一组服务器。每台服务器的地位相当,可以独立对外提供服务,无需其他服务器的辅助。通过一定的负载分担技术,将外界发来的请求以对称结构均匀分布到某台服务器上,接收请求的服务器独立响应客户端的请求。负载均衡可以将客户的请求均匀分布到服务器阵列上,从而提供对重要数据的快速访问,解决大量并发访问的服务问题。这种集群技术可以用最少的投资获得接近大型主机的性能;今天我们就来说说;一、负载均衡算法介绍1、轮询方式将请求依次分发给后端服务器,它对后端的每台服务器都是均衡对待的,不考虑后端的实际连接数服务器和当前系统负载;2、随机方式通过系统的随机算法,根据后端服务器的列表大小值,随机选择其中一台服务器进行访问。根据概率统计理论,随着客户端调用服务器的次数越来越多,其实际效果越来越接近后端各服务器的调用平均分布,这是轮询的结果;3.源地址haXifa源地址哈希的思想是根据客户端的IP地址通过哈希函数计算得到一个值,用这个值对服务器列表的大小进行取模运算。序列号。源地址散列法用于负载均衡。对于IP地址相同的客户端,当后端服务器列表不变时,每次都会映射到同一台后端服务器进行访问;4.不同加权轮询方式的后端服务器可能有不同的机器配置和当前系统负载,因此它们的抗压能力也不同。给配置高、负载低的机器分配更高的权重,让它们处理更多的请求;给低配置、高负载的机器分配较低的权重,以降低其系统负载,加权轮询可以很好地工作5.加权随机法与加权轮询法相同,加权随机法也根据不同的权重分配不同的权重到后端机器的配置和系统的负载。不同的是它是根据权重随机请求后端服务器,而不是顺序;二、代码实现了五种负载均衡算法1、轮询方法importjava.util.*;importjava.util.concurrent.ConcurrentHashMap;publicclassTestRoundRobin{//1.定义map,key-ip,value-weightstaticMapipMap=newHashMap<>();static{ipMap.put("192.168.13.1",1);ipMap.put("192.168.13.2",1);ipMap.put("192.168.13.3",1);}  //Integersum=0;Integerpos=0;publicStringRoundRobin(){MapipServerMap=newConcurrentHashMap<>();ip服务器映射。putAll(ipMap);//2.取出key放入set中Setipset=ipServerMap.keySet();//3。设置到列表中,取出ArrayListiplist=newArrayList();iplist.addAll(ipset);StringserverName=null;//4。定义一个循环值,如果大于set,则从0开始synchronized(pos){if(pos>=ipset.size()){pos=0;}serverName=iplist.get(pos);//轮询+1pos++;}returnserverName;}publicstaticvoidmain(String[]args){TestRoundRobintestRoundRobin=newTestRoundRobin();for(inti=0;i<10;i++){StringserverIp=testRoundRobin.RoundRobin();System.out.println(serverIp);}}}2.加权轮询方法importjava.util.*;importjava.util.concurrent.ConcurrentHashMap;publicclassTestWeightRobin{//1.map,key-ip,value-weightstaticMapipMap=newHashMap<>();static{ipMap.put("192.168.13.1",1);ipMap.put("192.168.13.2",2);ipMap.put("192.168.13.3",4);}Integerpos=0;publicStringWeightRobin(){MapipServerMap=newConcurrentHashMap<>();ipServerMap.putAll(ipMap);SetipSet=ipServerMap.keySet();IteratoripIterator=ipSet.iterator();//定义一个list放所有serverArrayListipArrayList=newArrayList();//循环集合,根据到集合中的值,就可以知道map中的值,将其添加到列表Numberofservers对应的numberswhile(ipIterator.hasNext()){StringserverName=ipIterator.next();Integerweight=ipServerMap.get(serverName);for(inti=0;i=ipArrayList.size()){pos=0;}serverName=ipArrayList.get(pos);//投票+1pos++;returnserverName;}publicstaticvoidmain(String[]args){TestWeightRobintestWeightRobin=newTestWeightRobin();for(inti=0;i<10;i++){Stringserver=testWeightRobin.WeightRobin();System.out.println(server);}}}3.随机方法importjava.util.*;importjava.util.concurrent.ConcurrentHashMap;publicclassTestRandom{//1.定义map、key-ip、value-weightstaticMapipMap=newHashMap<>();static{ipMap.put("192.168.13.1",1);ipMap.put("192.168.13.2",2);ipMap.put("192.168.13.3",4);}publicStringRandom(){MapipServerMap=newConcurrentHashMap<>();ipServerMap.putAll(ipMap);SetipSet=ipServerMap.keySet();//定义一个列表放所有服务器ArrayListipArrayList=newArrayList();ipArrayList.addAll(ipSet);//循环随机数Randomrandom=newRandom();//随机数取(1-list.size)intpos=random.nextInt(ipArrayList.size());StringserverNameReturn=ipArrayList.得到(位置);返回服务器名称返回;}公共静态voidmain(String[]args){TestRandomtestRandom=newTestRandom();for(inti=0;i<10;i++){Stringserver=testRandom.Random();System.out.println(server);}}}4.加权随机importjava.util.*;importjava.util.concurrent.ConcurrentHashMap;publicclassTestRobinRandom{//1。定义map,key-ip,value-weightstaticMapipMap=newHashMap<>();static{ipMap.put("192.168.13.1",1);ipMap.put("192.168.13.2",2);ipMap.put("192.168.13.3",4);}publicStringRobinRandom(){MapipServerMap=newConcurrentHashMap<>();ipServerMap.putAll(ipMap);SetipSet=ipServerMap.keySet();IteratoripIterator=ipSet.iterator();//定义一个list放所有serverArrayListipArrayList=newArrayList();//循环set,根据set中的值,可以知道映射中的值,将相应数量的服务器添加到列表中while(ipIterator.hasNext()){StringserverName=ipIterator.next();Integerweight=ipServerMap.get(serverName);for(inti=0;iipMap=newHashMap<>();static{ipMap.put("192.168.13.1",1);ipMap.put("192.168.13.2",2);ipMap.put("192.168.13.3",4);}publicStringipHash(StringclientIP){MapipServerMap=newConcurrentHashMap<>();ipServerMap.putAll(ipMap);//2.取出key放入setSetipset=ipServerMap.keySet();//3.set放在list中,需要循环list取出ArrayList;iplist=newArrayList();iplist.addAll(ipset);//取ip的hashcode值的余数,同理inthashCode=clientIP.hashCode();intserverListsize=iplist.size();intpos=hashCode%serverListsize;returniplist.get(pos);}publicstaticvoidmain(String[]args){ipHashiphash=newipHash();Stringservername=iphash.ipHash("192.168.21.2");System.out.println(servername);}}综上所述,不进则退,大家一起努力吧!