hutool工具类&负载均衡分流

 

工具类 https://hutool.cn/docs/#/core/%E5%B7%A5%E5%85%B7%E7%B1%BB/%E6%A6%82%E8%BF%B0

工具类 https://hutool.cn/docs/#/core/%E5%B7%A5%E5%85%B7%E7%B1%BB/%E6%A6%82%E8%BF%B0
数据库主键
com.baomidou.mybatisplus.core.toolkit IdWorker.getIdStr()

雪花算法工具类
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;
private static final Snowflake snowflake = IdUtil.getSnowflake(1, 1); // 默认使用 workerId = 1, datacenterId = 1
public static void main(String[] args) {
System.out.println(snowflake.nextId());
}

  

 

负载均衡
1,轮询
1)Redis Incr 命令将 key 中储存的数字值增一,利用原子性
2)一次请求递增1,如果目标有3个结果,对3取模得到结果对象下标
2,加权轮询
1)Redis Incr 命令将 key 中储存的数字值增一,利用原子性
2) 设计对象Node(code 标识,ids 用来被映射的下标结合)
3)一次请求递增1,如果目标有A、B、C3个结果,对应权重A(3)、B(2)、C(1),对6取模,ids包含哪个下标,就返回该Node对象
2,加权轮询二
1)Redis Incr 命令将 key 中储存的数字值增一,利用原子性
2) 设计对象Node(code 标识,weight 权重)
3)一次请求递增1,如果目标有A、B、C3个结果,对应权重A(3)、B(2)、C(1),对6取模offset(0,1,2,3,4,5),遍历node,offset -= node.getWeight(),offset < 0 得到Node对象
注释:不管遍历node时,node的顺序如何,循环计算offset -= node.getWeight(),当offset < 0 得到Node对象。
对6取模offset(0,1,2,3,4,5)总会有1个模对应1,2个模对应2,3个模对应3
代码如下:
public class RoundBlance {
@Test
public void test1(){
RoundNode node1 = new RoundNode("node1",1);
RoundNode node2 = new RoundNode("node2",2);
RoundNode node3 = new RoundNode("node3",3);
List<RoundNode> list = new ArrayList<RoundNode>();
list.add(node2);
list.add(node1);
list.add(node3);
System.out.println(list);

//获取总权重
int totalWeight = 0;
for(RoundNode node:list){
totalWeight += node.getWeight();
}
System.out.println(totalWeight);

for (int i = 0; i < 180; i++){
RoundNode node = blance(list,totalWeight,i);
System.out.println(node);
}
}

/**
* @param totalWeight 总权重
* @param nodes 需要负载映射后的结果集合
* @param incr 每次请求累加1,可以在指定数目后清零
* @return
*/
public RoundNode blance(List<RoundNode> nodes,int totalWeight,int incr){
//当前请求数 对 总权重值 取模 0 1 2 3 4 5
int mo = incr % totalWeight;
for(RoundNode node:nodes){
mo -= node.getWeight();
if(mo < 0 ){
return node;
}
}
return null;
}

  

 

posted @ 2022-02-20 18:11  XUMT111  阅读(123)  评论(0编辑  收藏  举报