SpringCloud学习笔记-Ribbon负载均衡

news2024/9/24 15:25:53

目录

  • 1.负载均衡策略
  • 2.自定义负载均衡策略
  • 3.饥饿加载

SpringCloudRibbon的底层采用了一个拦截器,拦截了RestTemplate发出的请求,对地址做了修改。用一幅图来总结一下:
在这里插入图片描述
基本流程如下:

  • 拦截我们的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,发起真实请求

1.负载均衡策略

在这里插入图片描述
不同规则的含义如下:

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

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

2.自定义负载均衡策略

通过定义IRule实现可以修改负载均衡规则,有两种方式:

  1. 代码方式:在order-service中的OrderApplication类中,定义一个新的IRule:
@Bean
public IRule randomRule(){
    return new RandomRule();
}
  1. 配置文件方式:在order-service的application.yml文件中,添加新的配置也可以修改规则:
userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则 

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

3.饥饿加载

Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。

而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每日练习-9

目录 1、井字棋 2、密码强度等级 3、二维数组中的查找 4.调整数组奇数偶数 5.旋转数组中的最小元素 6、替换空格 1、井字棋 解析:井字棋有四种情况表示当前玩家获胜,行全为1, 列全为1,主对角全为1, 副对角全为1。遍历…

pytorch学习------TensorBoard的使用

目录 简介使用方式1、单条曲线(scalar)2、多条曲线(scalars)3、直方图(histogram)4、图片(image)5、渲染(figure)6、网络(graph) 简介 建好一个神经网络,其实我们也不知道神经网络里头具体细节到底做了什么,要人工调试十分困难(就好比你无法想象出递归的…

Markdown文本编辑器常用操作介绍

文章目录 标题文本样式列表图片链接目录插入代码插入表格 背景说明 Markdown语言是国际杂志编辑以及许多写作者都广泛使用的写作语言它使用一些简单的符号(* / > [] () #)来标记文本格式其简洁的语法、优美的格式以及强大的软件支持深受广大网友的喜…

基于蝠鲼觅食优化的BP神经网络(分类应用) - 附代码

基于蝠鲼觅食优化的BP神经网络(分类应用) - 附代码 文章目录 基于蝠鲼觅食优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.蝠鲼觅食优化BP神经网络3.1 BP神经网络参数设置3.2 蝠鲼觅食算法应用 4.测试结果…

Java @Override 注解

在代码中,你可能会看到大量的 Override 注解。 这个注解简单来说就是让编译器去读的,能够避免你在写代码的时候犯一些低级的拼写错误。 Java Override 注解用来指定方法重写(Override),只能修饰方法并且只能用于方法…

自定义背景画词云图(中文)

背景 词云图还是挺需要用的吧,大量的词中,我们可以快速捕捉到高频的关键的词汇。 环境:python3 对csv文件里面某列所有字符串画词云图(中文的字符) 新安装环境: 1.下载中文字体SimHei.ttf,并放…

C++DAY41

#include <iostream>using namespace std;class Per { private:string name;int age;float* height;float* weight; public:Per(){cout << "Per::无参构造函数" << endl;}Per(string name,int age,float* height,float* weight):name(name),age(ag…

RustDay01——运行在线GitHub Rust环境

1.跟着教程进入GitHub教室 2. 授权确认后进入学习空间 3.点击链接进入在线平台 4.添加本机密钥对到GitHub 5. 安装依赖 我们使用在线的Linux试验平台&#xff0c;就自动帮我们clone好了仓库 我们直接在仓库目录执行 cargo install --force --path . 安装依赖 PS:其实刚开始…

Godot 添加信号

前言 Godot 里面C#和GDScirpt 的用法完全不一样&#xff0c;网上相关资料太少了。 什么是信号 信号分为信号源&#xff0c;触发&#xff0c;目的节点。信号源在某些条件下触发信号&#xff0c;比如按钮点击&#xff0c;鼠标悬停等事件 #mermaid-svg-wyr9ARVcBFmUUu8y {font-…

哈希传递原理

哈希传递只针对相同密码进行攻击。 NTLM认证流程 NTLM加密&#xff1a; admin -> hex(16进制编码) 61646d696e61646d696e-> Unicode 610064006d0069006e00610064006d0069006e00–>MD4209c6174da490caeb422f3fa5a7ae634 认证过程&#xff1a; 注意:challenge每次认证…

【C++】list基本接口+手撕 list(详解迭代器)

父母就像迭代器&#xff0c;封装了他们的脆弱...... 手撕list目录&#xff1a; 一、list的常用接口及其使用 1.1list 构造函数与增删查改 1.2list 特殊接口 1.3list 排序性能分析 二、list 迭代器实现&#xff08;重点难点&#xff09; 关于迭代器的引入知识&#xff1a…

项目管理入门指南:如何快速上手?

面对复杂的项目任务&#xff0c;如何入手项目管理呢&#xff1f;在项目管理过程中需要面对许多繁杂的问题以及复杂的流程&#xff0c;还涉及到与团队成员的沟通协作。如果单单依靠人的注意力与记忆&#xff0c;可能没有办法兼顾多个方面。一个靠谱好用的项目管理工具可以帮助您…

HTTPS建立连接的过程

HTTPS 协议是基于 TCP 协议的&#xff0c;因而要先建立 TCP 的连接。在这个例子中&#xff0c;TCP 的连接是在手机上的 App 和负载均衡器 SLB 之间的。 尽管中间要经过很多的路由器和交换机&#xff0c;但是 TCP 的连接是端到端的。TCP 这一层和更上层的 HTTPS 无法看到中间的包…

如何正确方便的理解双指针?力扣102 (二叉树的层序遍历)

双指针&#xff0c;顾名思义就是指针的指针。 在此之前我们需要先理解单指针 &#xff08;简称为指针&#xff09;。指针很简单&#xff0c;直接上例子&#xff1a;例&#xff1a;现有两个变量&#xff0c;a10,b20. 要求&#xff1a;交换他们的值&#xff0c;输出的结果应为a20…

操作系统 —— 进程篇

文章目录 进程的概念程序的概念进程控制块 PCB进程的组成进程状态进程状态转换 进程队列进程的组织进程控制内核的两大功能进程创建进程终止进程阻塞与唤醒进程切换 进程通信 进程的概念 进程是操作系统中的基本概念&#xff0c;用于描述正在运行的程序实例。 它是计算机系统…

GG-Net: 超声图像中乳腺病变分割的全局指导网络

ATTransUNet 期刊分析摘要贡献方法整体框架1. Global Guidance Block2. Spatial-wise Global Guidance Block3. Channel-wise Global Guidance Block4. Breast Lesion Boundary Detection Module 实验1. 对比实验2. 消融实验2.1 Ablation Analysis of our GG-Net2.2 Ablation A…

maven_修改项目名_修改模块名_复制模块_导入模块

修改模块名 1、删除.idea和.iml 2、修改gav(记得修改子模块) 复制模块名&修改模块名 1、复制文件并修改artifactId

(二)Web服务器之Linux多进程

一、基础概念 Linux操作系统一般由以下四个主要部分组成&#xff1a;内核、shell、文件系统和应用程序 。 内核&#xff08;Kernel&#xff09;&#xff1a;是操作系统的核心部分&#xff0c;负责管理系统的硬件资源、进程管理、内存管理、文件系统等。它直接与硬件交互&…

Java中的 try-finally 代码块的题目

class Test4 {int i 1;public static void main(String[] args) {System.out.println("i的值&#xff1a;" new Test4().test());}int test() {try {// 当 try 代码块执行 return 语句时&#xff0c;返回值已经被确定并保存下来&#xff0c;等待方法结束后返回。尽…

网络原理必知会

前言&#xff1a; 网络初始&#xff1a;对于网络有一个直观的大体的认识 网络编程&#xff1a;让我们真正通过代码感受网络通信程序 网络原理&#xff1a;进一步的理解网络是如何工作的&#xff0c;以理论为主&#xff0c;很多比较抽象的东西&#xff0c;同时这里也包含大量的面…