书中代码-自己写写测试

package com.fenghao.loadbalancing;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;

import org.junit.Test;

/**
 *
 * <P>负载均衡算法简单写</P>
 * @ClassName: loadTest
 * @author 冯浩  2016年11月9日 上午9:12:49
 * @see TODO
 */
public class loadTest {
	private final Map<String,Integer> serverWeightMap=new HashMap<String,Integer>();

	public loadTest(){
		serverWeightMap.put("192.168.1.100", 1);
		serverWeightMap.put("192.168.1.101", 1);
		serverWeightMap.put("192.168.1.102", 4);
		serverWeightMap.put("192.168.1.103", 1);
		serverWeightMap.put("192.168.1.104", 1);
		serverWeightMap.put("192.168.1.105", 3);
		serverWeightMap.put("192.168.1.106", 1);
		serverWeightMap.put("192.168.1.107", 2);
		serverWeightMap.put("192.168.1.108", 1);
		serverWeightMap.put("192.168.1.109", 1);
		serverWeightMap.put("192.168.1.110", 1);
	}

	@Test
	public void Test(){
		int le=4;
//		roundRobinTest(le);
		RandomTest();
	}

	/**
	 *
	 * <p>Title: roundRobinTest</p>
	 * <p>轮询</p>
	 * @param pos
	 * @return
	 * @author 冯浩  2016年11月9日 下午7:41:52
	 */
	public String roundRobinTest(Integer pos){
		Map<String,Integer> serverMap=new HashMap<String,Integer>();
		serverMap.putAll(serverWeightMap);

		Set<String> keySet = serverMap.keySet();
		ArrayList<String> keylist=new ArrayList<String>();
		keylist.addAll(keySet);

		String server=null;
		synchronized (pos) {
			if(pos>=keySet.size()){
				pos=0;
			}
			server=keylist.get(pos);
			pos++;
			System.out.println("\npos is "+pos);
		}
		System.out.println("\nserver is "+server);
		return server;
	}

	/**
	 *
	 * <p>Title: RandomTest</p>
	 * <p>随机法</p>
	 * @return
	 * @author 冯浩  2016年11月9日 下午7:49:24
	 */
	public String RandomTest(){
		Map<String,Integer> serverMap=new HashMap<String,Integer>();
		serverMap.putAll(serverWeightMap);

		Set<String> keySet = serverMap.keySet();
		ArrayList<String> keyList=new ArrayList<String>();
		keyList.addAll(keySet);

		Random random=new Random();
		int pos = random.nextInt(keyList.size());
		System.out.println("\npos is "+pos);
		String server = keyList.get(pos);
		System.out.println("\nserver is "+server);
		return server;
	}

	/**
	 *
	 * <p>Title: HashTest</p>
	 * <p>源地址Hash法</p>
	 * @author 冯浩  2016年11月10日 上午8:46:43
	 */
	public String HashTest(String remoteip){
		Map<String,Integer> serverMap=new HashMap<String,Integer>();
		serverMap.putAll(serverWeightMap);

		Set<String> keySet = serverMap.keySet();
		ArrayList<String> keyList=new ArrayList<String>();
		keyList.addAll(keySet);

		int hashCode = remoteip.hashCode();
		int size = keyList.size();
		int pos=hashCode % size;
		System.out.println("\npos is "+pos);
		return keyList.get(pos);

	}

	/**
	 *
	 * <p>Title: weightRoundRobin</p>
	 * <p>加权轮询法</p>
	 * @return
	 * @author 冯浩  2016年11月10日 上午8:57:32
	 */
	public String weightRoundRobin(Integer pos){
		Map<String,Integer> serverMap=new HashMap<String,Integer>();
		serverMap.putAll(serverWeightMap);

		Set<String> keySet = serverMap.keySet();
		Iterator<String> it = keySet.iterator();

		List<String> serverList=new ArrayList<String>();

		while(it.hasNext()){
			String server=it.next();
			Integer weight = serverMap.get(server);
			for (int i = 0; i <weight ; i++) {
				serverList.add(server);
			}
		}

		String server=null;

		synchronized (pos) {
			if(pos>=serverList.size()){
				pos=0;
			}
			server=serverList.get(pos);
			pos++;
		}
		return server;
	}

	/**
	 *
	 * <p>Title: WeightRandom</p>
	 * <p>加权随机法</p>
	 * @return
	 * @author 冯浩  2016年11月11日 上午8:43:33
	 */
	public String WeightRandom(){
		Map<String,Integer> serverMap=new HashMap<String,Integer>();
		serverMap.putAll(serverWeightMap);

		Set<String> keySet = serverMap.keySet();
		Iterator<String> it = keySet.iterator();

		List<String> serverList=new ArrayList<String>();

		while(it.hasNext()){
			String server = it.next();
			Integer weight = serverMap.get(server);
			for (int i = 0; i < weight; i++) {
				serverList.add(server);
			}
		}

		Random random=new Random();
		int randomPos = random.nextInt(serverList.size());
		String server = serverList.get(randomPos);
		return server;
	}
}
时间: 2024-10-10 01:16:08

书中代码-自己写写测试的相关文章

学习PHP精粹,编写高效PHP代码之自动测试

如果要制造出完美的产品,必须对它进行全方面检验测试.这里有几种类型的测试,每一种测试都针对应用程序的某个具体方面. 本文将对单元测试.数据库测试.系统测试.负载测试进行介绍. 一.单元测试 单元测试是测试应用程序的每一步,要确保其各个组成部分运转正常.若没有单元测试,在应用程序中找出导致错误运行的原因一般来说相当困难. 单元测试通常采用一个单元测试框架,它提供了编写和运行测试并输出结果所需要的基本结构. 一些较为常用的单元测试框架包括: PHPUnit:http://phpunit.de/ Si

《GPU高性能编程CUDA实战》中代码整理

CUDA架构专门为GPU计算设计了一种全新的模块,目的是减轻早期GPU计算中存在的一些限制,而正是这些限制使得之前的GPU在通用计算中没有得到广泛的应用. 使用CUDA C来编写代码的前提条件包括:(1).支持CUDA的图形处理器,即由NVIDIA推出的GPU显卡,要求显存超过256MB:(2).NVIDIA设备驱动程序,用于实现应用程序与支持CUDA的硬件之间的通信,确保安装最新的驱动程序,注意选择与开发环境相符的图形卡和操作系统:(3).CUDA开发工具箱即CUDA Toolkit,此工具箱

每周一书《代码整洁之道》分享

内容简介 <代码整洁之道>讲述了一系列行之有效的整洁代码操作实践.软件质量,不但依赖于架构及项目管理,而且与代码质量紧密相关.这一点,无论是敏捷开发流派还是传统开发流派,都不得不承认.本书提出一种观念:代码质量与其整洁度成正比.干净的代码,既在质量上较为可靠,也为后期维护.升级奠定了良好基础.作为编程领域的佼佼者,本书作者给出了一系列行之有效的整洁代码操作实践.这些实践在本书中体现为一条条规则(或称"启示"),并辅以来自现实项目的正.反两面的范例.只要遵循这些规则,就能编写

《数字图像处理原理与实践(MATLAB版)》一书之代码Part9

本文系<数字图像处理原理与实践(MATLAB版)>一书之代码系列的Part9,辑录该书第431至第438页之代码,供有需要读者下载研究使用.至此全书代码发布已经接近尾声,希望这些源码能够对有需要的读者有所帮助.代码执行结果请参见原书配图,建议下载代码前阅读下文: 关于<数字图像处理原理与实践(MATLAB版)>一书代码发布的说明 http://blog.csdn.net/baimafujinji/article/details/40987807 首先给出的是原书P438所列之程序源

《数字图像处理原理与实践(MATLAB版)》一书之代码Part8

本文系<数字图像处理原理与实践(MATLAB版)>一书之代码系列的Part8,辑录该书第375至第415页之代码,供有需要读者下载研究使用.至此全书代码发布已经接近尾声,希望这些源码能够对有需要的读者有所帮助.代码执行结果请参见原书配图,建议下载代码前阅读下文: 关于<数字图像处理原理与实践(MATLAB版)>一书代码发布的说明 http://blog.csdn.net/baimafujinji/article/details/40987807 P385-1 function y

Java中代码点与代码单元(转)

摘要 本文介绍 Java 平台支持增补字符的方式.增补字符是 Unicode 标准中代码点超出 U+FFFF 的字符,因此它们无法在 Java 编程语言中描述为单个的 16 位实体(例如char数据类型).这些字符一般极少用,但是,有些会在诸如中文或日文人名中用到,因此,在东亚国家,政府应用程序通常会要求支持这些字符. Java 平台目前正在改进,以便支持对增补字符的处理,这种改进对现有的应用程序影响微乎其微.新的低层 API 在需要时能够使用单个的字符运行.不过,大多数文本处理 API 均使用

《数字图像处理原理与实践(MATLAB版)》一书之代码Part3

本文系<数字图像处理原理与实践(MATLAB版)>一书之代码系列的Part3(P81~135),代码执行结果请参见原书配图,建议下载代码前阅读下文: 关于<数字图像处理原理与实践(MATLAB版)>一书代码发布的说明http://blog.csdn.net/baimafujinji/article/details/40987807 P92 i = imread('Hepburn.jpg');%注意w和h1这两个模板是等价的w = [1 1 1;1 1 1;1 1 1]/9;h1 =

Gnu.Emacs.Lisp编程入门一书示例代码

最近两天看了Gnu.Emacs.Lisp编程入门一书,把书中的代码示例都写了出来,以及书中的练习题,供有需要的同志使用. 注意:分号后面内容是对应函数及表达式的结果. :-) ;; Chapter 1: 列表处理 ; 在Lisp中,数据和程序都以同样的方式表示:也就是说,它们都是由空格分割. ; 由括号括起来的单词.数字或者其他列表的列表. ; 在一个列表中,列表的元素被称为"原子",不可再被分割为更小的部分.列表 ; 中的原子是由空格一一分割的. ; 双引号中的文本,不论是句子还是段

SharePoint 2013 中代码创建列表查阅项字段

1.首先,打开VS创建两个List Definition,分别是Address和City,如下图: 2.City列表里修改Title为City Name,其实内部名称还是Title,注意一下: 3.给City的列表实例,添加几个值,用来测试使用,如下: 4.在Address列表里添加几个字段,分别是CityName(LookUp类型)和HomeAddress(Single Line of Text),如下: 5.查看Address列表的Schema.Xml,尤其是Fields节点,也就是字段,如