系列七、Ribbon

一、Ribbon

1.1、概述

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

1.2、spring-cloud-starter-alibaba-nacos-discovery默认集成了Ribbon

1.3、官网

https://github.com/Netflix/ribbon/wiki/Getting-Started

1.4、Ribbon进入维护模式怎么办

        未来的替代方案:Spring Cloud LoadBalancer。 

1.5、功能

1.5.1、LB

        LB的全称是Load Balance,中文意思为负载均衡,简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA(高可用),常见的负载均衡有软件Nginx,LVS,硬件 F5等。

1.5.2、Ribbon本地负载均衡 vs Nginx服务端负载均衡

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

1.5.3、集中式LB

        即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5, 也可以是软件,如nginx), 由该设施负责把访问请求通过某种策略转发至服务的提供方;

1.5.4、进程内LB

        将LB逻辑集成到消费方,消费方从服务注册中心获取有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。Ribbon就属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址;

1.6、 Ribbon工作原理

Ribbon在工作时分成两步:
第一步:从注册中心查询可用的服务列表;
第二步:根据用户指定的策略,从可用的服务列表中选择一个地址。其中Ribbon提供了多种策略:比如轮询、随机和根据响应时间加权。原理图如下:

小总结:Ribbon其实就是一个软负载均衡的客户端组件,它可以和其他所需请求的客户端结合使用,和Nacos结合只是其中的一个实例,也可以和Eureka结合;

1.7、核心组件IRule

1.7.1、概述

        根据特定算法中从服务列表中选取一个要访问的服务。

1.7.2、继承结构

1.7.3、组件介绍

(1)com.netflix.loadbalancer.RoundRobinRule:轮询

(2)com.netflix.loadbalancer.RandomRule:随机

(3)com.netflix.loadbalancer.RetryRule:先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重试,获取可用的服务

(4)com.netflix.loadbalancer.WeightedResponseTimeRule:对RoundRobinRule的扩展,响应速度越快的实例选择权重越大,越容易被选择

(5)BestAvailableRule:会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务

(6)AvailabilityFilteringRule:先过滤掉故障实例,再选择并发较小的实例

(7)ZoneAvoidanceRule:默认规则,复合判断server所在区域的性能和server的可用性选择服务器

1.7.4、IRule原理

负载均衡算法:rest接口第几次请求数 % 服务器集群总数量 = 实际调用服务器位置下标  ,每次服务重启动后rest接口计数从1开始。
 List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
 如:   List [0] instances = 127.0.0.1:8002
   List [1] instances = 127.0.0.1:8001
 8001+ 8002 组合成为集群,它们共计2台机器,集群总数为2, 按照轮询算法原理:
当总请求数为1时: 1 % 2 =1 对应下标位置为1 ,则获得服务地址为127.0.0.1:8001
当总请求数位2时: 2 % 2 =0 对应下标位置为0 ,则获得服务地址为127.0.0.1:8002
当总请求数位3时: 3 % 2 =1 对应下标位置为1 ,则获得服务地址为127.0.0.1:8001
当总请求数位4时: 4 % 2 =0 对应下标位置为0 ,则获得服务地址为127.0.0.1:8002
依次类推......

1.8、如何使用

(1)导入依赖:

<!-- nacos 服务注册&发现 -->

<dependency>

         <groupId>com.alibaba.cloud</groupId>

         <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>

</dependency>

(2)配置Bean:

MyRandom代码:

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2024/1/3 9:00
 * @Description:
 */
public class MyRandomRule extends AbstractLoadBalancerRule {

    @Override
    public Server choose(Object key) {
        // 获取当前请求的服务实例
        ILoadBalancer loadBalancer = this.getLoadBalancer();
        List<Server> servers = loadBalancer.getReachableServers();
        int index = ThreadLocalRandom.current().nextInt(servers.size());

        return servers.get(index);
    }

    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {

    }


}

(3)主启动类添加注解

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2024/1/3 8:39
 * @Description:
 */
@RibbonClients(value = {
        @RibbonClient(name = "stock-service-nacos",configuration = MyRibbonConfig.class)
})
@SpringBootApplication
public class OrderServiceRibbon8001MainApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderServiceRibbon8001MainApplication.class, args);
    }


}

1.9、参考

(1)Ribbon负载均衡(二)Ribbon负载均衡策略_ribbon irule接口没有了-CSDN博客

(2)spring cloud 2020.0.1 LoadBalancer负载均衡算法切换-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/289940.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

组合算法简单实现

组合算法 目录概述需求&#xff1a; 设计思路实现思路分析1.简单的字符串方式 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge …

网页爬虫对于网络安全有哪些影响?

在当今信息爆炸的时代&#xff0c;网络已经成为人们获取信息、交流思想和开展业务的重要平台。然而&#xff0c;随着网络的普及和技术的不断发展&#xff0c;网络安全问题也日益凸显&#xff0c;其中网页爬虫对网络安全的影响不容忽视。本文将就网页爬虫对网络安全的影响进行深…

XYZ世代

Z世代&#xff0c;Gen Zers&#xff0c;Generation Z &#xff0c;一词最早出现于欧美地区&#xff0c;是美国及欧洲的流行用语&#xff0c;泛指在1995-2009年间出生的一代人&#xff0c;千禧后一代。又称网络世代、互联网世代&#xff0c;网生代&#xff0c;二次元世代&#x…

项目框架构建之3:Nuget服务器的搭建

本文是“项目框架构建”系列之3&#xff0c;本文介绍一下Nuget服务器的搭建&#xff0c;这是一项简单的工作&#xff0c;您或许早已会了。 1.打开vs2022创建Asp.net Web应用程序 框架选择.net framework4.8&#xff0c;因为nuget服务器只支持.net framework。 2.选择空项目和去…

multipath 内核接口及框架介绍

文章目录 1 云主机使用网络存储 io 流程2 multipath 介绍 1 云主机使用网络存储 io 流程 对于一个云服务环境&#xff0c;大致会有网络节点&#xff0c;存储节点&#xff0c;计算节点&#xff0c;控制节点&#xff0c;其中虚拟云主机在计算节点工作&#xff0c;而虚拟云主机&a…

Unity SVN更新提交小工具

Unity SVN更新提交小工具 前言使用说明必要前提源码参数说明 感谢 前言 Unity开发时每次都要到文件夹中操作SVN&#xff0c;做了一个小工具能够在Editor中直接操作。 使用说明 必要前提 前提是要安装好SVN&#xff0c;在文件夹右键能够看到安装的SVN 源码 using System…

UE4.27.2 网页串流

1、和Unity串流一样安装Node.js 下载地址https://nodejs.org/ 2、下载安装Epic Games启动程序https://www.unrealengine.com/zh-CN/download 3、安装UE4.7.2 4、这里就不安装像素流送演示&#xff0c;选个别的然后创建工程 5、启用PixelStreaming插件 6、设置额外启动参数&am…

uni-app 前后端调用实例 基于Springboot 详情页实现

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

OEE如何为制造企业实施ISO50001提供支持

ISO50001是一项旨在帮助企业建立和实施能源管理体系的国际标准&#xff0c;以提高能源效率、降低能源消耗和减少环境影响。而设备OEE&#xff08;设备综合效率&#xff09;作为一个关键的生产效率指标&#xff0c;可以为企业实施ISO50001提供重要的支持。本文将介绍ISO50001能源…

Hive10_窗口函数

窗口函数&#xff08;开窗函数&#xff09; 1 相关函数说明 普通的聚合函数聚合的行集是组,开窗函数聚合的行集是窗口。因此,普通的聚合函数每组(Group by)只返回一个值&#xff0c;而开窗函数则可为窗口中的每行都返回一个值。简单理解&#xff0c;就是对查询的结果多出一列…

计算机网络期末知识点总结

计算机网络概述考点 计算机网络的组成 从组成部分看&#xff1a;一个完整的计算机网络主要由硬件、软件、协议三大部分组成&#xff0c;缺一不可。硬件主要指&#xff1a;主机、通信链路、交换设备和通信设备等&#xff1b;软件主要指&#xff1a;用户使用的各种软件&#xf…

vue使用elementui 的 table且自定义某列表头时,添加的点击事件和自带的筛选功能有类似冒泡行为

element 自带的table 需求&#xff1a;在时间这一列的筛选按钮旁边添加一个批量修改按钮问题&#xff1a;如果不加排序这个属性&#xff0c;那么表格自带的筛选和新加的批量筛选点击事件会冲突&#xff08;冒泡事件&#xff09;解决方法&#xff1a;在该列添加sortable属性&…

自定义maven插件 开发步骤手册

Maven只是一套框架&#xff0c;它的功能基于全部依赖于插件来实现。因此可以通过插件开发来定制Maven。 官方文档 https://maven.apache.org/guides/plugin/guide-java-plugin-development.html 命名要求 Maven 官方的插件命名为&#xff1a;maven-<yourplugin>-plug…

Python计算圆的面积

Python 计算圆的面积 圆的面积公式为 &#xff1a; 公式中 r 为圆的半径。 # 定义一个方法来计算圆的面积 def findArea(r): PI 3.142 return PI * (r*r) # 调用方法 r float( input("请输入圆的半径:") ) print( "圆的面积为 %.3f&qu…

介绍十五种Go语言开发的IDE

当涉及到Go语言开发的IDE时&#xff0c;以下是几种常用的选择&#xff1a; Goland&#xff1a;这是由JetBrains公司开发的一款商业IDE&#xff0c;旨在为Go开发者提供符合人体工程学的开发环境。Goland整合了IntelliJ平台&#xff0c;提供了针对Go语言的编码辅助和工具集成&am…

设计模式_结构型模式_装饰器模式

装饰器模式和代理模式很像。 代理模式是已经知道代理谁了&#xff0c;所以只是对委托类的访问权限进行限制&#xff0c;因此用户只需要访问相应的代理类就可以。装饰器模式并不知道要装饰谁&#xff0c;所以需要传入具体的被装饰对象进行功能的添加 目的&#xff1a; 增加现有…

构建高效外卖配送系统:技术要点与实际代码示例

随着外卖服务需求的不断增长&#xff0c;构建一个智能化、高效的外卖配送系统成为餐饮业务成功的关键。在本文中&#xff0c;我们将重新审视外卖配送系统&#xff0c;着重思考技术架构&#xff0c;并提供一些实际代码示例&#xff0c;以展示系统中一些先进的技术要点。 技术架…

重新认识一下 vue3 应用实例

重新认识一下 vue 应用实例 &#x1f495; 创建应用实例 每个 Vue 应用都是通过 createApp 函数创建一个新的 应用实例 应用实例必须在调用了 .mount() 方法后才会渲染出来。该方法接收一个“容器”参数&#xff0c;可以是一个实际的 DOM 元素或是一个 CSS 选择器字符串 //…

Postman 安装及使用

文章目录 1. 安装 Postman1&#xff09;下载2&#xff09;安装3&#xff09;注册用户4&#xff09;登陆完成 2. 创建和发送请求1&#xff09;发送一个 GET 请求2&#xff09;发送一个 POST 请求 3. 查看响应4. 使用环境变量和变量5. 高级功能和测试6. 导出和分享请求总结 Postm…

VirtualBox + Redhat7.6 +Oracle19C 数据库安装

软件工具&#xff1a; 虚拟化工具&#xff1a;VirtualBox-6.1.26-145957-Win.exe操作系统镜像&#xff1a;rhel-server-7.6-x86_64-dvd.iso远程连接工具&#xff1a;XmanagerPowerSuite-7.0.0004r.exe、SecureCRT 8.5.3数据库版本镜像&#xff1a;LINUX.X64_193000_grid_home.…