转载请注明出处:https://oldnoop.tech/c/196.html
编写Server类
封装服务器的地址和权重信息
定义 服务器列表 和服务器 轮询列表
服务器列表是真实的有几台服务器
服务器轮询列表,按照权重数据,每个服务器在列表中设置多次
轮询操作
先获取当前的服务器轮询列表,
采用AtomicInteger原子操作类,先获取到当前存储的索引编号,加1操作,
为了防止累加超过上限,加1后对轮询的服务器个数取模,获取下一个服务器的索引编号,
然后使用原子类的CAS操作,防止此时有其他线程并发执行,
如果CAS操作成功,则从服务器轮询列表中取 索引编号 对应的 服务器
如果不成功,采用自旋,避免锁竞争
添加和删除服务器
采用Copy-And-Write模式
先复制当前的服务器列表,得到一个新的集合,
然后进行修改,
最后将修改后的数据设置回去
修改服务器列表
修改服务器列表的同时,修改轮询的列表,按照权重数字,分配 指定的次数
修改的时候,采用读写锁,目前暂时用到了写锁,
为了扩展考虑,如果有操作需要先读取并且要求防止并发的情形,可以采用读锁,减少锁竞争