文档章节

加权轮询 Java版

玩代码的小坏孩
 玩代码的小坏孩
发布于 2016/12/24 21:09
字数 349
阅读 44
收藏 2

Server

package com.hhdys.bean;

public class Server {
	private String name;
	private int weight;
	private int visitCount;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getWeight() {
		return weight;
	}
	public void setWeight(int weight) {
		this.weight = weight;
	}
	public Server(String name, int weight) {
		super();
		this.name = name;
		this.weight = weight;
		this.visitCount=weight;
	}
	public int getVisitCount() {
		return visitCount;
	}
	public void setVisitCount(int visitCount) {
		this.visitCount = visitCount;
	}
	
	

}

Main

package com.hhdys.test;

import java.util.ArrayList;
import java.util.List;

import com.hhdys.bean.Server;

public class LBTest {
	List<Server> servers=new ArrayList<>();
	int totalWeight=0;
	int gcd=0;
	int curServer=0;
	int curIndex=0;
	
	
	public LBTest() {
		super();
		Server server1=new Server("A", 4);
		Server server2=new Server("B", 2);
		Server server3=new Server("C", 3);
		Server server4=new Server("D", 4);
		servers.add(server1);
		servers.add(server2);
		servers.add(server3);
		servers.add(server4);
		setGcd();
		setTotalWeight();
	}
	
	private void setTotalWeight(){
		for(Server server : servers){
			this.totalWeight+=server.getWeight();
		}
		this.totalWeight/=this.gcd;
		System.out.println("total weight is "+this.totalWeight);
	}
	private int gcd(int x,int y){
		if(x<y){
			return gcd(y,x);
		}
		int result=x%y;
		if(result==0){
			return y; 
		}
		return gcd(y, result);
	}
	
	private void setGcd(){
		int tempGcd=0;
		for(Server server :servers){
			if(tempGcd==0){
				tempGcd=server.getWeight();
				continue;
			}else{
				tempGcd=gcd(tempGcd, server.getWeight());
			}
		}
		this.gcd=tempGcd;
		System.out.println("gcd is "+this.gcd);
	}

	public Server getServer(){
		int serversNum=servers.size();
		if(curIndex>=this.totalWeight){//超过一次轮询
			System.out.println("reset visit info===============");
			curIndex=0;
			curServer=0;
			for(Server server:servers){
				server.setVisitCount(server.getWeight());
			}
		}
		Server server=servers.get(curServer);
		if(judgeServerStatus(server)){
			dealSeleted(server);
			return server;
		}
		while (true) {//轮询到的机器不可用,自动轮询下一台机器
			this.curServer++;
			if(this.curServer>=serversNum){
				this.curServer=0;
			}
			server=servers.get(this.curServer);
			if(judgeServerStatus(server)){
				dealSeleted(server);
				return server;
			}
		}
	}
	
	private void dealSeleted(Server server){
		server.setVisitCount(server.getVisitCount()-this.gcd);
		this.curIndex++;
		this.curServer++;
		if(this.curServer>=servers.size()){
			this.curServer=0;
		}
	}
	
	private boolean judgeServerStatus(Server server){
		if(server==null){
			return false;
		}
		if(server.getVisitCount()>0){
			return true;
		}
		return false;
	}

	public static void main(String[] args){
		long time=System.currentTimeMillis();
		System.out.println("begin=======");
		LBTest test=new LBTest();
		for(int i=0;i<20;i++){
			Server server=test.getServer();
			System.out.println("the server is "+server.getName());
		}
		System.out.println("end========"+(System.currentTimeMillis()-time)/1000);
	}

}

© 著作权归作者所有

共有 人打赏支持
玩代码的小坏孩
粉丝 7
博文 38
码字总数 10422
作品 0
昌平
程序员
私信 提问
多种负载均衡算法及其Java代码实现【网络上较好的转载】

首先给大家介绍下什么是负载均衡(来自百科) 负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展 网络设备和 服务器的带宽、增加 吞吐量、加强网络数据处理能力、提高网...

stys352
2018/11/16
0
0
Sharding-JDBC — 读写分离(spring boot)

我们的项目,很多都涉及到了数据库的操作。数据库的稳定性显得尤为重要。互联网公司很多都采用“一主多从”的实现方案,我这里也不例外。这样可以大大减少主库的读压力,从而提高数据库性能!...

小王穷遊
2018/05/25
0
0
基于Ameoba实现mysql读写分离

一、Amoeba介绍 Amoeba:基于Java研发,配置文件xml文档。对事务支持功能很差,不支持分布式读,尤其不支持分布式事务。默认监听在8066端口上。2.2.x开始支持单库事务,没有缓存功能,所有请...

aha45
2018/06/29
0
0
PHP监控后台程序 生成进度条

// 这里的页面采用ajax轮询的方式 php获取java生成进度条文件。 //后台处理采用java 生成进度条文件。 后台监控如下: 启用了3个线程 几乎把服务器给榨干了。 [root@localhost wcms]# ps -e...

大灰狼wow
2014/04/10
0
0
什么是J2EE、Java SE、Java EE、Java ME?

目前,Java 2平台有3个版本,它们是适用于小型设备和智能卡的Java 2平台Micro版(Java 2 Platform Micro Edition,J2ME)、适用于桌面系统的Java 2平台标准版(Java 2 Platform Standard Ed...

Midnight
2010/12/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

spring aop学习

1.aop和spring aop的关系? aop是一种思想,spring aop是aop的一种实现。 2.Spring aop和AspectJ的关系? 这两种都是实现aop的,spring借助AspectJ的语法实现aop的功能 3.@AspectJ support和...

llsydn
28分钟前
2
0
OSChina 周六乱弹 —— 世界的源代码

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @小鱼丁 :#今日歌曲推荐# 分享Jason Mraz的单曲《Prettiest Friend (Demo)》: 《Prettiest Friend (Demo)》- Jason Mraz 手机党少年们想听歌...

小小编辑
今天
180
8
java框架学习日志-13(Mybatis基本概念和简单的例子)

在mybatis初次学习Mybatis的时候,遇到了很多问题,虽然阿里云的视频有教学,但是视频教学所使用的软件和我自己使用的软件不用,我自己用的数据库是oracle数据库,开发环境是idea。而且视频中...

白话
今天
13
0
Java基础:String、StringBuffer和StringBuilder的区别

1 String String:字符串常量,字符串长度不可变。Java中String是immutable(不可变)的。 String类的包含如下定义: /** The value is used for character storage. */private final cha...

watermelon11
今天
6
0
mogodb服务

部署MongoDB 官网: https://www.mongodb.com/download-center/community 创建mongo数据目录 mkdir /data/mongodb 二进制部署 wget -c https://fastdl.mongodb.org/linux/mongodb-linux-x8......

以谁为师
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部