当前位置: 首页 > news >正文

服务负载均衡Ribbon

服务负载均衡Ribbon

  • Ribbon 介绍
  • Ribbon 案例
  • Ribbon 负载均衡策略
  • Ribbon 负载均衡算法设置
  • 自定义负载均衡算法

Ribbon 介绍

Ribbon 是一个的客服端负载均衡工具,它是基于 Netflix Ribbon 实现的。它不像 Spring Cloud 服务注册中心、配置中心、API 网关那样独立部署,但是它几乎存在于每个 Spring Cloud 微服务中。它内部提供了一个叫做ILoadBalance的接口代表负载均衡器的操作,比如有添加服务器操作、选择服务器操作、获取所有的服务器列表、获取可用的服务器列表等。

客户端的负载均衡:在客户端发起远程调用的时候进行负载均衡,客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问,这就是客户端负载均衡;即在客户端就进行负载均衡算法分配。Ribbon就是一个客户端的负载均衡工具。

服务端的负载均衡:客户端发起远程调用到服务器,服务器根据服务列表,使用负载均衡算法,选择一个远程服务进行调用。nginx 就可以实现服务器负载均衡,客户端所有请求都会交给nginx,然后由nginx实现转发请求。即负载均衡是由服务端实现的,需要在nginx配置所有的服务提供者信息。

Ribbon 负载均衡流程
请添加图片描述
客户端发起请求,请求会被Ribbon拦截,Ribbon会去注册中心,读取请求的服务列表,会将获取注册信息服务列表之后缓存到本地,根据返回的服务列表,进行负载均衡,选择一个服务去进行调用。

Ribbon 案例

在服务消费者,添加 Ribbon 依赖,如果已经引入了 spring-cloud-starter-netflix-eureka-client 依赖,就不需要添加Ribbon的依赖了,在eureka-client已经添加了Ribbon的依赖。

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

微服务之间的通信方式,常见的方式有两种:RPC(dubbo),HTTP(SpringCloud)
在SpringCloud中,默认是使用 http 来进行微服务的通信,最常用的实现形式有两种:RestTemplate和OpenFeign。这里使用RestTemplate进行远程调用。
RestTemplate 需要手动创建 RestTemplate bean,并且使用该bean进行http请求。
在使用 RestTemplate 进行 Eureka Client 之间的通信,为 RestTemplate 配置类添加@LoadBalanced注解即可开启Ribbon的负载均衡,

@Bean
@LoadBalanced
public RestTemplate restTemplate() {return new RestTemplate();
}

服务提供者配置,需要向注册中心,注册多个相同的服务,使用Ribbon进行负载均衡,进行选择。
服务提供者1配置
添加依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

配置文件

server:port: 8001
spring:application:#该名称在集群模式下应该保持一致name: provider
eureka:client:#设置服务注册中心地址service-url:defaultZone: http://localhost:1000/eureka/  #定义服务中心的地址

服务提供者2配置
添加依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

配置文件

server:port: 8002
spring:application:#该名称在集群模式下应该保持一致name: provider
eureka:client:#设置服务注册中心地址service-url:defaultZone: http://localhost:1000/eureka/  #定义服务中心的地址

服务提供者1和服务提供者2,服务名称必须相同。不同会当作两个不同的服务。

服务消费者进行调用,在调用的时候,使用服务提供者的服务名称,会根据名称到 Eureka 中获取服务列表,当有多个相同的服务时,使用Ribbon做负载均衡,选择其中一个进行调用。

@Autowired
private RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {// 1.查询订单Order order = orderMapper.findById(orderId);// 2.利用RestTemplate发起http请求,查询用户// 2.1.url路径String url = "http://provider/user/" + order.getUserId();// 2.2.发送http请求,实现远程调用User user = restTemplate.getForObject(url, User.class);// 3.封装user到Orderorder.setUser(user);// 4.返回return order;
}

Ribbon 负载均衡策略

在这里插入图片描述
RoundRobinRule:默认使用,简单轮询。
WeightedResponseTimeRule:设置权重,权重越大,越容易被访问,越小,越不容易被访问。
RandomRule:随机选择一个可用的服务。
RetryRule:轮询的增强版,轮询策略服务不可用时不做处理,重试策略服务不可用时会重新尝试集群中的其他节点。
BestAvailableRule:选择正在请求中的并发数最小的服务,除非这个服务在熔断中。
AvailabilityFilteringRule:忽略高并发和短路。过滤掉并发数高的,过滤掉连接失败的。
ZoneAvoidanceRule:以一个区域为单位考察可用性,对于不可用的区域整个丢弃,从剩下区域中选可用的 provider。如果这个 ip 区域内有一个或多个实例不可达或响应变慢,都会降低该 ip 区域内其他 ip 被选中的权重。

Ribbon 负载均衡算法设置

全局替换,在启动类或配置类注入策略类对象,在所有的服务请求中均使用该策略。
注入随机策略类,在所有的服务进行远程调用的时候,将会采用随机的负载均衡策略。

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

局部替换,为每一个服务定义不同的负载均衡策略。修改配置文件。
对 userservice 服务设置负载均衡策略。

# 负载均衡策略
# userservice 为调用的服务的名称
userservice:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule# 负载均衡规则 

自定义负载均衡算法

Ribbon的负载均衡规则是一个叫做IRule的接口来定义的,每一个子接口都是一种规则。
在这里插入图片描述
想要实现自定义负载均衡规则,只需要编写一个类继承AbstractLoadBalancerRule。

IRule 接口
在这里插入图片描述
AbstractLoadBalancerRule对setLoadBalaner 方法和getLoadBalancer 方法进行了实现。把获取到的值进行赋值保存,方便的子类的使用,这两个方法可以看作是获取服务中心的服务信息。
在这里插入图片描述
自定义负载均衡算法需要继承IRule的抽象实现类AbstractLoadBalancerRule,可以写一个类去实现它,然后在 Server choose(Object key) 里面设置规则。
自定义一个轮询的策略类。

public class MyRoundRobinRule extends AbstractLoadBalancerRule {//定义一个原子类,以保证原子性private AtomicInteger atomicInteger = new AtomicInteger(0);@Overridepublic void initWithNiwsConfig(IClientConfig iClientConfig) {}// lb 服务列表public Server choose(ILoadBalancer lb, Object key) {if (lb == null){return null;}//用于统计获取次数,当达到一定数量就不再去尝试int count = 0;Server server = null;//当服务还没获取到,并且尝试没有超过8次while (server == null && count++ < 8){//获取服务List<Server> allServers = lb.getAllServers();List<Server> reachableServers = lb.getReachableServers();int allServersSize = allServers.size();int reachableServersSize = reachableServers.size();//如果获取的服务list都为0就返回nullif(allServersSize == 0 || reachableServersSize == 0){return  null;}//获取服务下标int next = getServerIndex(allServersSize);//获取服务server = reachableServers.get(next);//如果服务为空直接跳过下面的if (server == null){continue;}//如果获取到的这个服务是活着的就返回if (server.isAlive()){return server;}//如果获取到的服务不是空,但是不是存活状态,需要重新获取server = null;}//最后这里可能会返回nullreturn  server;}//获取服务下标,为了保证原子性,使用了CASpublic int getServerIndex(int allServersSize){//自旋锁for (;;) {//获取当前值int current = this.atomicInteger.get();//设置期望值int next = (current + 1) % allServersSize;//调用Native方法compareAndSet,执行CAS操作if (this.atomicInteger.compareAndSet(current, next))//成功后才会返回期望值,否则无线循环return next;}}@Overridepublic Server choose(Object key) {return choose(getLoadBalancer(),key);}
}

在配置类中注入写好的自定义策略类,注意,使用这种方式为全局替换。

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

也可以使用局部替换,在配置文件中进行设置。

# 负载均衡策略
# userservice 为调用的服务的名称
userservice:ribbon:NFLoadBalancerRuleClassName: com.springcloud.rule.MyRoundRobinRule #负载均衡规则 

相关文章:

服务负载均衡Ribbon

服务负载均衡Ribbon Ribbon 介绍Ribbon 案例Ribbon 负载均衡策略Ribbon 负载均衡算法设置自定义负载均衡算法 Ribbon 介绍 Ribbon 是一个的客服端负载均衡工具&#xff0c;它是基于 Netflix Ribbon 实现的。它不像 Spring Cloud 服务注册中心、配置中心、API 网关那样独立部署…...

hibernate vilidator主要使用注解的方式对bean进行校验

hibernate vilidator主要使用注解的方式对bean进行校验&#xff0c;初步的例子如下所示&#xff1a; package com.learn.validate.domain; import javax.validation.constraints.Min; import org.hibernate.validator.constraints.NotBlank; public class Student { //在需要校…...

华为HCIP第一天---------RSTP

一、介绍 1、以太网交换网络中为了进行链路备份&#xff0c;提高网络可靠性&#xff0c;通常会使用冗余链路&#xff0c;但是这也带来了网络环路的问题。网络环路会引发广播风暴和MAC地址表震荡等问题&#xff0c;导致用户通信质量差&#xff0c;甚至通信中断。为了解决交换网…...

Jmeter(二) - 从入门到精通 - 创建测试计划(Test Plan)(详解教程)

1.简介 上一篇文章已经教你把JMeter的测试环境搭建起来了&#xff0c;那么这一篇我们就将JMeter启动起来&#xff0c;一睹其芳容&#xff0c;首先我给大家介绍一下如何来创建一个测试计划&#xff08;Test Plan&#xff09;。 2.创建一个测试计划&#xff08;Test Plan&#x…...

Autosar诊断实战系列06-详解Dem中Event的NvM存储

本文框架 前言1. Dem触发NvM存储的基本流程2. Dem触发NvM存储的layout格式及内容2.1 Event在NvM中的layout格式2.2 Event在NvM中的存储内容2.3 Dem中Event与DTC的存储关系3.组合式Event(多个Event对应一个DTC)的存储处理3.1 仅分配一个Memory Entry3.2 检索方式3.3 一对一方式前…...

04 todoList案例

React全家桶 一、案例- TODO List 综合案例 功能描述 动态显示初始列表添加一个 todo删除一个 todo反选一个 todotodo 的全部数量和完成数量全选/全不选 todo删除完成的 todo 1.1 静态组件构建 将资料包中的todos_page/index.html中核心代码添加到Todo.jsx文件中&#xff0c;…...

海睿思分享 | 浅谈企业数据质量问题

一、数据质量问题场景 在日常工作中&#xff0c;业务领导经常通过BI系统来了解各项业务的业绩情况。倘若某天&#xff0c;他打开某张核心报表&#xff0c;发现当日某个区域的数据一直是空白的。BI开发人员经过几个小时的排查分析&#xff0c;发现是当日该区域的销售数据存在产…...

神经网络:激活函数

在计算机视觉中&#xff0c;激活函数是神经网络中的一种非线性函数&#xff0c;用于引入非线性变换和非线性特性到网络中。激活函数的作用、原理和意义如下&#xff1a; 1. 引入非线性变换&#xff1a; 神经网络的线性组合层&#xff08;如卷积层和全连接层&#xff09;只能表…...

图像色彩增强相关论文阅读-Representative Color Transform for Image Enhancement(ICCV2021)

文章目录 Representative Color Transform for Image EnhancementAbstractIntroductionRelated workMethod实验Conclusion Representative Color Transform for Image Enhancement 作者&#xff1a;Hanul Kim1, Su-Min Choi2, Chang-Su Kim3, Yeong Jun Koh 单位&#xff1a;S…...

Elasticsearch介绍与应用

Elasticsearch介绍与应用 Elasticsearch的官方文档。 Elasticsearch官网参考文档&#xff1a;https://www.elastic.co/guide/index.html Elasticsearch官方下载地址&#xff1a;https://www.elastic.co/cn/downloads/elasticsearch mvnrepository依赖库地址&#xff1a;http…...

JavaEE规范

Servlet&#xff1a;用于开发 Web 应用程序的 API&#xff0c;定义了处理 HTTP 请求和响应的方式。JSP&#xff08;JavaServer Pages&#xff09;&#xff1a;一种在服务器端生成动态网页的技术&#xff0c;允许将 Java 代码嵌入到 HTML 页面中。(注意JSP本质就是一个Servlet)J…...

嵌入式实时操作系统的设计与开发New(八)

创建线程 用户在基于RTOS开发应用程序前&#xff0c;首先要创建线程。 用户创建一个线程时须指定用户希望采用的调度策略。 例如&#xff0c;用户想创建一个周期性执行的线程&#xff1a; acoral_period_policy_data_t* data; data acoral_malloc(sizeof(acoral_period_poli…...

MySQL事务相关笔记

杂项 InnoDB最大特点&#xff1a;支持事务和行锁&#xff1b; MyISAM不支持事务 介绍 一个事务是由一条或者多条对数据库操作的SQL语句所组成的一个不可分割的单元&#xff0c;只有当事务中的所有操作都正常执行完了&#xff0c;整个事务才会被提交给数据库。事务有如下特性…...

如何利用AI高效率快速调色

在设计行业中&#xff0c;时间是非常宝贵的资源&#xff0c;而设计师们常常需要应对繁忙的工作日程和紧迫的截止日期。为了提高工作效率和节省时间&#xff0c;越来越多的设计师开始利用人工智能&#xff08;AI&#xff09;技术中的高效调色功能。本文将介绍如何利用AI高效率快…...

数据结构--顺序表的基本操作--插入 and 删除

数据结构–顺序表的基本操作–插入 顺序表的插入操作 实现目标 ListInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e。 typedef struct {int data[MaxSize];int len; }Sqlist;代码实现&#xff1a; #include <stdio.h> #include <stdlib.h> …...

BCSP-玄子Java开发之Java Web编程CH01_初识动态网页

BCSP-玄子Java开发之Java Web编程CH01_初识动态网页 1.1 B/S架构 B/S架构&#xff1a;浏览器/服务器 程序完全部署在服务器上使用浏览器访问服务器无需单独安装客户端软件 为什么要使用B/S架构 B/S与C/S比较B/S架构C/S架构软件安装浏览器需要专门的客户端应用升级维护客户…...

【软件教程】农林生环、水文、海洋、水环境、大气科学、人工智能、碳中和、碳排放、3S、R与统计等软件模型

本文涉及领域水文水资源、大气科学、农林生态、地信遥感、统计分析、编程语言等... 从软件基础到实践案例应用操作&#xff0c;手把手教学&#xff0c;提供永久回放观看和助学群长期辅助指导。适合课题组人员一站式学习&#xff0c;科研人员技术提升、企业单位工程项目、高校论…...

如何加入开源社

开源社成立于 2014 年&#xff0c;是由志愿贡献于开源事业的个人成员&#xff0c;依 “贡献、共识、共治” 原则所组成&#xff0c;始终维持厂商中立、公益、非营利的特点&#xff0c;是最早以 “开源治理、国际接轨、社区发展、项目孵化” 为使命的开源社区联合体。开源社积极…...

软件开发中的破窗效应

应该有很多人已经知道破窗效应【注1】这个社会学 &#xff08;犯罪学&#xff09;的词语&#xff0c;破窗效应最先由社会学家James Q. Wilson和George L. Kelling在一篇名为《Broken Windows》的文章中提出【注2】&#xff1a; “一个房子如果窗户破了&#xff0c;没有人去修补…...

机器视觉初步6-1:基于梯度的图像分割

把基于梯度的图像分割单独拿出来。 文章目录 一、图像梯度相关算子的原理1. Sobel算子2. Prewitt算子3. Roberts算子 二、python和halcon算子实现1.python实现2.halcon实现 基于梯度的图像分割方法利用像素之间的梯度信息来进行图像分割。 梯度 1是图像中像素灰度值变化最快的…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...