转载请注明出处:https://oldnoop.tech/c/200.html
编写Server类
封装服务器的信息,包括地址,总的请求数,活跃数
封装增加总的请求数,增加/减少活跃数的方法
选取服务器
定义 服务器列表
定义 随机数生成器
选取的时候
先获取当前的服务器列表,
定义3个变量
leastActiveReqCnt最小活跃数
leastCount服务器具有相同最小活跃数的 个数
leastIndex选取的最小活跃数服务器的索引数组(可能多个服务器的活跃数都是最小数)
循环服务器列表
对于每个服务器,拿到服务器当前的活跃数
如果活跃数 小于 最小活跃数,
修改最小活跃数leastActiveReqCnt为 当前服务器的 活跃数
修改最小活跃数服务器数量leastCount为1
修改服务器索引数组第一个元素leastIndex[0]为 当前服务器的索引
如果活跃数 等于 最小活跃数,
修改最小活跃数服务器数量 leastCount加1
修改服务器索引数组 的 对应位置 leastIndex[leastCount++] 为当前服务器的索引
循环结束之后,
如果具有最小活跃数的服务器的个数leastCount为1,
则直接选择这个服务器
如果leastCount不为1,
则存在多个服务器 具有 相同的 最小活跃数,
使用随机算法,随机选择其中的一个服务器
添加和删除服务器
采用Copy-And-Write模式
先复制当前的服务器列表,得到一个新的集合,
然后进行修改,
最后将修改后的数据设置回去
修改服务器列表
修改服务器列表的同时,修改轮询的列表,按照权重数字,分配 指定的次数
修改的时候,采用读写锁,目前暂时用到了写锁,
为了扩展考虑,如果有操作需要先读取并且要求防止并发的情形,可以采用读锁,减少锁竞争
测试
编写发送请求的方法sendRequest,
使用Thread的sleep方法模拟业务耗时
编写处理请求的方法handRequest,
先选取服务器,
再增加服务器的总请求数,活跃数
然后发送请求,
最后,发送请求完毕,减少服务器的活跃数
说明:
这里仅为了测试,编写代码方便,
将发送请求和处理请求的方法放在 负载均衡器中
实际业务场合,应该将这些方法剥离出去
执行测试