SpringCloud之负载均衡Ribbon

Ribbon

是一个客户端负载均衡工具,主要功能是将面向服务的Rest模板(RestTemplate)请求转换成客户端负载均衡的服务调用。通过Ribbon,开发人员可以在客户端实现请求的负载均衡,而无需单独部署负载均衡器。Ribbon支持多种负载均衡算法,如轮询、随机、加权等,只需要在配置文件类中添加@LoadBalanced

Ribbon配置在消费者模块中

之前写过消费者的模块 =>SpringCloud之消费者

本文章的目的是:利用Ribbon实现负载均衡

在这里插入图片描述

消费者模块

1、导入依赖

  <!-- ribbon  & eureka       --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-ribbon</artifactId><version>1.4.6.RELEASE</version></dependency>

2、创建配置文件类

只需要在RestTemplate上添加 @LoadBalanced注解

@Configuration
public class ConfigBean {/*** http请求* @return*/@Bean@LoadBalanced // 使用Ribbonpublic RestTemplate getRestTemplate(){return new RestTemplate();}@Beanpublic IRule getRule(){return new RandomRule(); // 随机
//        return new MyRule(); 自定义}}

3、定义负载均衡的规则

实现了IRule的实现类如下:
在这里插入图片描述

实现Rule的实现类

具体实现类作用如下:

RandomRule:随机规则。使用Random对象从服务列表中随机选择一个服务实例。这种规则在每次请求时都会随机选择一个服务实例,有助于实现请求的均匀分布。RoundRobinRule:轮询规则。这是Ribbon的默认规则,也是更高级规则的回退策略。它按照顺序依次选择服务实例进行调用,实现了一种简单的负载均衡。RetryRule:重试规则。这种规则首先使用RoundRobinRule进行服务实例选择,如果选择服务实例失败或在指定时间内没有响应,则会在一定时间内不断进行重试,直到找到可用的服务实例或超时。WeightedResponseTimeRule:加权响应时间规则。这种规则会根据每个服务实例的平均响应时间计算权重,响应时间越快的服务实例权重越高,被选中的概率也越高。这种规则能够优先将请求分发给性能更好的服务实例。BestAvailableRule:最佳可用规则。它会选择并发量最小的服务实例进行调用,有助于平衡各个服务实例的负载。ZoneAvoidanceRule:区域感知规则。在非AWS环境下,可以将其理解为根据机房或Eureka集群来选择服务实例。它会优先选择同区域的服务实例,当同区域的服务实例不可用时,才会选择其他区域的服务实例。

4、自定义负载均衡的规则

自定义负载均衡需要注意的是自己创建的MyRule类不能和项目启动器类放在同一个文件夹内,即不能被Spring Boot扫描到。所以需要放置在启动类所在的包之外的独立包中。

/***  注意 这个类不能被主启动类扫描 所以需要放在com.jyl下的目录*/
@Configuration
public class MyRule  extends AbstractLoadBalancerRule {/*** 实现一个每个服务只能访问5次,访问五次后换下一个服务* @param lb* @param key* @return*/private int total = 0 ;// 被调用的次数private int currentIndex = 0 ; // 当前被调用的服务public MyRule(){}//    @SuppressWarnings({"RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE"})public Server choose(ILoadBalancer lb, Object key) {if (lb == null) {return null;} else {Server server = null;while(server == null) {if (Thread.interrupted()) {return null;}// 获得活着的服务List<Server> upList = lb.getReachableServers();// 获得全部的服务List<Server> allList = lb.getAllServers();int serverCount = allList.size();if (serverCount == 0) {return null;}
//                // 生成区间随机数
//                int index = this.chooseRandomInt(serverCount);
//                // 随机获取一个
//                server = (Server)upList.get(index);if(total < 5){server = upList.get(currentIndex);total++;}else {total = 0 ;currentIndex++ ; // 5 + 1if (currentIndex > upList.size()){currentIndex = 0 ;}// 从活着的服务中, 获取指定的服务来进行操作server = upList.get(currentIndex);}if (server == null) {Thread.yield();} else {if (server.isAlive()) {return server;}server = null;Thread.yield();}}return server;}}protected int chooseRandomInt(int serverCount) {return ThreadLocalRandom.current().nextInt(serverCount);}public Server choose(Object key) {return this.choose(this.getLoadBalancer(), key);}public void initWithNiwsConfig(IClientConfig clientConfig) {}
}

5、启动器类

需要添加@RibbonClient注解 需要的参数是name=“Eureka界面中的Application提供者的名称” 和configuration =自定义类

@SpringBootApplication
@EnableEurekaClient
//再微服务启动的时候就可以加载自定义ribbon类
@RibbonClient(name = "SPRINGCLOUD-PROVIDER-DEPT",configuration = MyRule.class)
public class DeptConsumer_80 {public static void main(String[] args) {SpringApplication.run(DeptConsumer_80.class,args);}
}

6、创建数据库&提供者模块

到这里还没有结束 ,需要体验到负载均衡的效果,需要使用三个提供者,三个提供者要使用不同的数据库

之前有写过提供者的案例=>这里!!!

创建数据库名db01、db02、db03,创建相同的dept表如下:

CREATE TABLE `dept` (`deptno` bigint(20) NOT NULL AUTO_INCREMENT,`dname` varchar(50) DEFAULT NULL,`db_source` varchar(50) DEFAULT NULL,PRIMARY KEY (`deptno`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

只需要修改配置文件中的数据库名提供者依次连接数据库,如:提供者1连接db01

# spring 的配置spring:application:name: springcloud-provider-deptdatasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: org.gjt.mm.mysql.Driverurl: jdbc:mysql://localhost:3306/数据库名?useUnicode=true&useSSL=false&characterEncoding=utf-8username: rootpassword: root

7、启动eureka&提供者

启动3个eureka服务、3个提供者和一个消费者
在这里插入图片描述
随机访问一个eureka服务界面
比如访问:http://localhost:7001/ 说明3个提供者已经注册到了eureka集群中了

在这里插入图片描述

8、测试负载均衡

默认的负载均衡策略是轮询
在这里插入图片描述
如果需要修改负载均衡策略可以再配置文件类中设置

@Configuration
public class ConfigBean {@Beanpublic IRule getRule(){return new RandomRule(); // 随机
//        return new MyRule(); 自定义}
}

【每日自勉+1】“业精于勤,荒于嬉;行成于思,毁于随。”——韩愈。

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

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

相关文章

在config.json文件中配置出来new mars3d.graphic.PolylineCombine({大量线合并渲染类型的geojson图层

在config.json文件中配置出来new mars3d.graphic.PolylineCombine({大量线合并渲染类型的geojson图层 问题场景&#xff1a; 1.浏览官网示例的时候图层看到大量线数据合并渲染的示例 2.矢量数据较大量级的时候&#xff0c;这种时候怎么在config.json文件中尝试配置呢&#x…

软件更新 | TSMaster 2024.04 最新版已上线,来看看新增了哪些实用功能

TSMaster是集汽车总线嵌入式代码生成、监控、仿真、开发、UDS诊断、CCP/XCP标定、ECU刷写、I/O控制、测试测量等功能于一体的国产软件工具。在最新更新的软件版本里&#xff0c;增加了很多新功能&#xff0c;其中期待已久的DoIP诊断功能终于在最新升级版本里可以实现&#xff0…

Redis__数据类型

文章目录 &#x1f60a; 作者&#xff1a;Lion J &#x1f496; 主页&#xff1a; https://blog.csdn.net/weixin_69252724 &#x1f389; 主题&#xff1a;Redis__数据类型 ⏱️ 创作时间&#xff1a;2024年04月28日 ———————————————— 这里写目录标题 文…

理清STM32的内存(ram)与flash(rom)空间

keil工程变异代码的时候&#xff0c;会有如下输出信息 code:代码机器编译后生成的一系列指令&#xff0c;永远只放在flsah&#xff0c;内存ram不会存在&#xff1b; RO-data:只读常量&#xff0c;永远只放在flash内&#xff0c;存ram不会存在&#xff1b;&#xff1b; RW-dat…

SCP收容物001

注 &#xff1a;本文是特别版&#xff0c;本文只供开玩笑 ,与steve_gqq_MC合作。 --------------------------------------------------------------------------------------------------------------------------------- 前言&#xff1a;我的第一篇文章说过&#xff0c;SC…

【树莓派】yolov5 Lite,目标检测,行人检测入侵报警,摄像头绑定

延续之前的程序&#xff1a; https://qq742971636.blog.csdn.net/article/details/138172400 文章目录 播放声音pygame不出声音怎么办&#xff08;调节音量&#xff09;树莓派上的音乐播放器&#xff08;可选&#xff09;命令行直接放歌&#xff08;尝试放mp3歌曲&#xff09; …

word添加行号

打开页面设置&#xff0c;找到行号

Java设计模式 _创建型模式_工厂模式(普通工厂和抽象工厂)

一、工厂模式 属于Java设计模式创建者模式的一种。在创建对象时不会对客户端暴露创建逻辑&#xff0c;并且是通过使用一个共同的接口来指向新创建的对象。 二、代码示例 场景&#xff1a;花店有不同的花&#xff0c;通过工厂模式来获取花。 1、普通工厂模式 逻辑步骤&#…

【算法每日一练】

蛮有意思的的一道题&#xff0c;最后要判断能否成为一种1~n的全排列&#xff0c;我最这样做的&#xff1a; 整个数组先排序一下。假设遍历到了i&#xff0c;那就判断前面b和r的个数&#xff0c;但是有想到了后面可能还会对前面的结果产生影响&#xff0c;所以就抛弃了这个想法…

安卓intent+传递Serializable接口

从Mainactivity1传递对象给MainActivity2可以通过Serializable对象。 <?xml version"1.0" encoding"utf-8"?> <LinearLayoutxmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.co…

鸿蒙开发HarmonyOS4.0入门与实践

鸿蒙开发HarmonyOS4.0 配合视频一起食用&#xff0c;效果更佳 课程地址&#xff1a;https://www.bilibili.com/video/BV1Sa4y1Z7B1/ 源码地址&#xff1a;https://gitee.com/szxio/harmonyOS4 准备工作 官网地址 鸿蒙开发者官网&#xff1a;https://developer.huawei.com/con…

纯血鸿蒙APP实战开发——全局状态保留能力弹窗

全局状态保留能力弹窗 介绍 全局状态保留能力弹窗一种很常见的能力&#xff0c;能够保持状态&#xff0c;且支持全局控制显隐状态以及自定义布局。使用效果参考评论组件 效果图预览 使用说明 使用案例参考短视频案例 首先程序入口页对全局弹窗初始化&#xff0c;使用Globa…

高扬程水泵,提升水源新选择!— 恒峰智慧科技

在炎炎夏日&#xff0c;阳光炙烤着大地&#xff0c;森林火灾的发生频率也随之上升。火势猛烈&#xff0c;烟雾弥漫&#xff0c;给森林带来了极大的破坏。为了保护森林资源&#xff0c;我们必须采取有效的措施来扑灭火灾。而在这其中&#xff0c;高扬程水泵成为了提升水源新选择…

笔记:编写程序,绘制一个展示马尾松、樟树、杉木、 桂花 4 个树种不同季节的细根生物量的误差棒图。

文章目录 前言一、分析题目二、什么是误差棒图&#xff1f;二、编写程序总结 前言 编写程序&#xff0c;绘制一个展示马尾松、樟树、杉木、 桂花 4 个树种不同季节的细根生物量的误差棒图&#xff0c;实现过程如下&#xff1a; &#xff08;1&#xff09; 导入 matplotlib.pyp…

【数据结构与算法(C语言)】1. 线性表的顺序存储

文章目录 前言一. 线性表插入和删除1. 元素的插入2. 元素的删除 二. 代码三. 优缺点 前言 线性表的顺序存储结构&#xff0c;指的是用一段地址连续的存储单元依次存储线性表的数据结构 一. 线性表插入和删除 1. 元素的插入 插入位置之后的数据都向后移一位&#xff0c;上图中元…

银行业ESB架构:构建安全高效的金融信息交换平台

在金融行业&#xff0c;信息交换是银行业务运作的核心。为了实现不同系统之间的数据交互和业务流程的协同&#xff0c;银行通常采用企业服务总线&#xff08;ESB&#xff09;架构。本文将探讨银行业ESB架构的设计理念、关键技术以及实践经验&#xff0c;帮助银行构建安全高效的…

《软件过程与管理》复习

《软件过程与管理》复习 1 高质量编程及测试 1.1 如何选择正确的评审方法 选择评审方法最有效的标准是&#xff1a; “对于最可能产生风险的工作成果&#xff0c;要采用最正式的评审方法.” 例如&#xff1a;核心代码的失效也会带来很严重的后果&#xff0c;所以也应该采用…

【Unity学习笔记】第十四 Prefab 概念解惑

目录 1 prefab、prefab变体、prefab覆盖和prefab 嵌套2 connect 与unpack3 prefab到底是什么&#xff0c;它和gameobject又有什么区别&#xff1f;4 为什么要用prefab&#xff1f;5 代码动态加载prefab6 为什么我unity PrefabUtility.InstantiatePrefab() 得到的是null7 Prefab…

卫浴品牌商家做展示预约小程序的作用是什么

卫浴品牌类别多、普通/智能、场景化等&#xff0c;无论企业还是经销商市场门店都比较饱满&#xff0c;虽然市场需求度高&#xff0c;但同样需要商家不断拓宽销售渠道和挖掘客户价值&#xff0c;破圈增长。 线上多平台发展尤为重要&#xff0c;而小程序作为连接点&#xff0c;对…

PostgreSQL的学习心得和知识总结(一百三十九)|深入理解PostgreSQL数据库GUC参数 allow_alter_system 的使用和原理

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…