Spring (50)Ribbon

Netflix Ribbon是一个客户端负载均衡器,它提供了一系列完善的配置项:如连接超时、重试、负载均衡策略等。在微服务架构中,Ribbon通常被用于调用其它服务,通过负载均衡选择一个最佳的服务实例进行交互。Spring Cloud将Ribbon整合在其微服务生态中,使得服务之间的调用变得更加简便。下面我们将通过源码解析和代码演示来深入了解Ribbon的工作原理和使用方法。

1. 核心组件

Ribbon的核心组成部分主要包括:

  • IClientConfig: 客户端配置,用于配置Ribbon客户端的行为。
  • ILoadBalancer: 负载均衡器接口,用于选择服务实例。
  • IPing: 用于判断服务实例是否存活的接口。
  • IRule: 负载均衡规则接口,定义了服务选择规则。

2. 添加依赖

在使用Ribbon之前需要在项目中添加相关依赖。以Spring Cloud项目为例,只需添加Eureka客户端和Ribbon的依赖,Spring Cloud已经默认集成了Ribbon。

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

3. 配置Ribbon客户端

Ribbon可以与Eureka等服务发现工具配合使用,通过配置可以自定义Ribbon客户端的行为。

product-service:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则ConnectTimeout: 1000 # 连接超时时间ReadTimeout: 1000 # 读取超时时间OkToRetryOnAllOperations: true # 是否在所有操作上重试MaxAutoRetries: 1 # 同一个服务重试次数MaxAutoRetriesNextServer: 2 # 切换实例的重试次数

4. 使用Ribbon进行服务调用

在Spring Cloud中,可以通过RestTemplate结合Ribbon实现对服务的负载均衡调用。

首先,需要在启动类中通过@LoadBalanced注解开启RestTemplate的负载均衡功能。

@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}
}

然后就可以在服务中使用RestTemplate调用其他服务了,Ribbon会自动根据负载均衡规则选择一个服务实例进行调用。

@RestController
public class ProductController {@Autowiredprivate RestTemplate restTemplate;@GetMapping("/products")public String listProducts() {return restTemplate.getForObject("http://product-service/products", String.class);}
}

5. 源码解析

RestTemplate发送请求时,Ribbon的LoadBalancerInterceptor会拦截这个请求。在拦截器内部,会通过LoadBalancerClient选择一个服务实例,并将请求发送到该实例上。这个过程中,会涉及到ILoadBalancerIRule等接口的实现类。

IRule的实现之一RandomRule(随机规则)为例,其核心方法choose(Object key)通过随机算法从所有可用的服务实例中选择一个。

public class RandomRule extends AbstractLoadBalancerRule {private Random rand;public Server choose(ILoadBalancer lb, Object key) {if (lb == null) {return null;}Server server = null;while (server == null) {List<Server> upList = lb.getReachableServers();List<Server> allList = lb.getAllServers();int serverCount = allList.size();if (serverCount == 0) {return null;}int index = rand.nextInt(serverCount);server = upList.get(index);if (server == null) {Thread.yield();continue;}if (server.isAlive() && (server.isReadyToServe())) {return (server);}server = null;}return server;}
}

小结

Ribbon提供了简单而强大的客户端负载均衡功能,结合Spring Cloud的其他组件,可以非常容易地在微服务架构中实现服务间的调用和负载均衡。此外,Ribbon的灵活配置和扩展性也使得开发者可以根据实际需求自定义负载均衡策略和行为。

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

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

相关文章

【深度学习】Loss为Nan的可能原因

文章目录 1. 问题情境2. 原因分析3. 导致Loss为Nan的其他可能原因 1. 问题情境 在某个网络架构下&#xff0c;我为某个数据项引入了一个损失函数。 这个数据项是nn.Embedding类型的&#xff0c;我加入的损失函数是对nn.Embedding空间做约束。 因为我在没加入优化loss前&#x…

C# WPF入门学习主线篇(八)—— ListBox常见属性和事件

C# WPF入门学习主线篇&#xff08;八&#xff09;—— ListBox常见属性和事件 欢迎来到C# WPF入门学习系列的第八篇。在前面的文章中&#xff0c;我们已经探讨了WPF中的Button、TextBox和Label控件的使用。今天&#xff0c;我们将深入了解WPF中的另一个常用控件——ListBox。本…

GPS原理与接收机设计

将伪码中的一位二进制数称为一个码片&#xff0c;或者称为一个码元&#xff0c;一个码片的持续时间称为码宽&#xff0c;单位时间内所包含的码片数目称为码率。 GPS信号中的C/A码属于金码&#xff0c;能产生金码的一对m序列称为优选m序列对。通过调节其中一个m序列的延时&…

Pulsar 社区周报 | No.2024-06-07 | Apache Pulsar 新分支 3.3 版本发布

“ 各位热爱 Pulsar 的小伙伴们&#xff0c;Pulsar 社区周报更新啦&#xff01;这里将记录 Pulsar 社区每周的重要更新&#xff0c;每周发布。 ” 本期主题&#xff1a;Apache Pulsar 新分支 3.3 版本发布 Apache Pulsar 新分支 3.3 版本发布&#xff1a;Apache Pulsar 3.3.0[1…

必备:产品经理工作文档大全

产品经理&#xff08;英文&#xff1a;Product manager&#xff0c;缩写&#xff1a;PM&#xff09;也称产品企划&#xff0c;是指在公司中针对某项或某类的产品进行规划和管理的人员&#xff0c;主要负责产品的研发、制造、营销、渠道等工作。 产品经理是很难定义的一个角色&a…

DeepSORT(目标跟踪算法)中的数值表格与调参的关系

DeepSORT&#xff08;目标跟踪算法&#xff09;中的数值表格与调参的关系 flyfish DeepSORT&#xff08;目标跟踪算法&#xff09;中的马氏距离详解&#xff08;很详细&#xff09; DeepSORT&#xff08;目标跟踪算法&#xff09;中 可以设置阈值进行异常检测或目标跟踪的原…

在Ubuntu20.04上安装Apache、MySQL和PHP的基本步骤

1安装Apache&#xff1a; sudo apt update sudo apt install apache2 2安装MySQL&#xff1a; sudo apt install mysql-server 3安装PHP以及常用扩展&#xff1a; sudo apt install php libapache2-mod-php php-mysql 4配置Apache和PHP&#xff1a; sudo nano /etc/apac…

问题:在信息点统计表中,对于没有信息点的工作区或者房间填写,表明已经分析过该区域 #微信#职场发展#职场发展

问题&#xff1a;在信息点统计表中,对于没有信息点的工作区或者房间填写,表明已经分析过该区域 参考答案如图所示

vue面试题五

一、请解释Vue中的keep-alive组件是什么&#xff0c;以及它的作用&#xff1f; Vue中的keep-alive是一个内置组件&#xff0c;它主要的作用是在组件切换过程中将状态保留在内存中&#xff0c;以防止重复渲染DOM&#xff0c;从而提高页面性能。keep-alive包裹动态组件时&#x…

学历还算能力的一部分吗(机器人方向)

前篇 在人工智能时代&#xff0c;学历还算是能力的一部分吗&#xff1f; 之前写过一篇&#xff0c;现在感觉应该是不严谨&#xff0c;不准确的。 AI如何看待能力&#xff0c;学历&#xff0c;文凭-CSDN博客 那一篇讨论了&#xff1a;{文凭}⊂{学历}⊂{能力} 本篇 不合格且…

PAT 1061 Dating(20分)未完成

原题链接&#xff1a;PAT 1061 Dating&#xff08;20分&#xff09; Sherlock Holmes received a note with some strange strings: Lets date! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm. It took him only a minute to figure out that those strange…

【Echarts系列】带图片的饼图

【Echarts系列】带图片的饼图 序前提说明示例数据格式代码动态旋转图片 序 为了节省后续开发学习成本&#xff0c;这个系列将记录我工作所用到的一些echarts图表。 前提说明 因为饼图中间需要添加图片&#xff0c;所以比较特殊&#xff0c;对于饼图中间数据的对齐很容易出现…

正大国际期货:原油投资出现亏损的五种心理弱点

在原油投资当中&#xff0c;有五种心理弱点最容易导致投资者失败&#xff0c;必须注意加以克服! 盲目胆大心理。 有些投资者从未认真系统地学习过投资理论技巧&#xff0c;也没有经过任何模拟训练&#xff0c;甚至连最起码的投资基础知识都不明白&#xff0c;就贸然的进入原油…

【Qt】Qt中QJsonArray类

01. QJsonArray类简介 ​ QJsonArray封装了JSON数组。 ​ JSON数组是值的链表&#xff0c;可以插入和删除QJsonValue。 ​ QJsonArray与QVariantList可以相互转换。QJsonArray可以用size(), insert(), removeAt()进行操作&#xff0c;还可以用标准C的迭代器模式来迭代其内容…

企业管理/市场经营/自我管理,500+个经典职场工具 . rar

​500N个实用管理工具包&#xff0c;精选人力资源从业者必备之132项工具、40个管理者实效管理工具、成功自我管理的29个工具、常见的9种营销分析工具等&#xff0c;成功自我管理必备工具。 与班主任联系&#xff0c;即可获得完整资料包&#xff01; 1.PEST分析 2.五力分析 3.…

哈尔滨等保如何做?

哈尔滨等保测评是确保信息系统安全稳定运行的重要一环&#xff0c;它涉及到对业务、资产、安全技术和安全管理的全面调研和评估。本文将详细阐述哈尔滨等保测评的实施步骤和注意事项&#xff0c;帮助读者更好地理解和执行等保测评工作。 首先&#xff0c;我们需要明确等保测评的…

回溯算法练习题(2024/6/10)

1组合 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ] 示例 2&#xff1a; 输入&#xff1a;n …

Hexo+Github搭建个人博客教程

hexo官网&#xff1a;https://hexo.io/zh-cn/ butterfly 主题设置&#xff1a;https://butterfly.js.org/ GitHub地址&#xff1a;https://github.com/jerryc127/hexo-theme-butterfly 基础命令 初始化博客命令&#xff1a;hexo init “文件名” 开启本地服务&#xff08;本…

Docker:Docker容器使用

文章目录 容器与宿主机复制容器环境变量设置镜像的导出和导入 由于篇幅原因&#xff0c;把后续的使用搬到这篇来 容器与宿主机复制 启动一个nginx服务 rootVM-24-7-ubuntu:~# docker run --name nginx -p 80:80 -d nginx 7a1578bedd97ffc48e9516d03a148c69e216a30f2d18f2624…

【MySQL】复合查询+表的内外连接

复合查询表的内外连接 1.基本查询回顾2.多表查询3.自连接4.子查询4.1单列子查询4.2多列子查询 5.在from子句中使用子查询6.合并查询7.表的内连和外连7.1内连接7.2外连接7.2.1左外连接 7.2.2右外连接 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1…