SpringCloud(3) Ribbon负载均衡,负载均衡策略,自定义负载均衡

2023-11-19

1.Ribbon负载均衡流程

假设我们有一台 order-service 订单服务,两台 user-service 用户服务,当订单服务需要调用用户服务获取用户信息的时候,应该怎么分配调用哪台服务呢?

在这里插入图片描述

这时候就需要用到 Ribbon 组件了。

在这里插入图片描述

首先,我们发起远程调用的时候,指定的是需要调用的服务名称,然后我们会调用 Ribbon 组件,Ribbon 会从注册中心中拉取 user-service 服务的信息,其中就包括这两台 user-service 服务的所在地址,这时候 order-service 就获取到 user-service 服务所在的两个地址了。

那么这两个地址我们怎么选择其中一个地址进行调用呢?这时候就由 Ribbon 决定到底选择哪一台服务器进行调用,它选用的策略是轮询。比如:找到的第一个服务器是8081,那么 order-service 最终进行调用的就是 8081 的 user-service 服务。

当然,轮询只是 Ribbon 中的其中一种负载均衡策略,那么其他还有哪些负载均衡策略呢?

2.Ribbon负载均衡策略

Ribbon 中一共封装了 7 种负载均衡策略,

1)RoundRobinRule:简单轮询服务列表来选择服务器。

就是按照一定的顺序去调用服务的实例。比如我们刚才有 8081 和 8082 的两个 user-service 实例,假如第一次调用 8081,那么第二次就会调用 8082 了,以此类推。

2)WeightedResponseTimeRule:按照权重来选择服务器,响应时间越长,权重越小。

其中的 ResponseTime 就是指响应时间,意思是说响应时间越长,权重就越小,被选择的概率就越低。

3)RandomRule:随机选择一个可用的服务器。

这个比较简单,就是单纯的随机。

4)BestAvailableRule:忽略那些短路的服务器,并选择并发数较低的服务器。

最小连接数策略。举个例子,比如我们还是有两台服务器,第一台的连接数是100,第二台是50,那这时候就会选择50的连接数对应的服务器进行连接,这就是指并发数较低的服务器,也可以理解成是选择一个空闲比较多的服务器进行连接。

5)RetryRule:重试机制的选择逻辑。

首先,还是会按照轮询的方式选择服务,然后进行远程调用。但是,假如某些服务实例为null,或者某些服务实例已经宕机失效了,它就会按照指定的时间进行不断地重试,来去获取这个服务,这个就是重试机制的选择逻辑。

6)AvailabilityFilteringRule:可用性敏感策略,先过滤非健康的,再选择连接数较小的实例。

比如说我们有三台服务器,如果第一台服务器已经宕机了,很显然就不选择第一台服务器了,然后再从第二、三台服务器中选择连接数比较小的实例,比如第二台服务器的连接数是100,第三台服务器的连接数是50,那么很显然就要去选择第三台服务器。

7)ZoneAvoidanceRule:默认策略,以区域可用的服务器为基础进行服务器的选择。使用 Zone 对服务器进行分类,这个 Zone 可以理解为一个机房、一个机架等。而后再对 Zone 内的多个服务做轮询。

意思是说,服务很多的时候,就会存在很多机房,比如一个在上海,一个在北京。假如服务的调用方也在北京,那么就会优先选择北京的机房服务器进行连接,就近原则。一般情况下,比如说我们没有区域的概念,那么这时候还是会根据轮询的方式来完成调用。

以上就是 Ribbon 最常见的七种负载均衡策略,标红的是面试的时候最好能给面试官陈述出来的部分。

3.自定义负载均衡策略如何实现

我们可以自己创建类实现 IRule 接口,然后再通过配置类或配置文件配置即可,通过定义 IRule 实现可以修改负载均衡规则,有两种方式。

假如我们有一个 order-service 订单服务调用 user-service 用户服务,用户服务有 8081 和 8082 两个节点。

在这里插入图片描述

现在我们想实现自定义的负载均衡策略,我们都是在服务的发起方 order-service 进行配置的。

第一种方法: 我们可以加一个配置类,在配置类中设置一个返回值 IRule,我们可以直接将七种负载均衡策略中的其中一种进行返回。

在这里插入图片描述

第二种方式: 我们可以在 yaml 文件中进行配置。

在这里插入图片描述

user-service:
  ribbon:
    NFLoadBalanceRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则

这两种配置方式有什么不同?

在这里插入图片描述

  • 第一种通过配置类自定义注入 Bean 的方式,是全局生效的。

    意思是只要是 order-service 服务采用 Ribbon 进行的负载均衡调用都是使用的自定义负载均衡策略。

  • 第二种通过 yaml 配置的方式,是局部生效的。

    意思是在 order-service 服务采用 Ribbon 进行负载均衡的时候,只有请求 user-service 服务的请求是使用的自定义负载均衡策略。

4.总结

1)项目负载均衡如何实现?

微服务的负载均衡主要使用了一个组件 Ribbon,比如,我们在使用 feign 远程调用的过程中,底层的负载均衡就是使用了 Ribbon。

2)Ribbon负载均衡有哪些?

  • RoundRobinRule:简单轮询服务列表来选择服务器。
  • WeightedResponseTimeRule:按照权重来选择服务器,响应时间越长,权重越小。
  • RandomRule:随机选择一个可用的服务器。
  • ZoneAvoidanceRule:默认,区域敏感策略,以区域可用的服务器为基础进行服务器的选择。使用 Zone 对服务器进行分类,这个 Zone 可以理解为一个机房、一个机架等。而后再对 Zone 内的多个服务做轮询。

3)自定义负载均衡策略如何实现?

提供了两种方式:

① 创建类实现 IRule 接口,可以指定负载均衡策略(全局生效)。

② 在客户端的 yaml 配置文件中,可以配置某一个服务调用的负载均衡策略(局部生效)。

5.思考

1)如果通过 feign 调用本服务,会负载均衡吗?

答案:。因为即使调用本服务,也会先从注册中心获取服务所有节点的地址信息去负载均衡。

比如,我们写一个下面这样的 Controller 来动态打印当前服务的端口:

@RestController
@RequestMapping("/demo")
public class DemoController {

    @Value("${server.port:}")
    private String port;

    @Autowired
    private DemoFeignClient demoFeignClient;

    @GetMapping("/test")
    public Result<Object> test() {
        String data = "This is a test! port:" + port;
        return Result.succeed().setData(data);
    }

    @GetMapping("/feignTest")
    public Result<Object> feignTest() {
        return demoFeignClient.test();
    }
}

我们再写一个 feign client 类来调用本服务的接口:

@FeignClient(value = "springboot-feign")
public interface DemoFeignClient {

    @GetMapping("/demo/test")
    Result<Object> test();
}

当我们用 8081 和 8082 端口来启动两个实例后,调用接口:http://localhost:8081/demo/feignTest,可以发现返回的端口实际上是轮询打印的:

在这里插入图片描述

在这里插入图片描述

整理完毕,完结撒花~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringCloud(3) Ribbon负载均衡,负载均衡策略,自定义负载均衡 的相关文章

  • 网址,URL,域名,IP地址,DNS,域名解析,只为你能成功访问

    计算机网络 计算机专业必修科目之一 是专业课 但是 很多的人除了进入浏览器 输入网址 然后回车就看到页面了 然后往下操作 基本没怎么关注过它的原理 但是 你回车之后 网络内部真的是发生了很多的事情 只是你不知道 今天 我就带大家解开网络的神
  • Android平台GB28181设备接入侧(编码前

    在之前 我有写过Android平台GB28181设备接入模块的好多blog 包括参数设置 功能支持与扩展等 以数据接入为例 支持的数据类型涉及编码前 编码后或直接流数据 RTSP或RTMP流 可用于如智能监控 智慧零售 智慧教育 远程办公
  • HTTPRunner学习笔记

    HttpRunner 是一款面向 HTTP S 协议的通用测试框架 只需编写维护一份 YAML JSON 脚本 即可实现自动化测试 性能测试 线上监控 持续集成等多种测试需求 在yaml文件中组织测试用例 在命令行执行 参考 HTTPRun
  • Wazuh agent的安装、注册与配置管理

    部署Wazuh Agent常用的环境变量 Linux系统下的常用环境变量 WAZUH MANAGER WAZUH MANAGER PORT WAZUH PROTOCOL WAZUH REGISTRATION SERVER WAZUH REG
  • vue 3 第三十四章:nextTick

    nextTick是Vue3中的一个非常有用的函数 它可以在下一次DOM更新循环结束后执行回调函数 这个函数可以用来解决一些异步更新视图的问题 例如在修改数据后立即获取更新后的DOM节点 以下是一个简单的示例

随机推荐

  • BUUCTF【Web】Exec(命令执行漏洞)

    在进入靶场后发现窗口ping 猜测可能是SQL注入 也有可能是命令执行漏洞 我们先随便ping一下本机地址127 0 0 1 发现有回显 PING 127 0 0 1 127 0 0 1 56 data bytes 既然有回显那么就可以确定
  • 前端做excel的录入解析,将excel的数据传给后端,显示在页面上。

    具体的流程如图所示 1 点击excel录入按钮 2 打开弹框 3 点击上传按钮 会自动打开计算机本地文件 选择想上传的文件 点击打开 4 会将excel的数据解析成一个表格 可以在表格中做删除操作 点击确定 5 将excel的人员与系统中的
  • Redis cluster集群搭建

    通过三台虚拟机搭建一个3主3从的cluster集群 1 安装 gcc c 依赖包 yum install gcc c 2 下载安装包并解压 wget https download redis io releases redis 6 0 9
  • Max Flow P

    Max Flow P 题目传送门 题目大意 题目大意就是给你一棵树 再给你K次操作将x到y的所有点的值都加1 然后输出所有点值的最大值 思路 这一题如果用暴力的话从范围来看肯定会T tle 所以我们要考虑用差分的思想去做 代码 先看代码 i
  • L2-1 分而治之PTA

    分而治之 各个击破是兵家常用的策略之一 在战争中 我们希望首先攻下敌方的部分城市 使其剩余的城市变成孤立无援 然后再分头各个击破 为此参谋部提供了若干打击方案 本题就请你编写程序 判断每个方案的可行性 输入格式 输入在第一行给出两个正整数
  • gdb attach 使用方法介绍

    1 假设进程 mcs 已启动 2 ps ef grep mcs 查询mcs进程号 获取进程号xxxx 3 gdb attach xxxx 进程号 attach到已启动的进程上 4 gdb stop 先暂停那个子进程 然后设置一些断点和一些W
  • arp,udp,icmp编码实现理解

    一直关注tcp ip的底层协议栈 终于有了大概的了解 通过ntytcp了解tcp相关的底层实现 发现除了tcp协议栈相关的东西 还有udp arp icmp ping命令相关 以及通过netmap对网卡数据进行接收的相关基础知识点 幸好 听
  • 分布式 dataX 详细 (落地) 设计

    1 背景 分布式 DataX 基于 datax 打造的语义分分布式 ETL 平台 Datax 提供 reader framework writer 框架 方便开发两种异构数据源数据同步 但开源的 datax 缺少分布式特性 本文介绍基于 e
  • leaftlet 标签和弹框

  • C++新特性07_强制转换static_cast(隐式转换:基本等价于隐式转换的一种类型转换运算符,可使用于需要明确隐式转换的地方;大端序、小端序;适用于低风险转换及子类转父类)

    本篇将会介绍static cast 这种转换方式和以前学习的隐式转换很相似 基本等价于隐式转换的一种类型转换运算符 可使用于需要明确隐式转换的地方 C 新特性07 强制转换static cast 1 隐式转换 2 计算机数据存储方式 3 s
  • 蓝桥云课——长草 Python (广度优先遍历)

    这种题应该不是Python组的吧 跑了跑其他人的题解发现最后一组解都会超时 权当抛砖引玉了吧 题目地址 长草 先上BFS模板 def Bfs 参数 while quene 空 cur quene pop 0 弹出队列第一项 for code
  • 理解JS的底层运行原理笔记

    数据结构概念 栈数据结构 gt 先进后出 堆数据结构 gt 部分顺序 因为储存方式不一样 知道key就行 队列数据结构 gt 先进先出 JS 5种基本数据类型 undefined null string number boolan 按值访问
  • C++时间转换成时间戳形式

    时间格式 2022 07 11 19 03 56 458 C 98 include
  • javascript小技巧&&JavaScript[对象.属性]集锦

    事件源对象 event srcElement tagName event srcElement type 捕获释放 event srcElement setCapture event srcElement releaseCapture 事件
  • EOS跨平台PC端钱包工具EOSDevHelper

    EOSDevHelper is a cross platform EOS PC wallet tool which is developed by OracleChain io EOSDevHelper是一个跨平台PC端EOS钱包工具 由O
  • MyBatis笔记(一)--核心配置文件、sql映射文件、多对一、一对多

    MyBatis笔记 一 核心配置文件 sql映射文件 多对一 一对多 MyBatis学习笔记 一 内容包括 MyBatis入门案例 MyBatis核心配置文件结构说明 sql映射文件结构说明 查询结果封装resultMap 多对一查询ass
  • hugo部署到github本地build成功,但是github build失败

    hugo 部署到github上有一篇笔记居然不成功 github build 错误信息提示如下 最后发现是markdown中插入java代码段里的花括号转译有问题 也就是这一句 这一句删掉之后就成功build了 这糟心bug搞了我一下午
  • 关于时间的最小单位

    关于时间的最小单位 以前很少研究过这个问题 一次业务上的需求 要求计算的性能要求很高 添加 读取 更新数据的效率都要是毫秒以下 为了测试 不得不在代码中通过前后添加类似这样的语句来调试 long start System currentTi
  • 树莓派4B系列一:系统安装与环境配置

    系统安装 烧录镜像 首先从官方网站下载系统镜像 树莓派镜像官方下载地址 因为我是用来做服务器的 所以直接下载的最简版 然后从SDFormatter的官网下载格式化工具 SDFormatter官方地址 接着进行镜像烧录 我是用Etcher做的
  • SpringCloud(3) Ribbon负载均衡,负载均衡策略,自定义负载均衡

    目录 1 Ribbon负载均衡流程 2 Ribbon负载均衡策略 3 自定义负载均衡策略如何实现 4 总结 5 思考 1 如果通过 feign 调用本服务 会负载均衡吗 1 Ribbon负载均衡流程 假设我们有一台 order servic