负载均衡之随机法

​ 负载均衡(LoadBalance),它的职责是将网络请求,或者其他形式的负载“均摊”到不同的机器上。避免集群中部分服务器压力过大,而另一些服务器比较空闲的情况。通过负载均衡,可以让每台服务器获取到适合自己处理能力的请求。

​ 常见的负载均衡的实现方法有多种,如随机、轮询、hash一致性等。本文使用随机法实现负载均衡。

​ 随机数法就是几个数中随机获取一个数字,然后获取这个数据对应的服务器。

/**
 * 服务器类
 */
public class Server {
	
	private String serverName;
	
	public Server(String name) {
		this.serverName = name;
	}
	
	public String getServerName() {
		return serverName;
	}
	public void setServerName(String serverName) {
		this.serverName = serverName;
	}

	@Override
	public String toString() {
		return "Server{serverName:"+this.getServerName()+"}";
	}
}
public class LoadBalance_Random {
	//用来存放所有的服务器
	static List<Server> ServerList = new ArrayList<Server>();
	//随机数生成器
	private static final Random r = new Random();
	
	//初始化   模拟集群中提供服务的服务器
	static{
		Server server1 = new Server("server1");
		Server server2 = new Server("server2");
		Server server3 = new Server("server3");
		ServerList.add(server1);
		ServerList.add(server2);
		ServerList.add(server3);
	}
	
	public static void main(String[] args) {
		//模拟10个请求来获取对应的服务器
		for(int i=0;i<10;i++){
			Server server_random = doSelect(ServerList);
			System.out.println(server_random);
		}
	}

	/**
	 * 选择服务器
	 * @param serverList
	 * @return
	 */
	private static Server doSelect(List<Server> serverList) {
		Server server = null;
		//服务器的个数
		int serverNum = serverList.size();
		//随机获取一个
		int serverIndex = r.nextInt(serverNum);
		server = serverList.get(serverIndex);
		return server;
	}
}

​ 执行main方法测试,结果如下:

在这里插入图片描述

​ 在每台服务器的配置性能等各方面都一样时,使用这种随机方法也是可取的,因为每台服务器获取的要处理的请求的数据量的概率是一样的。但是有时候,我们的服务器不一定都是相同的配置,每一台服务器的性能都有一定的差异性,导致服务器提供服务的能力的差异,比如上边我们有3台服务器,Server1每秒可处理5个请求,Server2每秒只能处理3个请求,Server3每秒只能处理2个请求,此时如果我们有10个请求过来了,我们分别给3个Server3个请求处理,由于Server3只能处理2个请求,这时就会导致服务3不可用。

​ 对这种不同服务能力的服务实现负载均衡,我们可以使用加权随机法。对每个服务标记权重,提高处理能力强的服务器的权重,降低服务能力若的服务器的权重,即根据能力的大小分配对应比例的请求数。

​ 修改上述代码,给服务加权重

/**
 * 服务器类
 */
public class Server {
	
	private String serverName;
	private int weight;//权重
	
	public Server(String name, int weight) {
		this.serverName = name;
		this.weight = weight;
	}
	
	@Override
	public String toString() {
		return "Server{serverName:"+this.getServerName()+",weight:"+this.getWeight()+"}";
	}
	
	// 省略getter 和 setter方法
}

​ 初始化时指定服务器的权重

	//初始化   模拟集群中提供服务的服务器
	static{
		Server server1 = new Server("server1", 5);
		Server server2 = new Server("server2", 3);
		Server server3 = new Server("server3", 2);
		ServerList.add(server1);
		ServerList.add(server2);
		ServerList.add(server3);
	}

​ 根据权重值获取服务

private static Server doSelectWithWeight(List<Server> serverList) {
		Server server = null;
		int totalWeight = 0; //所有服务器的总权重
		boolean isSame = true;//默认所有服务器的权重都相同
		
		for(int i=0; i<serverList.size(); i++){
			//获取当前服务器得权重
			int serverWeight = serverList.get(i).getWeight();
			//权重累加
			totalWeight = totalWeight + serverWeight;
			//i = 0时默认还是权重都一样
			//从第二个开始检测每个服务器得权重是不是都一样,只需要与它得前一个服务得权重相比就可以了
			if(isSame && i>0){
				int preServerWeight = serverList.get(i-1).getWeight();
				if(serverWeight != preServerWeight){//当前服务器权重和前一个服务器得权重不相同
					isSame = false;
				}
			}
		}
		
		if(!isSame){//服务器得权重不是都一样
			//在总权重下获取一个随机数 
			int index = r.nextInt(totalWeight);
			//
			for(int i=0;i<serverList.size();i++){
				int serverWeight = serverList.get(i).getWeight();
				//判断获取得随机数落在总权重得哪一个区间
				//3台服务器得得权重分别为5 3 2  总和为10  [0到5)这个区间属于服务器1  [5到8)这个区间属于服务器2 【8到10)这个区间属于服务器3
				//如 获取到得随机数是6  6-5=1   大于0  说明不在服务器1得区间,遍历  1-3= -2 小于0  说明它落在了服务器2所在得区间  就可以得对应服务器
				index = index - serverWeight;
				if(index < 0){
					return serverList.get(i);
				}
			}
		}else{
			//所有服务器权重都一样时,按照完全随机法随机获取一个服务器
			server = doSelect(serverList);
		}
		return server;
	}

​ 使用main方法测试

public static void main(String[] args) {
		//模拟20个请求获取对应的服务
		for(int i=0;i<20;i++){
			Server server_random_weight = doSelectWithWeight(ServerList);
			System.out.println(server_random_weight);
		}
	}

测试结果如下

在这里插入图片描述

从测试结果图中可以看到,权重大的获取到的请求数多,相反权重小的获取到的请求数越小。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值