服务负载均衡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 是一个的客服端负载均衡工具,它是基于 Netflix Ribbon 实现的。它不像 Spring Cloud 服务注册中心、配置中心、API 网关那样独立部署…...
hibernate vilidator主要使用注解的方式对bean进行校验
hibernate vilidator主要使用注解的方式对bean进行校验,初步的例子如下所示: package com.learn.validate.domain; import javax.validation.constraints.Min; import org.hibernate.validator.constraints.NotBlank; public class Student { //在需要校…...
华为HCIP第一天---------RSTP
一、介绍 1、以太网交换网络中为了进行链路备份,提高网络可靠性,通常会使用冗余链路,但是这也带来了网络环路的问题。网络环路会引发广播风暴和MAC地址表震荡等问题,导致用户通信质量差,甚至通信中断。为了解决交换网…...
Jmeter(二) - 从入门到精通 - 创建测试计划(Test Plan)(详解教程)
1.简介 上一篇文章已经教你把JMeter的测试环境搭建起来了,那么这一篇我们就将JMeter启动起来,一睹其芳容,首先我给大家介绍一下如何来创建一个测试计划(Test Plan)。 2.创建一个测试计划(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文件中,…...
海睿思分享 | 浅谈企业数据质量问题
一、数据质量问题场景 在日常工作中,业务领导经常通过BI系统来了解各项业务的业绩情况。倘若某天,他打开某张核心报表,发现当日某个区域的数据一直是空白的。BI开发人员经过几个小时的排查分析,发现是当日该区域的销售数据存在产…...
神经网络:激活函数
在计算机视觉中,激活函数是神经网络中的一种非线性函数,用于引入非线性变换和非线性特性到网络中。激活函数的作用、原理和意义如下: 1. 引入非线性变换: 神经网络的线性组合层(如卷积层和全连接层)只能表…...
图像色彩增强相关论文阅读-Representative Color Transform for Image Enhancement(ICCV2021)
文章目录 Representative Color Transform for Image EnhancementAbstractIntroductionRelated workMethod实验Conclusion Representative Color Transform for Image Enhancement 作者:Hanul Kim1, Su-Min Choi2, Chang-Su Kim3, Yeong Jun Koh 单位:S…...
Elasticsearch介绍与应用
Elasticsearch介绍与应用 Elasticsearch的官方文档。 Elasticsearch官网参考文档:https://www.elastic.co/guide/index.html Elasticsearch官方下载地址:https://www.elastic.co/cn/downloads/elasticsearch mvnrepository依赖库地址:http…...
JavaEE规范
Servlet:用于开发 Web 应用程序的 API,定义了处理 HTTP 请求和响应的方式。JSP(JavaServer Pages):一种在服务器端生成动态网页的技术,允许将 Java 代码嵌入到 HTML 页面中。(注意JSP本质就是一个Servlet)J…...
嵌入式实时操作系统的设计与开发New(八)
创建线程 用户在基于RTOS开发应用程序前,首先要创建线程。 用户创建一个线程时须指定用户希望采用的调度策略。 例如,用户想创建一个周期性执行的线程: acoral_period_policy_data_t* data; data acoral_malloc(sizeof(acoral_period_poli…...
MySQL事务相关笔记
杂项 InnoDB最大特点:支持事务和行锁; MyISAM不支持事务 介绍 一个事务是由一条或者多条对数据库操作的SQL语句所组成的一个不可分割的单元,只有当事务中的所有操作都正常执行完了,整个事务才会被提交给数据库。事务有如下特性…...
如何利用AI高效率快速调色
在设计行业中,时间是非常宝贵的资源,而设计师们常常需要应对繁忙的工作日程和紧迫的截止日期。为了提高工作效率和节省时间,越来越多的设计师开始利用人工智能(AI)技术中的高效调色功能。本文将介绍如何利用AI高效率快…...
数据结构--顺序表的基本操作--插入 and 删除
数据结构–顺序表的基本操作–插入 顺序表的插入操作 实现目标 ListInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e。 typedef struct {int data[MaxSize];int len; }Sqlist;代码实现: #include <stdio.h> #include <stdlib.h> …...
BCSP-玄子Java开发之Java Web编程CH01_初识动态网页
BCSP-玄子Java开发之Java Web编程CH01_初识动态网页 1.1 B/S架构 B/S架构:浏览器/服务器 程序完全部署在服务器上使用浏览器访问服务器无需单独安装客户端软件 为什么要使用B/S架构 B/S与C/S比较B/S架构C/S架构软件安装浏览器需要专门的客户端应用升级维护客户…...
【软件教程】农林生环、水文、海洋、水环境、大气科学、人工智能、碳中和、碳排放、3S、R与统计等软件模型
本文涉及领域水文水资源、大气科学、农林生态、地信遥感、统计分析、编程语言等... 从软件基础到实践案例应用操作,手把手教学,提供永久回放观看和助学群长期辅助指导。适合课题组人员一站式学习,科研人员技术提升、企业单位工程项目、高校论…...
如何加入开源社
开源社成立于 2014 年,是由志愿贡献于开源事业的个人成员,依 “贡献、共识、共治” 原则所组成,始终维持厂商中立、公益、非营利的特点,是最早以 “开源治理、国际接轨、社区发展、项目孵化” 为使命的开源社区联合体。开源社积极…...
软件开发中的破窗效应
应该有很多人已经知道破窗效应【注1】这个社会学 (犯罪学)的词语,破窗效应最先由社会学家James Q. Wilson和George L. Kelling在一篇名为《Broken Windows》的文章中提出【注2】: “一个房子如果窗户破了,没有人去修补…...
机器视觉初步6-1:基于梯度的图像分割
把基于梯度的图像分割单独拿出来。 文章目录 一、图像梯度相关算子的原理1. Sobel算子2. Prewitt算子3. Roberts算子 二、python和halcon算子实现1.python实现2.halcon实现 基于梯度的图像分割方法利用像素之间的梯度信息来进行图像分割。 梯度 1是图像中像素灰度值变化最快的…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
