一、源码分析

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//package com.netflix.loadbalancer;public interface IRule {Server choose(Object var1);void setLoadBalancer(ILoadBalancer var1);ILoadBalancer getLoadBalancer();
}

轮询负载均衡算法

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//package com.netflix.loadbalancer;import com.netflix.client.config.IClientConfig;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class RoundRobinRule extends AbstractLoadBalancerRule {private AtomicInteger nextServerCyclicCounter;private static final boolean AVAILABLE_ONLY_SERVERS = true;private static final boolean ALL_SERVERS = false;private static Logger log = LoggerFactory.getLogger(RoundRobinRule.class);public RoundRobinRule() {this.nextServerCyclicCounter = new AtomicInteger(0);}public RoundRobinRule(ILoadBalancer lb) {this();this.setLoadBalancer(lb);}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);server = (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;}}}private int incrementAndGetModulo(int modulo) {int current;int next;do {current = this.nextServerCyclicCounter.get();next = (current + 1) % modulo;} while(!this.nextServerCyclicCounter.compareAndSet(current, next));return next;}public Server choose(Object key) {return this.choose(this.getLoadBalancer(), key);}public void initWithNiwsConfig(IClientConfig clientConfig) {}
}

二、手写Ribbon轮询算法

package com.george.springcloud.lb;import org.springframework.cloud.client.ServiceInstance;import java.util.List;/*** @author Yang Hao* @description* @date 2020-09-16 14:58*/
public interface MyLoadBalancer {ServiceInstance instances(List<ServiceInstance> serviceInstances);
}
package com.george.springcloud.lb.impl;import com.george.springcloud.lb.MyLoadBalancer;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.stereotype.Component;import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;/*** @author Yang Hao* @description* @date 2020-09-16 15:00*/
@Component //让容器扫描到这个类
public class MyLoadBalancerImpl implements MyLoadBalancer {private AtomicInteger atomicInteger = new AtomicInteger(0);/*** 参考RoundRobinRule 类的源码实现 自定义选择规则** @return*/public final int getAndIncrement() {int current;int next;do {current = this.atomicInteger.get();//Integer 最大值2147483647next = current >= 2147483647 ? 0 : current + 1;} while (!this.atomicInteger.compareAndSet(current, next));System.out.println("---------第几次访问,次数:next=" + next);return next;}/*** 负载均衡算法: rest接口第几次请求数%服务器集群总数量=实际调用服务器位置下标.每次服务重启动后rest接口计数从1开始。** @param serviceInstances* @return*/@Overridepublic ServiceInstance instances(List<ServiceInstance> serviceInstances) {int index = getAndIncrement() % serviceInstances.size();return serviceInstances.get(index);}
}
    @GetMapping(value = "/consumer/payment/lb")public String getPaymentLB() {List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");if (instances == null || instances.size() <= 0) {return null;}ServiceInstance serviceInstance = myLoadBalancer.instances(instances);URI uri = serviceInstance.getUri();return restTemplate.getForObject(uri + "/payment/lb", String.class);}

不知道这里为啥会报这个错

通过postman请求都是正常的

Ribbon客户端负载均衡算法分析相关推荐

  1. SpringCloud微服务架构,Spring Cloud 服务治理(Eureka,Consul,Nacos),Ribbon 客户端负载均衡,RestTemplate与OpenFeign实现远程调用

    什么是SpringCloud 微服务架构 • "微服务"一词源于 Martin Fowler的名为 Microservices的博文,可以在他的官方博客上找到 http://mar ...

  2. Ribbon客户端负载均衡

    前一篇博客我们已经构建了一个微服务项目demo,地址为https://blog.csdn.net/f123147/article/details/115904274,在高访问量和高并发的复杂项目中,不 ...

  3. Spring Cloud源码分析——Ribbon客户端负载均衡

    年前聊了Eureka和Zookeeper的区别,然后微服务架构系列就鸽了三个多月,一直沉迷逛B站,无法自拔.最近公司复工,工作状态慢慢恢复(又是元气满满地划水).本文从以下3个方面进行分析(参考了翟永 ...

  4. Ribbon 客户端负载均衡

    文章目录 零.懒汉式改为饿汉式 一.基于配置文件 二.基于Bean配置 三.自定义规则 1 权重优先调用 2 集群优先调用 3 元数据优先调用 零.懒汉式改为饿汉式 [consumer-springb ...

  5. Ribbon客户端负载均衡介绍

  6. ribbon, restTemplate 负载均衡服务调用

    ribbon ribbon concept ribbon核心组件IRule 模仿源码重写轮询 ribbon concept spring cloud ribbon 是基于Netflix ribbon实 ...

  7. 五、springcloud之客户端负载均衡Ribbon

    一.简介 在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的.Spring cloud有两种服务调用方式: 一种是ribbon+restTemplate, ...

  8. 客户端负载均衡Ribbon之一:Spring Cloud Netflix负载均衡组件Ribbon介绍

    Netflix:['netfliːks] ribbon:英[ˈrɪbən]美[ˈrɪbən] n. 带; 绶带; (打印机的) 色带; 带状物; v. 把-撕成条带; 用缎带装饰; 形成带状;     ...

  9. 基于Spring cloud Ribbon和Eureka实现客户端负载均衡

    前言 本案例将基于Spring cloud Ribbon和Eureka实现客户端负载均衡,其中Ribbon用于实现客户端负载均衡,Eureka主要是用于服务注册及发现: 传统的服务端负载均衡 常见的服 ...

  10. Spring Cloud【Finchley】-04使用Ribbon实现客户端负载均衡

    文章目录 概述 Ribbon演示 服务提供者微服务改造为使用MySql数据库 新建服务消费者微服务,配置Ribbon 注意事项 源码 概述 Spring Cloud-03将微服务注册到Eureka S ...

最新文章

  1. 分布式系统的面试题14
  2. 阿里云 mysql 无缘无故挂掉
  3. vue2.0 通过v-html指令渲染的富文本无法修改样式的解决方案
  4. Scala学习 day01 Scala的类/方法/对象/单例对象
  5. 我应该采用 Java 12 还是坚持使用 Java 11?
  6. 阿里云时空数据库引擎HBase Ganos上线,场景、功能、优势全解析
  7. oracle删除建分区索引,Oracle分区表之创建维护分区表索引的详细步骤
  8. 730阵列卡支持多大硬盘_3分钟告诉你:OPPO Reno普通版和旗舰版的差距到底有多大...
  9. 【python基础知识】对文本数据库的一些基本操作
  10. 大同大学计算机与网络工程学院,计算机与网络工程学院代表队 在第十一届“蓝桥杯”全国软件和信息技术人才大赛全国决赛中再获佳绩...
  11. docker mysql 阿里云_阿里云docker部署mysql
  12. GTK+图形化应用程序开发学习笔记(三)—窗体
  13. 写给大忙人的ELK最新版6.2.4学习笔记-Logstash和Filebeat解析(java异常堆栈下多行日志配置支持)
  14. The 46th ICPC Asia Jinan Regional Contest,2021,46届济南站热身赛
  15. VC++中的Win32 Application和Win32 Console Application区别
  16. gateway-统一权限-认证
  17. win10卸载office2010的方法
  18. simplest tensor core gemm sample
  19. 【加量不加价,提供只读脚本】小麦苗健康检查脚本说明(Oracle巡检脚本)
  20. VR学习第一节:VR是什么?VR AR的区别

热门文章

  1. 一维搜索——进退法matlab实现(含代码)
  2. 《数值分析》课程matlab源码Ⅰ——向量范数,矩阵范数,上、下三角回代法
  3. c# 执行js方法
  4. 推荐一款专为新手用的Python开发工具
  5. 【DPDK峰会回顾】支撑双十一的高性能负载均衡是如何炼成的
  6. 一个简单的conky
  7. 第17章 高级数据表示 17.7 二叉搜索树(第一部分ADT 和 接口)
  8. 《深入理解Android:卷III A》一一2.2Java层中的Binder分析
  9. Meclipse乱码解决方案
  10. “国际通信展”十年的印记