转载请注明出处:https://oldnoop.tech/c/202.html
编写ServerStatData类
封装服务器的请求响应时间的统计数据,包括次数,最大值,最小值,和值等
编写Server类
封装服务器的信息,包括地址,总的请求数,活跃数,封装服务器的信息,包括地址,总的请求数,活跃数,统计数据
封装获取,增加总的请求数,获取/增加/减少活跃数,记录请求的响应时间,获取平均响应时间的方法
定义变量及构造方法
服务器列表,随机数生成器,轮询选取计数器,
计算响应时间得出的权重列表,计算权重的执行器,执行权重计算的 时间间隔,执行权重计算的状态标识
定义构造方法,在构造方法中执行初始化方法
初始化方法
使用调度线程池,设置周期性更新权重列表,默认为30秒钟一次,
每次计算的时候,采用AtomicBoolean的CAS操作,保证只有一个线程在进行
每次重新获取每个服务器的平均响应时间,再获取总的响应时间之和,
每个服务器的权重为 总的响应时间 减去 该服务器的平均响应时间,
权重值列表,每个位置 存储 之前服务器的所有 权重之和
选取服务器
获取当前的服务器列表,权重值列表,
如果两个列表均不为空,获取权重值列表中的最大值,即最后一个,
随机获取 最大权重值 范围内 的随机值,依次和权重值列表中的权重进行比较,
如果某个位置的权重值,大于等于 随机值,表示 随机值落在该服务器权重区间内,即 该位置的服务器被选中
如果没有选取到服务器,在刚启动或者最近没有请求到达的时候,还没有服务器未被命中,这时候采用轮询选取
添加,移除,设置服务器
采用Copy-And-Write模式
先复制当前的服务器列表,得到一个新的集合,
然后进行修改,
最后将修改后的数据设置回去
测试
编写发送请求的方法sendRequest,
使用Thread的sleep方法模拟业务耗时
编写处理请求的方法handRequest,
先选取服务器,
记录请求之前的统计数据(增加服务器的总请求数,活跃数)
然后发送请求,
最后,发送请求完毕,记录请求之后的统计数据(减少服务器的活跃数,记录响应时间的数据)
说明:
这里仅为了测试,编写代码方便,
将发送请求和处理请求的方法放在 负载均衡器中
实际业务场合,应该将这些方法剥离出去
执行测试