负载均衡-Ribbon-自定义负载均衡算法

1.Ribbon 是什么

  • SpringCloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端负载均衡的工具
  • 主要功能是提供客户端的软件负载均衡算法,将 Netflix 的中间服务处连接在一起
  • Ribbon的客户端组件提供一系列完整的配置项,如:连接超时、重试等。简单的说就是在配置文件中列出 LoadBalance
    (LB:负载均衡)后面所有的机器,Ribbon 会自动帮你基于某种规则去连接这些机器
    在这里插入图片描述
    1.2 负载均衡(LB)
  • 核心作用:就是将用户的请求平摊在多个服务器上,从而达到系统的 High Availability(HA :高可用)
  • 常见的负载均衡软件有 Nginx、Lvs 等
  • Dubbo 和 SpringCloud 都提供了负载均衡,SpringCloud 的负载均衡算法可以自定义
  • 负载均衡算法实现的方式:轮询、权重、随机
  • 负载均衡的简单分类:
    1、集中式
    在服务的 消费者 和 提供者之间使用独立的 LB 设施,如Nginx(反向代理服务器) ,由该设施负载把访问请求通过某种策略发送至服务的提供者
    2、进程式
    将LB逻辑集成到 消费者,消费者 从服务注册中心得到哪些地址可用,然后自己再从这些地址中选出一个合适服务器
    Ribbon 就属于进程内 LB ,它只是一个类库,集成与消费者进程,消费者通过他来获取到服务提供者的地址
    2.1 整合 Ribbon
  1. 在 POM 文件中添加 Ribbon、Eureka 依赖
	<!--ribbon--><!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-ribbon --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-ribbon</artifactId><version>1.4.7.RELEASE</version></dependency><!--Eureka 服务提供者--><!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId><version>1.4.7.RELEASE</version></dependency>

2.编写 application.yml

# Eureka
eureka:client:# 不向注册中心注册自己register-with-eureka: false# 配置 可连接的注册中心service-url:defaultZone: http://127.0.0.1:7001/eureka/,http://127.0.0.2:7002/eureka/

3.在主启动类上添加 Eureka 启动项 : @EnableEurekaClient
4.在之前把 RestTemplate 注册到 Bean 的配置方法上添加一个注解
在这里插入图片描述
5.修改控制层

 /**提供者 URL 的前缀** 不使用 Ribbon 时 ,这里就是第一中写法** 使用 Ribbon 实现负载均衡 时,这里就不能写死为一个地址,*       而需要通过注册中心的服务名来访问*       服务名:在 提供者 YML 文件中配置的 spring:application:name: 的值*            或者 监控页面的 Application 字段值*/
//private static final String REST_URL_PREFIX = "http://localhost:8081";private static final String REST_URL_PREFIX = "http://SpringCloud-02-provider";

3.自定义策略(简单示例)

  • 可以点开刚刚看的那个 RandomRule 的源代码,复制过来修改一下
  • 修改要求:每个提供者访问五次
public class DiyRule extends AbstractLoadBalancerRule {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;}//==上面是写死的======中间是修改部分==================System.out.println("自定义的 Rule");System.out.println(upList.size());// 访问某一个提供者的次数int times = 0;// 提供者的下标int index = 0;// 从活着的服务中随机获取一个server = (Server)upList.get(index);if (times < 4){times++;}else {times = 1;index = (index + 1) % upList.size();}//==下面是写死的======中间是修改部分===================if (server == null) {Thread.yield();} else {if (server.isAlive()) {return server;}server = null;Thread.yield();}}return server;}}@Overridepublic void initWithNiwsConfig(IClientConfig iClientConfig) {}@Overridepublic Server choose(Object o) {return null;}
}

2.MyRule 类

@Configuration
public class CustomizedRule {/*** 修改默认的负载均衡策略*/@Beanpublic IRule customize(){// 先使用已经实现的策略——随机return new DiyRule();}
}

3.在主启动类上添加

// configuration:标注 Rule 的配置类 ; name:标注需要配置的服务名
@RibbonClient(name = "SPRINGCLOUD-PROVIDER", configuration = CustomizedRule.class)

Eureka 和 Ribbon 整合以后,在消费端,就不需要关系请求服务的 IP地址 和 端口号了,就只需要知道服务名称,直接调用即可

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

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

相关文章

AlmaLinux 8.9 安装图解

风险告知 本人及本篇博文不为任何人及任何行为的任何风险承担责任&#xff0c;图解仅供参考&#xff0c;请悉知&#xff01;本次安装图解是在一个全新的演示环境下进行的&#xff0c;演示环境中没有任何有价值的数据&#xff0c;但这并不代表摆在你面前的环境也是如此。生产环境…

「优选算法刷题」:在排序数组中查找元素的第一个和最后个位置

一、题目 给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 示例 1&a…

Go 的 Http 请求系统指南

文章目录 快速体验请求方法URL参数响应信息BodyStatusCodeHeaderEncoding 图片下载定制请求头复杂的POST请求表单提交提交文件 CookieClient 上设置 Cookie请求上设置 Cookie 重定向和请求历史超时设置总超时连接超时读取超时 请求代理错误处理总结 前几天在 “知乎想法” 谈到…

【英文干货】【Word_Search】找单词游戏(第1天)

本期主题&#xff1a;Mindfulness&#xff08;意识力&#xff09; 本期单词&#xff1a; Awareness 意识 Breathing 呼吸 Calm 平静的 De-Stress 减压 Feelings 感受&#xff0c;情感 Inspection 调查 Meditation 冥想 Peace 和平 Quiet 安静的 Recollection 回忆 R…

2.【SpringBoot3】用户模块接口开发

文章目录 开发模式和环境搭建开发模式环境搭建 1. 用户注册1.1 注册接口基本代码编写1.2 注册接口参数校验 2. 用户登录2.1 登录接口基本代码编写2.2 登录认证2.2.1 登录认证引入2.2.2 JWT 简介2.2.3 登录功能集成 JWT2.2.4 拦截器 3. 获取用户详细信息3.1 获取用户详细信息基本…

SDCMS靶场通过

考察核心&#xff1a;MIME类型检测文件内容敏感语句检测 这个挺搞的&#xff0c;一开始一直以为检查文件后缀名的&#xff0c;每次上传都失败&#xff0c;上传的多了才发现某些后缀名改成php也可通过&#xff0c;png图片文件只把后缀名改成php也可以通过&#xff0c;之前不成功…

代码随想录算法训练营29期|day27 任务以及具体安排

39. 组合总和// 剪枝优化 class Solution {public List<List<Integer>> combinationSum(int[] candidates, int target) {List<List<Integer>> res new ArrayList<>();Arrays.sort(candidates); // 先进行排序backtracking(res, new ArrayList&…

数字湖南劲风起:纷享销客当选2023年湖南省数字化十大优秀服务商

1月19日&#xff0c;湖南省数字经济促进会主办的长江数字经济发展大会暨第四届湖南省数字经济论坛圆满举行&#xff0c;纷享销客凭借过硬的产品实力、优质的服务水平及行业口碑&#xff0c;当选【2023年湖南省数字化十大优秀服务商】&#xff01; “一江一体同风起&#xff0c;…

flutter 实现定时滚动的公告栏的两种不错方式

相同的部分 自定义一个类继承StatefulWidget 所有公告信息存放在list里 第一种 scrollControllerAnimatedContainer 逻辑如下 我们可以发现启动了一个timer计时器计时5秒&#xff0c;hasClients检查其目标对象&#xff08;我们用的是listview&#xff09;是否被渲染&#x…

捆扎机怎么调整松紧度

捆扎机松紧力度可以通过以下方法调节&#xff1a; 1. 调节束紧力&#xff1a;捆扎机上通常有专门的调节束紧力的旋钮。顺时针方向转动螺帽&#xff0c;对弹簧的压力就会减小&#xff0c;打包机就会越松&#xff1b;逆时针调整&#xff0c;打包机就会越紧。正常情况下&#xff0…

Uni-App三甲医院、医保定点三甲医院在线预约挂号系统源码

医院在线预约挂号系统是一种方便患者预约挂号的系统&#xff0c;患者可以通过该系统进行预约挂号&#xff0c;省去了到医院现场排队等待的时间&#xff0c;提高了就诊效率。随着医院信息化水平的不断发展&#xff0c;医院在线预约挂号管理系统已成为医院管理中不可或缺的一部分…

人大金仓数据库授权文件过期解决

一台用于测试的人大金仓数据库访问失败。 登录后发现服务停了。 使用命令行启动&#xff0c;提示服务过期。 查网上资料&#xff0c;说替换原有文件可以解决。 于是去官网下载一个新的&#xff0c;替换掉原来的授权文件。 再次启动数据库&#xff0c;还是提示授权文件过期。…