当前位置: 首页 > news >正文

SpringCloud负载均衡服务调用——Ribbon

Ribbon

本专栏学习内容来自尚硅谷周阳老师的视频

有兴趣的小伙伴可以点击视频地址观看

简介

Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。

简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们很容易使用Ribbon实现自定义的负载均衡算法。

LB负载均衡(LoadBalance)

什么是负载均衡

简单来说就是将用户请求平摊到多个服务商,从而达到系统的HA(高可用)

Ribbon本地负载均衡与Nginx服务端负载均衡的区别

  • Nginx是服务器负载均衡,客户端所有请求都会交给nginx,然后由nginx实现转发请求。即负载均衡是由服务端实现的。
  • Ribbon本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术。

Ribbon核心组件IRule

IRule的作用是根据特定算法从服务列表中选取一个要访问的服务,在第一篇讲Eureka的时候咱们使用过@LoadBalance注解来实现轮询,默认情况下是轮询。

在这里插入图片描述

替换轮询算法

官方文档明确给出了警告:

这个自定义配置类不能放在@ComponentScan所扫描的当前包下以及子包下,否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,达不到特殊化定制的目的了。

首先我们要在主启动类的父包下,新建一个包

在这里插入图片描述

@Configuration
public class MySelfRule {@Beanpublic IRule randomRule(){return new RandomRule();}
}

将自定义规则注入到启动类上即可

@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration= MySelfRule.class)  //新增
public class OrderMain80 {public static void main(String[] args) {SpringApplication.run(OrderMain80.class,args);}
}

负载均衡算法

轮询算法原理

简单的说,轮询算法遵循以下公式

rest接口第几次请求数 % 服务器集群总数量 = 实际调用服务器位置下标,每次服务重启后rest接口计数从1开始

例如现在我们有两台机器,集群总数是2

  • List [0] instances = 127.0.0.1:8002
  • List [1] instances = 127.0.0.1:8001

第一次调用时,请求数为1,1 % 2 = 1,获取服务地址127.0.0.1:8001

第二次调用时,请求数为2,2 % 2 = 0,获取服务地址127.0.0.1:8002

第三次调用时,请求数为3,3 % 2 = 1,获取服务地址127.0.0.1:8001

以此类推,实现了轮询

RoundRobinRule源码

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) {//这个方法很关键,通过CAS+自旋锁获得下一个服务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;}}
}
//CAS+自旋锁
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;
}

手写轮询算法

第一步:注释掉RestTemplate上的@LoadBalance注解

这部非常的重要,我就忘记注释了,搞了半天都是500

第二步:建一个LoadBalance接口

public interface LoadBalance {ServiceInstance instances(List<ServiceInstance> serviceInstances);
}

第三步:实现LoadBalance接口,并实现轮询算法

@Component
public class LoadBalanceImpl implements LoadBalance{//用于计算请求次数private AtomicInteger atomicInteger = new AtomicInteger(0);public final int getAndIncrement(){int current;int next;//CAS+自旋锁do {//获取当前请求次数current = this.atomicInteger.get();//计算下一次请求next = current > Integer.MAX_VALUE ? 0 : current + 1;}while (!this.atomicInteger.compareAndSet(current,next));//CAS处理失败重试直到成功return next;}@Overridepublic ServiceInstance instances(List<ServiceInstance> serviceInstances) {int index = getAndIncrement() % serviceInstances.size();return serviceInstances.get(index);}
}

第四步:controller调用

    @ResourceLoadBalance loadBalance;@ResourceDiscoveryClient discoveryClient;@ResourceRestTemplate restTemplate;@GetMapping("/consumer/payment/lb")public String loadBalance(){List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");if (instances == null || instances.size() == 0) {return null;}ServiceInstance serviceInstance = loadBalance.instances(instances);return restTemplate.getForObject(serviceInstance.getUri() + "/payment/lb",String.class);}

相关文章:

SpringCloud负载均衡服务调用——Ribbon

Ribbon 本专栏学习内容来自尚硅谷周阳老师的视频 有兴趣的小伙伴可以点击视频地址观看 简介 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。 简单的说&#xff0c;Ribbon是Netflix发布的开源项目&#xff0c;主要功能是提供客户端的软件负载均衡算…...

各种邮箱服务软件对比

1.宝塔邮局管理器 特点:简单易用,可视化操作,小白也能搞,还有备份功能,一般足够用了 缺点:稳定性真是差,隔三差五的不能收发.没有接口,不能任意修改邮箱密码,只能管理员修改 注意要点:一定要开启ssl,否则有些邮箱给你发邮件你收不到 建议:不要入坑.坏了之后没法修复,哭都没地方…...

相机单独标定的实现过程[autoware标定]、tmp文件的查看方式

安装了autoware1.13和calibration标定包&#xff0c;发现实现相机单独标定的过程较为坎坷&#xff0c;参考了一些博主的方法&#xff0c;发现下面的过程更加适合自己&#xff0c;做个笔记。 1安装标定箱&#xff08;与calibration标定包的安装并不冲突&#xff09; 标定工具箱…...

4.10.1、IP 多播技术的相关基本概念

多播&#xff08;Multicast&#xff0c;也称为组播&#xff09;是一种实现 “一对多” 通信的技术&#xff0c;与传统单播“一对一”通信相比&#xff0c;多播可以极大地节省网络资源。 在因特网上进行的多播&#xff0c;称为 IP 多播。 1、单播 & 多播 如下所示&#xf…...

PIGOSS BSM监控国产数据库Oscar

前言神通数据库(原OSCAR数据库&#xff09;是天津神舟通用数据技术有限公司&#xff08;简称“神舟通用公司”&#xff09;拥有自主知识产权的企业级、大型通用关系型数据库管理系统。PIGOSS BSM作为网利友联科技完全自主研发的纯国产基础 IT 架构运行状态监测平台软件&#xf…...

Spring Boot中文件上传

Spring Boot中文件上传 前言 本篇主要参考Spring官方文档&#xff0c;整理了Spring Boot中文件上传如何实现&#xff0c;以及在代码中使用RestTemplate和HttpClient两种方式实现文件上传。 创建Spring Boot项目 首先创建一个Spring Boot Web项目&#xff0c;使用的Spring B…...

Github上传大文件(>25MB)教程

Github上传大文件&#xff08;>25MB&#xff09;教程Github上传大文件&#xff08;>25MB&#xff09;教程安装git安装Git Large File Storage实例踩坑点1&#xff1a;failed to push some refs to踩坑点2&#xff1a;main与master踩坑点3&#xff1a;Failed to connect t…...

面试官:mysql索引会缓存内存吗?

文章目录 InnoDB缓冲池如何设置方法一:使用 `innodb_buffer_pool_size` 变量方法二:修改my.ini配置文件InnoDB缓冲池 InnoDB存储引擎是基于磁盘存储表文件和索引的,并将数据按页的方式管理,由于访问磁盘的速度较慢,多次访问磁盘会造成数据库性能的下降,为此,InnoDB在内…...

bs4解析数据和csv文件

\b 检测所在的位置是否是单词边界&#xff08;任何可以将不同的单词进行区分的符号&#xff1a;空白符号&#xff0c;标点符号&#xff0c;字符串开头&#xff0c;字符串结尾&#xff09; ^ 检测是否是字符串开头 $ 检测是否是字符串结尾 csv保存数据 什么是csv文件 读操作…...

Linux中Buffer和Cache的区别

Linux中Buffer和Cache的区别 free命令中会有一项buff/cache, 通过man free可以看到这里的关于buff/cache的介绍 buff/cache包含两部分 buffers:内核缓存区用到的内存&#xff0c;对应/proc/meminfo中Buffers的值 cache:内核页缓存和Slab用到的内存&#xff0c;对应/proc/mem…...

Docker 镜像使用

目录 1、列出镜像列表 2、获取一个新的镜像 3、查找镜像 4、拖取镜像 5、删除镜像 6、创建镜像 a.更新镜像 b.构建镜像 设置镜像标签 当运行容器时&#xff0c;使用的镜像如果在本地中不存在&#xff0c;docker 就会自动从 docker 镜像仓库中下载&#xff0c;默认是从 …...

Java阶段一Day10

Java阶段一Day10 文章目录Java阶段一Day10抽象类和抽象方法接口案例小练习引用类型数组教师总结回顾&#xff1a;精华笔记&#xff1a;笔记&#xff1a;补充&#xff1a;抽象类和抽象方法 关键字&#xff1a;abstract 只有方法的定义&#xff0c;没有具体的实现&#xff08;连…...

触摸屏与PLC之间如何快速实现无线PPI通信?

PPI协议是西门子为S7-200专门开发的通信协议&#xff0c;是不开放的协议&#xff0c;CPU自带的两个通信口&#xff08;Port0&#xff0c;Port1&#xff09;均支持该协议&#xff0c;S7-200的一些通信模块也支持PPI协议。编程软件Micro/WIN与CPU进行编程通信也使用PPI协议&#…...

【华为OD机试 2023最新 】 羊、狼、农夫过河(C++ 100%)

题目描述 羊、狼、农夫都在岸边,当羊的数量小于狼的数量时,狼会攻击羊,农夫则会损失羊。农夫有一艘容量固定的船,能够承载固定数量的动物。 要求求出不损失羊情况下将全部羊和狼运到对岸需要的最小次数。 只计算农夫去对岸的次数,回程时农夫不会运送羊和狼。 备注:农…...

Java中关于try、catch、finally中的细节分析

本文讲解的是关于Java中关于try、catch、finally中一些问题 下面看一个例子&#xff08;例1&#xff09;&#xff0c;来讲解java里面中try、catch、finally的处理流程 public class TryCatchFinally {SuppressWarnings("finally")public static final String test(…...

Zookeeper原理

一、概念 Zookeeper是一个开源的、分布式的&#xff0c;为分布式应用提供协调服务的Apache项目。封装好复杂易出错的关键服务&#xff0c;将简单易用的接口和性能高效、功能稳定的系统提供给用户。 二、选举机制 首先是几个概念&#xff1a; myid&#xff1a;节点的唯一标识&…...

关于FPGA如何快速生成模块的例化模板(实用)

关于FPGA如何快速生成模块的例化模板&#xff08;实用&#xff09; 语言 &#xff1a;Verilg HDL 、VHDL EDA工具&#xff1a;ISE、Vivado、Quartus II 关于FPGA如何快速生成模块的例化模板&#xff08;实用&#xff09;一、引言二、快速生成例化模块的几种方法1. IP核的例化模…...

在 Python 中将字符串转换为集合

使用 set() 类将字符串转换为集合&#xff0c;例如 my_set set(my_str)。 set() 类将通过拆分其字符将字符串转换为集合。 my_str one# ✅ 通过拆分字符将字符串转换为集合 my_set set(my_str) print(my_set) # &#x1f449;️ {n, o, e}# -----------------------------…...

大数据Flink进阶(十三):Flink 任务提交模式

文章目录 Flink 任务提交模式 一、会话模式&#xff08;Session Mode&#xff09; 二、单作业模式&#xff08;Per-Job Mode&#xff09; 三、应用模式&#xff08;Application Mode&#xff09; Flink 任务提交模式 Flink分布式计算框架可以基于多种模式部署&#xff0c;…...

day11—编程题

文章目录1.第一题1.1题目1.2涉及的相关知识1.3思路1.4解题2.第二题2.1题目2.2思路2.3解题1.第一题 1.1题目 描述&#xff1a; 将一棵无穷大满二叉树的结点按根结点一层一层地从左往右编号&#xff0c;根结点编号为1。现给定a&#xff0c;b为两个结点。设计一个算法&#xff0…...

CentOS下安装crontab及cron表达式解析

目录安装依赖服务启停任务操作参数简要说明1、参数说明2、cron表达式解析(1)定义(2)结构(3)字段含义(4)注意事项(5)常用表达式例子crontab示例结尾安装依赖 # vixie-cron软件包是crontab的主程序 # crontabs软件包是用来安装、卸装、或列举用来驱动crontab守护进程的表格的程序…...

python 绘制训练曲线--基于Numpy.convolve曲线平均滤波

文章目录1 训练曲线--震荡的非常厉害2 基于Numpy.convolve曲线平均滤波3 python 绘制训练曲线 平滑处理--Savitzky-Golay 滤波器曲线平滑4 python 绘制训练曲线--插值法 曲线平滑处理1 训练曲线–震荡的非常厉害 上一篇文章用python自己绘制训练曲线震荡的非常厉害&#xff08…...

状态管理插件vuex

概念: 专门在Vue中实现集中式状态(数据&#xff09;管理的一个Vue插件&#xff0c;对vue应用中多个组件的共享状态进行集中式的管理(读/写)&#xff0c;也是一种组件间通信的方式&#xff0c;且适用于任意组件间通信。 作用&#xff1a; 如果我们使用全局总线要让所有的组件…...

arthas—阿里开源的Java诊断工具

一、arthas简述Arthas 是阿里开源的Java诊断工具。安装在系统所在服务器&#xff0c;有着强大的能力&#xff0c;是一个开发运维神器。主要功能在线热替换代码/代码增强全局视角的性能分析查看方法执行情况&#xff0c;帮助跟踪偶现的bug支持JDK6二、官方资料官方文档的介绍非常…...

Java学习记录

阅读前请看一下&#xff1a;我是一个热衷于记录的人&#xff0c;每次写博客会反复研读&#xff0c;尽量不断提升博客质量。文章设置为仅粉丝可见&#xff0c;是因为写博客确实花了不少精力。希望互相进步谢谢&#xff01;&#xff01; 文章目录阅读前请看一下&#xff1a;我是一…...

OpenGL API 之 glVertexAttribPointer

glVertexAttribPointer 定义通用顶点属性数据的数组 C Specification format void glVertexAttribPointer(GLuint index,GLint size,GLenum type,GLboolean normalized,GLsizei stride,const void * pointer); Parameters nametypedescriptionindexGLuint Specifies the inde…...

蓝桥杯真题4

[蓝桥杯 2017 省 AB] 分巧克力 题目描述 儿童节那天有 KKK 位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。 小明一共有 NNN 块巧克力&#xff0c;其中第 iii 块是 HiWiH_i \times W_iHi​Wi​ 的方格组成的长方形。 为了公平起见&#xff0c;小明需要从这 NN…...

day02_基本语法

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记Java2307_沐沐霸的博客-CSDN博客 零、复习昨日 一、程序&Java介绍 二、安装JDK&配置环境变量 三、DOS命令 四、第一个程序[重点] 五、Java语言规范[重点] 六、运行机制 七、Typora工具使用 附录:…...

多线程之单例模式

前言 本篇介绍的是wait与notify方法&#xff0c;通过wait来顺序控制执行一些代码&#xff0c;了解单例模式&#xff0c;进行单例模式的简单实现&#xff0c;介绍饿汉模式下出现线程不安全的问题与解决&#xff1b;如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交…...

2023年绿色建筑国际会议(ICoGB 2023) | Springer独立出版

会议简介 Brief Introduction 2023年绿色建筑国际会议(ICoGB 2023) 会议时间&#xff1a;2023年5月21日-23日 召开地点&#xff1a;瑞典斯德哥尔摩 大会官网&#xff1a;www.icogb.org 2023年绿色建筑国际会议(ICoGB 2023)将围绕“绿色建筑”的最新研究领域而展开&#xff0c;为…...