SpringCloud_Ribbon负载均衡

概述

SpringCloud底层其实是利用了一个名为Ribbon的组件,来实现负载均衡功能的。
在这里插入图片描述

源码

LoadBalancerInterceptor

其中含有intercept方法,拦截用户的HttpRequest请求:

  1. request.getURI()
    获取请求uri,即http://userservice/user/

  2. originalUri.getHost()
    获取uir路径的主机名,即服务id:userservice

  3. this.loadBalancer.execute()
    处理服务id和用户请求
    其中loadBalancer类型为LoadBalancerClient,如下

LoadBalancerClient

execute()

  • getLoadBalancer(serviceId):根据服务id获取ILoadBalancer(负载均衡器),该ILoadBalancer会用serviceId去eureka获取服务列表并保存
  • getServer(loadBalancer):利用内置的负载均衡算法,从服务列表中选择一个
  • 随后再访问并跟踪,就能获得对应的 ip:port

IRule负载均衡策略

上述类中使用getServer进行负载均衡,该方法中实际上调用了ILoadBalancer(负载均衡器)的chooseServer方法,而该方法中则又调用了IRule.choose()方法;IRule类的默认新建对象是RoundRobinRule,即轮询

总结

在这里插入图片描述
基本流程如下:

  • 拦截我们的RestTemplate请求http://userservice/user/1
  • RibbonLoadBalancerClient会从请求url中获取服务名称,也就是user-service
  • DynamicServerListLoadBalancer根据user-service到eureka拉取服务列表
  • eureka返回列表,localhost:8081、localhost:8082
  • IRule利用内置负载均衡规则,从列表中选择一个,例如localhost:8081
  • RibbonLoadBalancerClient修改请求地址,用localhost:8081替代userservice,得到http://localhost:8081/user/1,发起真实请求

负载均衡策略

Ribbon中自带的负载均衡策略

负载均衡的规则定义在IRule接口中,IRule又有不同的实现类,实现不同的负载均衡策略

内置负载均衡规则类规则描述
RoundRobinRule简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则
AvailabilityFilteringRule对以下两种服务器进行忽略: (1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态。短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。 (2)并发数过高的服务器。如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上限,可以由客户端的..ActiveConnectionsLimit属性进行配置。
WeightedResponseTimeRule为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。
ZoneAvoidanceRule以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询。
BestAvailableRule忽略那些短路的服务器,并选择并发数较低的服务器。
RandomRule随机选择一个可用的服务器。
RetryRule重试机制的选择逻辑

默认的实现就是ZoneAvoidanceRule,是一种轮询方案

自定义负载均衡策略

在服务消费者的启动类中定义新的IRule

@Bean
public IRule randomRule(){
    return new RandomRule();
}

并在对应service模块的application.yml中添加新的配置

# 给某个微服务配置负载均衡规则,这里是userservice服务
userservice: 
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则 

注意,一般用默认的负载均衡规则,不做修改。

饥饿加载

Ribbon默认采用懒加载,即第一次访问时才会去创建LoadBalancerClient,请求时间比较长
饥饿加载会在项目启动时创建,降低第一次访问的耗时
开启饥饿加载:

ribbon:
  eager-load:
    enabled: true
    clients: userservice

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

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

相关文章

解析QAnything启动命令过程

一.启动命令过程日志 启动命令bash ./run.sh -c local -i 0 -b hf -m Qwen-1_8B-Chat -t qwen-7b-chat。输入日志如下所示: rootMM-202203161213:/mnt/l/20230918_RAG方向/QAnything# bash ./run.sh -c local -i 0 -b hf -m Qwen-1_8B-Chat -t qwen-7b-chat From …

Spring Boot如何集成Spring Security?

🍅 作者简介:哪吒,CSDN2021博客之星亚军🏆、新星计划导师✌、博客专家💪 🍅 哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师 🍅 技术交流:定期更新…

1-3.文本数据建模流程范例

文章最前: 我是Octopus,这个名字来源于我的中文名–章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的…

算法笔记:模拟过程(螺旋遍历矩阵)

1 模拟过程 “模拟过程题”通常指的是那些要求编程者通过编写代码来“模拟”或重现某个过程、系统或规则的题目。这类题目往往不涉及复杂的数据结构或高级算法,而是侧重于对给定规则的精确执行和逻辑的清晰表达。 其中螺旋遍历矩阵的题目就是一类典型的模拟过程题…

代码随想录-Day44

322. 零钱兑换 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。 你可以认为每种硬币的数…

ARCGIS python 裁剪栅格函数 arcpy.management.Clip

ARCGIS python 裁剪栅格函数 arcpy.management.Clip 1 功能 裁剪掉栅格数据集、镶嵌数据集或图像服务图层的一部分。 2 使用情况 基于模板范围提取部分栅格数据集,输出与模板范围相交的所有像素使用以 x 和 y 坐标的最小值和最大值确定的包络矩形或使用输出范围文…

商汤上海AI实验室联合发布:自动驾驶全栈式高精度标定工具箱(含车、IMU、相机、激光雷达等的标定)

前言 在自动驾驶技术飞速发展的今天,传感器的精确标定对于确保系统性能至关重要。SensorsCalibration,一个专为自动驾驶车辆设计的标定工具箱,提供了一套全面的解决方案,用于校准包括IMU、激光雷达、摄像头和雷达在内的多种传感器…

Evented PLEG: iSulad 稳态 CPU 利用率降低30%的关键特性

背景 容器技术在不断发展的过程中,已被广泛应用于多种场景。OpenAtom openEuler(简称"openEuler") 社区容器引擎项目 iSulad[1]面向 CT、IT 领域的不同需求而生,它具有轻量级、高性能的特点,可以在资源受限…

vue3引入本地静态资源图片

一、单张图片引入 import imgXX from /assets/images/xx.png二、多张图片引入 说明:import.meta.url 是一个 ESM 的原生功能,会暴露当前模块的 URL。将它与原生的 URL 构造器 组合使用 注意:填写自己项目图片存放的路径 /** vite的特殊性…

技术干货丨基于MotionView的虚拟路面疲劳分析

虚拟路面VPG(Virtual Proving Ground)现在正被广泛应用于汽车的疲劳耐久分析中,相较于传统的道路载荷谱数据采集的疲劳计算方法,虚拟路面VPG技术可以极大地节省载荷谱的获取时间并降低测试成本。 本文将给大家介绍汽车悬挂系统中的…

一文讲解Docker入门到精通

一、引入 1、什么是虚拟化 在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,它允许在一台物理机上创建多个独立的虚拟环境,这些环境被称为虚拟机(VM)。每个虚拟机都可以…

无锁编程——从CPU缓存一致性讲到内存模型(1)

一.前言 1.什么是有锁编程,什么是无锁编程? 在编程中,特别是在并发编程的上下文中,“无锁”和“有锁”是描述线程同步和资源访问控制的两种不同策略。有锁(Locked): 有锁编程是指使用锁(例如互…

基于JSP技术的校园餐厅管理系统

开头语: 你好呀,我是计算机学长猫哥!如果您对校园餐厅管理系统感兴趣或有相关需求,欢迎随时联系我。我的联系方式在文末,期待与您交流! 开发语言:Java 数据库:MySQL 技术&#x…

MySQL 8 命令安装卸载教程

一、下载MySQL8 下载连接 MySQL :: Download MySQL Community Server 我下载的是当前最新版8.4 二、安装 1.解压 解压到需要安装的位置,例如我的位置: 2.创建配置文件 新建文本文档,复制下面配置文件(注意修改路经)…

Cesium大屏-vue3注册全局组件

1.需求 说明:产品经理要求开发人员在地图大屏上面随意放置组件,并且需要通过数据库更改其组件大小,位置等;适用于大屏组件中场站视角、任意位置标题等。 2.实现 2.1GlobalComponents.vue 说明:containerList可以通…

javascript 常见设计模式

什么是设计模式? 在软件开发中,设计模式是解决特定问题的经验总结和可复用的解决方案。设计模式可以提高代码的复用性、可维护性和可读性,是提高开发效率的重要手段。 单例模式 1.概念 单例模式 (Singleton Pattern)&#xf…

ssm校园二手交易平台小程序

设计技术: 开发语言:Java数据库:MySQL技术:SpringMybatisSpringMvc微信小程序 工具:IDEA、Maven、Navicat 主要功能: (a) 管理员;管理员进入系统主要功能包括首页,个人中心&…

RedHat9 | 内部YUM本地源服务器搭建

服务器参数 标识公司内部YUM服务器主机名yum-server网络信息192.168.37.1/24网络属性静态地址主要操作用户root 一、基础环境信息配置 修改主机名 [rootyum-server ~]# hostnamectl hostname yum-server添加网络信息 [rootyum-server ~]# nmcli connection modify ens160 …

红黑树模拟

1.红黑树概念 红黑树,是一种二叉搜索树,但每个节点上增加了一个存储位表示结点的颜色,可以是RED或BLACK。通过任何一条根到叶子节点的途径上各个节点的着色方式的限制,红黑树确保没有一条路径会超过其他路径的二倍,因…

MySQL InnoDB Cluster 高可用集群部署

MySQL InnoDB Cluster 简介 官方文档:https://dev.mysql.com/doc/refman/8.4/en/mysql-innodb-cluster-introduction.html 本章介绍 MySQL InnoDB Cluster,它结合了 MySQL 技术,使您能够部署和管理完整的 MySQL 集成高可用性解决方案。 说…