Spring cloud Ribbon负载均衡实战

news2025/1/12 1:35:53

Spring cloud Ribbon负载均衡

    • 一、简介
    • 二、负载均衡不同方案的区别
      • 1、集中式负载均衡(服务器负载均衡)
      • 2、进程内负载均衡(客户端负载均衡)
    • 三、负载均衡策略
      • 1、轮询策略(默认)
      • 2、权重轮询策略
      • 3、随机策略
      • 4、最少并发数策略
      • 5、重试策略
      • 6、可用性敏感策略
      • 7、区域敏感性策略
    • 四、自定义负载均衡策略
      • 4.1 切换负载均衡算法
      • 4.2 自定义算法

一、简介

Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具,他是基于 Netftix Ribbon 实现的。其不是独立部署,但是几乎存在于每个 Spring Cloud 微服务中,包括 Feign 提供的声明式服务调用也是基于 Ribbon 实现的。

二、负载均衡不同方案的区别

1、集中式负载均衡(服务器负载均衡)

在 consumer 和 provider 之间使用独立的负载均衡设施(可以是硬件,如 F5,也可以是软件,如nginx),由该设施负责把请求通过某种策略发送至 provider

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GZhy3iFF-1670555956367)(img/集中式负载均衡.png)]

2、进程内负载均衡(客户端负载均衡)

将负载均衡逻辑集成到 consumer ,consumer 从注册中心获取可用地址,然后选择合适的 provider。 Ribbon 属于后者,他是一个类库,集成于 consumer ,consumer 通过其获取 provider 地址

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wbrfqDcy-1670555956368)(img/进程内负载均衡.png)]

三、负载均衡策略

1、轮询策略(默认)

策略对应类:RoundRubinRule

实现原理:轮询策略表示每次都顺序取下一个 provider

2、权重轮询策略

策略对应类:WeightedResponseTimeRule

实现原理:

  • 根据每个 provider 的响应时间分配权重,响应时间越长,权重越小,被选中的可能性越低
  • 原理:一开始为轮询,并开启一个计时器,每 30s 收集一次每个 provider 的平均响应时间,当信息足够时,给每个 provider 附上一个权重,并按权重随机选择 provider,高权重的 provider 会被高概率选中

3、随机策略

策略对应类:RandomRule

实现原理:从 provider 列表中随机选择一个

4、最少并发数策略

策略对应类:BestAvailableRule

实现原理:选择正在请求的并发数量最小的 provider ,除非这个 provider 熔断中

5、重试策略

策略对应类:RetryRule

实现原理:轮询策略增强版,轮询策略服务不可用时不做处理,重试策略服务不可用时会重新尝试集群中的其他节点

6、可用性敏感策略

策略对应类:AvailabilityFilteringRule

实现原理:过滤性能差的 provider

  • 第一种:过滤掉在 Eureka 中处于一直连接失败的 provider
  • 第二种:过滤掉高并发的 provider

7、区域敏感性策略

策略对应类:ZoneAvoidanceRule

实现原理:过滤性能差的 provider

  • 以一个区域为单位考察可用性,对于不可用的区域整个丢弃,从剩下的区域中选取可用 provider
  • 如果这个 ip 区域内有一个或多个实例不可达或响应变慢,都会降低该 ip 区域内其他 ip 被选中的权重

四、自定义负载均衡策略

4.1 切换负载均衡算法

  • pom
<!-- Eureka 和 OpenFeign 中均有集成-->	
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
  • application
// MySelfRule.class 不可在ComponentScant扫描包中,否则会导致所有RibbonClient都进行负载均衡
@RibbonClient(name = "cloud-payment",configuration = MySelfRule.class)  
@EnableEurekaClient
@SpringBootApplication
public class OrderApplication01 {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication01.class, args);
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nxoDwKou-1670555956368)(img/自定义负载均衡策略目录结构.png)]

  • MySelfRule
@Configuration
public class MySelfRule {
    @Bean // 这里是引用的轮询算法
    public IRule myRule() {
        return new RandomRule(); // 随机
    }
}

4.2 自定义算法

  • pom
<!-- Eureka 和 OpenFeign 中均有集成-->	
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>	
  • application
@EnableEurekaClient
@SpringBootApplication
public class OrderApplication02 {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication02.class, args);
    }
}
  • loadBancer算法
@Component // LoadBalancer 接口仅做标识
public class MyLB implements LoadBalancer {

    private AtomicInteger atomicInteger = new AtomicInteger(0);

    /**
     * 获取当前轮到的服务
     * 轮询策略
     *
     * @param serviceInstances 所有可用服务列表
     * @return 服务
     */
    @Override
    public ServiceInstance instances(List<ServiceInstance> serviceInstances) {
        return serviceInstances.get(getAndIncrement() % serviceInstances.size());
    }

    /**
     * 获取当前请求次数
     *
     * @return next
     */
    public final int getAndIncrement() {
        int current;
        int next;
        do {
            current = this.atomicInteger.get();
            next = current >= Integer.MAX_VALUE ? 0 : current + 1;
        } while (!this.atomicInteger.compareAndSet(current, next));
        System.out.println("******************next" + next);
        return next;
    }

}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uD5PHcEG-1670555956369)(img/image-20221103143206106.png)]

  • controller
@RestController
@RequestMapping("/order")
public class OrderController {
    @Autowired
    private LoadBalancer loadBalancer;
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("/lb")
    public String getLB() {
        // 获取所有可用服务
        List<ServiceInstance> serviceInstances = discoveryClient.getInstances("cloud-payment");
        if (serviceInstances == null || serviceInstances.size() <= 0) {
            return null;
        }
		
        // 使用自定义算法选择被调服务
        ServiceInstance instances = loadBalancer.instances(serviceInstances);
        URI uri = instances.getUri();
        return restTemplate.getForObject(uri + "/payment/lb", String.class);
    }
}

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

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

相关文章

导入vue+springboot前后端分离项目

1、环境 1、前端 nodejs 12.1.0vscode或者webstorm 2、后端 jdk1.8maven3.6.3&#xff08;3以上即可&#xff09;sqlyogidea 1、导入数据库 点击右键创建同名的数据库 将sql文件导入到数据库中 右键编辑文件&#xff0c;ctrla选中全部语句&#xff0c;ctrlc进行复制&…

Go 实现选择排序算法及优化

Go 实现选择排序算法及优化选择排序图片演示普通算法优化算法小结耐心和持久胜过激烈和狂热。 哈喽大家好&#xff0c;我是陈明勇&#xff0c;今天分享的内容是使用 Go 实现选择排序算法。如果本文对你有帮助&#xff0c;不妨点个赞&#xff0c;如果你是 Go 语言初学者&#xf…

一只脚踏入数据结构的大门,如何用C语言实现一个单链表(超超超详解,我的灵魂受到了升华)

目录 0.前言 1.什么是链表 1.1链表简介 1.2链表的分类 1.3为什么要有链表&#xff08;vs顺序表&#xff09; 1.3.1顺序表的缺点 1.3.2 链表的优点 1.3.3 顺序表的优点是链表的缺点 1.4.为什么选择实现结构最简单的单链表 2* 什么是单链表&#xff08;两种理解逻辑&…

window10+TensorRT-8.2.5.1+yolov5 v6.2 c++部署

一、准备工具 1.1、visual studio下载安装 参考&#xff1a;vs2019社区版下载教程&#xff08;详细&#xff09;_Redamancy_06的博客-CSDN博客_vs2019社区版 1.2、显卡驱动cudacudnn安装 参考&#xff1a;win10系统3060显卡驱动cuda11.5cudnn8.3安装_Bubble_water的博客-CS…

手写Spring3(Bean构造函数的类实例化策略)

文章目录目标项目结构一、代码实现1、新增getBean接口2、定义实例化策略接口3、JDK 实例化4、Cglib 实例化5、创建策略调用二、测试1、准备2、测试用例3、测试结果目标 上一篇文章&#xff0c;我们实例化对象&#xff0c;是通过无参的构造方式生成 所以今天是解决包含参数的构…

docker镜像的导入导出,并发布到服务器上

比如我本地的vue项目&#xff0c;先打包编译为一个镜像&#xff1a; docker build -t cvport . 不会编译的可以看我这篇文章&#xff1a;使用docker构建vue项目并成功运行在本地和线上_1024小神的博客-CSDN博客 开始将镜像保存为一个tar文件&#xff1a; docker save -o cvp…

基于java+springmvc+mybatis+jsp+mysql的高校学术交流平台

项目介绍 高校学术交流平台是基于java编程语言&#xff0c;mysql数据库&#xff0c;ssm框架&#xff0c;idea开发工具开发&#xff0c;本系统有管理员和用户两个角色&#xff0c;其中用户可以注册登陆系统&#xff0c;查看校园资讯&#xff0c;学术交流帖子&#xff0c;发布帖…

Akka 学习(五)消息传递的方式

目录一 消息传递方式1.1 消息不可变1.2 ASK消息模式1.3 Tell消息模式1.4 Forward消息模式1.4 Pipe消息模式有4种核心的Actor消息模式&#xff1a;Tell、Ask、Forward和Pipe。一 消息传递方式 在这里&#xff0c;将从Actor之间发送消息的角度来介绍所有关于消息传递的概念。 ● …

【多线程(六)】并发工具类的基本使用、ConcurrentHashMap1.7版本及1.8版本底层原理分析

文章目录6.并发工具类6.1 并发工具类-Hashtable6.2 并发工具类-ConcurrentHashMap基本使用6.3 并发工具类-ConcurrentHashMap1.7原理6.4 并发工具类-ConcurrentHashMap1.8原理6.5 并发工具类-CountDownLatch6.6并发工具类-Semaphore总结6.并发工具类 6.1 并发工具类-Hashtable…

一文看懂MySQL中order by排序语句的原理

order by 是怎么工作的&#xff1f; 表定义 CREATE TABLE t1 ( id int(11) NOT NULL, city varchar(16) NOT NULL, name varchar(16) NOT NULL, age int(11) NOT NULL, addr varchar(128) DEFAULT NULL, PRIMARY KEY (id), KEY city (city)) ENGINEInnoDB;SQL语句可以…

零基础入门JavaWeb——Vue的生命周期

一、概念 在编程领域&#xff0c;生命周期是一个很常见的概念。一个对象从创建、初始化、工作、释放、清理和销毁&#xff0c;会经历很多环节的演变。 二、Vue对象的生命周期 三、生命周期钩子函数 Vue允许在特定的生命周期环节中通过钩子函数加入我们的代码。 3.1 示例代码…

基于双向LSTM模型进行电力需求预测(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f389;作者研究&#xff1a;&#x1f3c5;&#x1f3c5;&#x1f3c5;主要研究方向是电力系统和智能算法、机器学…

尚硅谷笔记——求和案例纯react版、redux精简版

家人们天气冷啦注意保暖呀&#xff0c;不要像我一样因为冷而不想起床学习&#xff0c;冬日里也不能放弃训练 看了两遍尚硅谷的redux课程&#xff0c;把reduc案例代码重新敲了一次为了加深印象还是写个播客把&#xff0c;强烈推荐大家看尚硅谷课太细致啦 redux 是什么&#x…

即将到来的2023,国内元宇宙开始“割”企业了?

元宇宙爆火一年后&#xff0c;UTONMOS即将成为全球化全部实现ERC-721协议NFT链上垂直游戏价值生态的系统平台&#xff0c;旨在通过利用自身所拥有的各类头部资源和游戏化打造内容层的融合&#xff0c;建立一个元气满满的元宇宙Web3.0平台。 通过数字藏品技术的应用&#xff0c…

Flask框架

Flask一 前言二 快速使用三 内置配置变量四 配置文件的写法五 路由六 cbv写法6.1 快速使用6.2 cbv加装饰器6.3 as_view的执行流程6.4 as_view的name参数6.5 继承View写cbv七 模板语法7.1 渲染变量7.2 变量的循环7.3 逻辑判断一 前言 Flask是一个基于Python开发并且依赖jinja2模…

Fluent中模型设置和数据的复用

1 背景 在实际工程中&#xff0c;必然存在利用仿真比较各类设计方案优劣的场景。 对于复杂模型&#xff0c;逐个设置各个设计方案的仿真模型并从头开始计算结果&#xff0c;既易错也耗时。因此需要通过模型设置和数据的复用&#xff0c;达到防错和提高工作效率。 2 模型设置复…

基于Docker做MySQL主从搭建与Django的读写分离

目录 基于Docker做MySQL主从搭建 django读写分离 基于Docker做MySQL主从搭建 主从的作用&#xff1a;写数据数据时使用主库&#xff0c;从库只用来读数据&#xff0c;这样做能够减少数据库压力&#xff0c;主从搭建可以一主一从&#xff0c;也可以是一主多从。 mysql主从配…

肝2022世界杯,怒写企业级镜像私仓Docker+Harbor实践

2022-12-09 揭幕2022卡塔尔世界杯4强角逐的第一天&#xff0c;越来越精彩了 同时记录程序猿的成长~ 1.背景 由于期望搭建一个企业级CICD的环境&#xff0c;开始尝试常规的gitlabjenkinsk8sdocker harborspringboot开始练手 其中版本如下&#xff1a; 1.gitlab: GitLab Com…

天权信安catf1ag网络安全联合公开赛---wp

文章目录misc简单隐写十位马WebhistoryCrypto疑惑ezrsapasswdre遗失的物品misc 简单隐写 丢进kali binwalk 分离一下 得到一个加密的压缩包 内含flag.txt 使用jphs无密码得到一个txt 得到password:catf1agcatf1agcatf1ag 解压压缩包得到一串字符串 dbug1bh{KQit_x1o_Z0v_…

threejs官方demo学习(2):相机

webgl_camera 不知道是哪里写的有问题&#xff0c;最终的效果&#xff0c;跟官方案例有比较大的差距。不过可以学到的知识点挺多的。 知识点 CameraHelper 相机辅助对象&#xff0c;用于模拟相机视锥体 // 创建透视相机 cameraPerspective new THREE.PerspectiveCamera(5…