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; }