【笔记】Ribbon负载均衡伪随机算法
伪随机:思路 当一个下标(伪服务)连接被调用两次,第三次如果还是它,就让再随机一次
当重复随机到一台服务两次时判断第三次是否还是它 是的话 我们要进行 再次随机 也就是第三次
package top.yangbuyi.Rule; /** * @description: 杨不易网站:www.yangbuyi.top * @program: yangbuyispringcloudparent * @ClassName: yangbuyi_Rule * @create: 2020-08-02 23:30 * @author: yangbuyi * @since: JDK1.8 * @yangbuyi_Rule: 随机 负载均衡 **/ public class yangbuyiRule extends AbstractLoadBalancerRule { /** * 开始下标 */ private int nowIndex = -1; /** * 最后的下标 */ private int lastIndex = -1; /** * 记录要跳过 的记录数 (上一次的下标等于当前的下标 表示要跳过的下标) */ private int skipIndex = -1; /** * Randomly choose from all living servers */ public Server choose(ILoadBalancer lb, Object key) { if (lb == null) { return null; } Server server = null; while (server == null) { if (Thread.interrupted()) { return null; } // 获取可用的服务 ListupList = lb.getReachableServers(); // 获取全部服务列表 List allList = lb.getAllServers(); // 获取所有的数量 int serverCount = allList.size(); if (serverCount == 0) { /* * No servers. End regardless of pass, because subsequent passes * only get more restrictive. */ return null; } /* * 伪随机:思路 当重复随机到一台服务两次时判断第三次是否还是它 是的话 我们要进行 再次随机 也就是第三次 * 当一个下标(伪服务)连接被调用两次 * 第三次如果还是它,就让再随机一次 * */ // 随机一次 获取一个在serverCount范围内的随机数 int index = chooseRandomInt(serverCount); // 要不要跳过 表示跳过的条件 if (index == skipIndex) { // 1,1,1 System.out.println("要重新随机"); index = chooseRandomInt(serverCount); // 清空 跳过记录值 skipIndex = -1; } // 要进行记录当前的下标 nowIndex = index; if (lastIndex == nowIndex) { // 如果 上一次的角标 等于 当前角标 就要 跳过了 skipIndex = nowIndex; // skipIndex = 1 } // 记录 上一次的下标 lastIndex = nowIndex; // 从可用的微服务列表中,获取随机的微服务出来 server = upList.get(index); if (server == null) { /* * The only time this should happen is if the server list were * somehow trimmed. This is a transient condition. Retry after * yielding. */ Thread.yield(); continue; } if (server.isAlive()) { return (server); } // Shouldn't actually happen.. but must be transient or a bug. server = null; Thread.yield(); } return server; } protected int chooseRandomInt(int serverCount) { return ThreadLocalRandom.current().nextInt(serverCount); } @Override public Server choose(Object key) { return choose(getLoadBalancer(), key); } @Override public void initWithNiwsConfig(IClientConfig clientConfig) { // TODO Auto-generated method stub } }
你的压力源于无法自律,只是假装努力,现状跟不上你内心的欲望,所以你焦急又恐慌---杨不易
你的压力来源于无法自律,只是假装努力,现状跟不上内心欲望,所以你焦虑又恐慌。——杨不易
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南