失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > SpringCloud学习 Ribbon实现自定义负载均衡

SpringCloud学习 Ribbon实现自定义负载均衡

时间:2023-09-15 12:44:03

相关推荐

SpringCloud学习 Ribbon实现自定义负载均衡

ribbon实现负载均衡

ribbon中所有的loadbalancer都是通过继承AbstractLoalBalancerRule来实现负载均衡规则的实现

公司项目中使用的zookeeper注册节点地址为127.0.0.1,本机地址,在部署时不会发生错误,但在开发环境中,使用feign接口进行调用时会出现feign调用失败的错误

基于ribbon修复bug

原始的ribbon负载均衡调用 (轮询源码)

public Server choose(ILoadBalancer lb, Object key) {if (lb == null) {log.warn("no load balancer");return null;} else {Server server = null;int count = 0;while(true) {if (server == null && count++ < 10) {// 得到所有存活的服务列表List<Server> reachableServers = lb.getReachableServers();List<Server> allServers = lb.getAllServers();int upCount = reachableServers.size();int serverCount = allServers.size();if (upCount != 0 && serverCount != 0) {int nextServerIndex = this.incrementAndGetModulo(serverCount);// 轮询nextServerIndexserver = (Server)allServers.get(nextServerIndex);if (server == null) {Thread.yield();} else {if (server.isAlive() && server.isReadyToServe()) {return server;}server = null;}continue;}log.warn("No up servers available from load balancer: " + lb);return null;}if (count >= 10) {log.warn("No available alive servers after 10 tries from load balancer: " + lb);}return server;}}}

除了轮询策略,loadbalancer还内置了一些策略如下:

Ribbon 默认的负载均衡策略是轮询策略

解决项目问题,由于是单应用调用,使用自定义负载均衡调用:

public class LoadBalancerRule extends AbstractLoadBalancerRule {private static int index = 0;@Overridepublic void initWithNiwsConfig(IClientConfig iClientConfig) {}@Overridepublic Server choose(Object o) {ILoadBalancer loadBalancer = getLoadBalancer();if (loadBalancer == null){return null;}List<Server> servers = loadBalancer.getAllServers();// 修改server的host地址,将本机地址修改为zk地址for (Server server : servers) {server.setHost("host");}Server server = servers.get(index % servers.size());index++;return server;}}

修复完成。

如果觉得《SpringCloud学习 Ribbon实现自定义负载均衡》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。