Ribbon客户端负载均衡算法分析
一、源码分析
//
// 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客户端负载均衡算法分析相关推荐
- SpringCloud微服务架构,Spring Cloud 服务治理(Eureka,Consul,Nacos),Ribbon 客户端负载均衡,RestTemplate与OpenFeign实现远程调用
什么是SpringCloud 微服务架构 • "微服务"一词源于 Martin Fowler的名为 Microservices的博文,可以在他的官方博客上找到 http://mar ...
- Ribbon客户端负载均衡
前一篇博客我们已经构建了一个微服务项目demo,地址为https://blog.csdn.net/f123147/article/details/115904274,在高访问量和高并发的复杂项目中,不 ...
- Spring Cloud源码分析——Ribbon客户端负载均衡
年前聊了Eureka和Zookeeper的区别,然后微服务架构系列就鸽了三个多月,一直沉迷逛B站,无法自拔.最近公司复工,工作状态慢慢恢复(又是元气满满地划水).本文从以下3个方面进行分析(参考了翟永 ...
- Ribbon 客户端负载均衡
文章目录 零.懒汉式改为饿汉式 一.基于配置文件 二.基于Bean配置 三.自定义规则 1 权重优先调用 2 集群优先调用 3 元数据优先调用 零.懒汉式改为饿汉式 [consumer-springb ...
- Ribbon客户端负载均衡介绍
- ribbon, restTemplate 负载均衡服务调用
ribbon ribbon concept ribbon核心组件IRule 模仿源码重写轮询 ribbon concept spring cloud ribbon 是基于Netflix ribbon实 ...
- 五、springcloud之客户端负载均衡Ribbon
一.简介 在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的.Spring cloud有两种服务调用方式: 一种是ribbon+restTemplate, ...
- 客户端负载均衡Ribbon之一:Spring Cloud Netflix负载均衡组件Ribbon介绍
Netflix:['netfliːks] ribbon:英[ˈrɪbən]美[ˈrɪbən] n. 带; 绶带; (打印机的) 色带; 带状物; v. 把-撕成条带; 用缎带装饰; 形成带状; ...
- 基于Spring cloud Ribbon和Eureka实现客户端负载均衡
前言 本案例将基于Spring cloud Ribbon和Eureka实现客户端负载均衡,其中Ribbon用于实现客户端负载均衡,Eureka主要是用于服务注册及发现: 传统的服务端负载均衡 常见的服 ...
- Spring Cloud【Finchley】-04使用Ribbon实现客户端负载均衡
文章目录 概述 Ribbon演示 服务提供者微服务改造为使用MySql数据库 新建服务消费者微服务,配置Ribbon 注意事项 源码 概述 Spring Cloud-03将微服务注册到Eureka S ...
最新文章
- 分布式系统的面试题14
- 阿里云 mysql 无缘无故挂掉
- vue2.0 通过v-html指令渲染的富文本无法修改样式的解决方案
- Scala学习 day01 Scala的类/方法/对象/单例对象
- 我应该采用 Java 12 还是坚持使用 Java 11?
- 阿里云时空数据库引擎HBase Ganos上线,场景、功能、优势全解析
- oracle删除建分区索引,Oracle分区表之创建维护分区表索引的详细步骤
- 730阵列卡支持多大硬盘_3分钟告诉你:OPPO Reno普通版和旗舰版的差距到底有多大...
- 【python基础知识】对文本数据库的一些基本操作
- 大同大学计算机与网络工程学院,计算机与网络工程学院代表队 在第十一届“蓝桥杯”全国软件和信息技术人才大赛全国决赛中再获佳绩...
- docker mysql 阿里云_阿里云docker部署mysql
- GTK+图形化应用程序开发学习笔记(三)—窗体
- 写给大忙人的ELK最新版6.2.4学习笔记-Logstash和Filebeat解析(java异常堆栈下多行日志配置支持)
- The 46th ICPC Asia Jinan Regional Contest,2021,46届济南站热身赛
- VC++中的Win32 Application和Win32 Console Application区别
- gateway-统一权限-认证
- win10卸载office2010的方法
- simplest tensor core gemm sample
- 【加量不加价,提供只读脚本】小麦苗健康检查脚本说明(Oracle巡检脚本)
- VR学习第一节:VR是什么?VR AR的区别