Ribbon全方位解析:构建弹性的Java微服务

第1章 引言

大家好,我是小黑,咱们今天聊聊Ribbon,这货是个客户端负载均衡工具,用在Spring Cloud里面能让咱们的服务调用更加灵活和健壮。负载均衡,听起来挺高大上的,其实就是把外界的请求平摊到多个服务器上,避免某个服务器压力太大,其他的却在那儿闲着。

Ribbon的牛处在于它是运行在客户端的,意味着决策权在咱们手里。咱们可以根据实际情况来选择要请求的服务实例,而且这一切都是自动化的,不需要手动干预。

想象一下,你的应用像是个饥饿的吃货,而Ribbon就是那个智能的美食地图,它知道哪家餐馆(服务实例)的排队人数少(负载低),哪家的口味好(服务质量高),然后给你推荐最合适的那一家。

Spring Cloud和Ribbon的整合,就像是把Ribbon这个美食地图整合进了咱们的手机(应用)里,随时随地都能打开来看,非常方便。

第2章 Ribbon的工作机制

Ribbon在工作时,主要分为几个步骤:服务发现、服务选择和负载均衡。

服务发现:这一步,Ribbon需要知道有哪些服务实例可用。在Spring Cloud中,咱们通常会用Eureka这样的服务注册中心,所有的服务实例都会注册到Eureka上。Ribbon会定期从Eureka获取服务列表,这样就知道了“今天有哪些餐馆开门”。

服务选择:拿到服务列表后,Ribbon就要根据自己的策略,从这些服务实例中选一个来发送请求。这就涉及到了负载均衡策略,比如轮询、随机等。

负载均衡:这一步是Ribbon的核心,负载均衡策略决定了请求会发送到哪个具体的实例。Ribbon内置了多种策略,咱们也可以自定义策略。

让咱们来看个简单的代码示例,展示如何使用Ribbon来获取服务实例并发送请求:

// 引入Ribbon的RestTemplate
@Autowired
private RestTemplate restTemplate;

public String callService(String serviceName) {
   
    // 使用Ribbon的RestTemplate来发送请求
    // 这里的"serviceName"是你想要调用的服务的名字,比如"order-service"
    // Ribbon会自动根据负载均衡策略来选择一个实例,然后用这个URL去调用服务
    String result = restTemplate.getForObject("http://" + serviceName + "/endpoint", String.class);
    return result;
}

在这段代码中,RestTemplate是Spring提供的用于发送HTTP请求的工具类。当它结合Ribbon使用时,你只需要给出服务名,Ribbon就会自动选择一个服务实例,并将请求发送到这个实例上。这里的"/endpoint"是你想要调用的服务端点。

第3章 Ribbon的核心组件

IClientConfig

这个家伙是Ribbon的配置持有者。它负责存储客户端的配置信息,比如连接超时、读取超时等。这就像是给Ribbon设定了一些基本的行为规则,告诉它在不同情况下应该怎么做。

IRule

IRule是Ribbon中定义负载均衡策略的接口。它决定了Ribbon如何从众多服务实例中选择一个来发送请求。Ribbon内置了多种实现,比如轮询、随机、根据响应时间加权等。当然,咱们也可以自定义策略,让Ribbon更符合自己的需求。

IPing

IPing接口用来检查服务实例是否存活。它就像是Ribbon的雷达,不断扫描注册的服务实例,看看哪些是可用的。这样Ribbon在选择服务实例时,就可以避免那些已经宕机的,确保请求的成功率。

ServerList

ServerList负责提供服务实例的列表。它从服务发现组件(比如Eureka)获取所有可用的服务实例信息。Ribbon就是根据这个列表,结合IRule定义的负载均衡策略,来选择一个服务实例的。

ServerListFilter

这个组件可以对服务列表进行过滤。在某些情况下,咱们可能不希望所有的服务实例都参与到负载均衡中来。比如,咱们可能只想要那些特定区域的实例。ServerListFilter就可以帮咱们实现这一点,它会根据咱们定义的规则,从ServerList中筛选出符合条件的服务实例。

现在,咱们来看一个简单的代码示例,展示如何自定义一个IRule:

// 自定义一个负载均衡策略,总是选择第一个服务实例
public class MyRule implements IRule {
   
    private ILoadBalancer lb; // Ribbon的负载均衡器

    // 设置负载均衡器
    @Override
    public void setLoadBalancer(ILoadBalancer lb) {
   
        this.lb = lb;
    }

    

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

npm install express -g报错或一直卡着,亲测可解决

问题描述: 最近学习vue3前端框架,安装Node.js之后,在测试是否可行时,cmd窗口执行了:npm install express -g,发现如下图所示一直卡着不动,最后还报错了,网上找了好久,各…

Springboot根据环境读取application配置文件

目录 1. 首先创建两个不同配置文件 2. pom.xml 配置文件 3. 指定环境 4. 最后启动测试 1. 首先创建两个不同配置文件 分别为开发环境和生产环境 application-dev.properties 和 application-prod.properties application-dev.properties 配置为 1931 端口 application-pro…

12个最常用的matplotlib图例 !!

文章目录 1、折线图 2、散点图 3、直方图 4、柱状图 5、箱线图 6、热力图 7、饼图 8、面积图 9、等高线图 10、3D图 11、时间序列图 12、树状图 总结 1、折线图 折线图(Line Plot):用于显示数据随时间或其他连续变量的变化趋势。在实际项目中…

奇异果投屏的进化之路

笔者按:奇异果投屏伴随奇异果TV一路发展至2022年,日活用户已达300多万,用户和我们都对投屏的功能和性能提出了更多的诉求和更高要求,因此2022开始系统地对投屏功能和性能做了扩展和优化。本文立足于TV端,为大家介绍爱奇…

百家cms代审

环境搭建 源码链接如下所示 https://gitee.com/openbaijia/baijiacms 安装至本地后 直接解压到phpstudy的www目录下即可 接下来去创建一个数据库用于存储CMS信息。(在Mysql命令行中执行) 接下来访问CMS,会默认跳转至安装界面 数据库名称和…

spring boot(2.4.x 开始)和spring cloud项目中配置文件application和bootstrap加载顺序

在前面的文章基础上 https://blog.csdn.net/zlpzlpzyd/article/details/136060312 spring boot 2.4.x 版本之前通过 ConfigFileApplicationListener 加载配置 https://github.com/spring-projects/spring-boot/blob/v2.3.12.RELEASE/spring-boot-project/spring-boot/src/mai…

ElasticSearch之search API

写在前面 本文看下查询相关内容,这也是我们在实际工作中接触的最多的,所以有必要好好学习下! 1:查询的分类 主要分为如下2类: 1:基于get查询参数的URI search 2:基于post body的request body search&am…

8868体育助力法甲巴黎圣日耳曼俱乐部 运作球员转会

法甲的巴黎圣日耳曼足球俱乐部是8868的体育助力球队之一,根据法国媒体RMC的消息,巴黎圣日尔曼仍然希望在一月份增强球队的后防实力。虽然之前球队已经从圣保罗引进了20岁的巴西中后卫卢卡斯-贝拉尔多,而这名小将也将会是巴黎圣日耳曼冬窗的一…

nodejs+vue高校实验室耗材管理系统_m20vy

用户功能: 登录后要有一个首页 比如:可以看见目前的耗材消耗记录,可做成图表菜单栏在左侧显示 1.个人信息管理 可以对基本信息进行修改,(修改密码时需要验证) 2.耗材管理(耗材信息) 普通用户可以查询当前相关耗材信息[…

Easy Excel动态表头的实现

步骤: 1.查找官方API文档理解实现 2.实现融入到代码里面 一:Easy Excel动态头实时生成头写入 动态头实时生成头写入 二:实现 目的:实现表头为,第一列是固定列,第二列为动态生成的时间段的每一天的日期…

【JAVA WEB】CSS

目录 CSS是什么? 基本语法规范 引入方式 内部样式表 行内样式表 外部样式表 常用选择器的种类 基础选择器 标签选择器 类选择器 id选择器 通配符选择器 复合选择器 后代选择器 伪类选择器 常用元素属性: 字体属性: 文本属性…

初始web服务器(并基于idea来实现无需下载的tomcat)

前言 前面学习了对应的http协议,我们知道了他是在网络层进行数据传输的协议,负责相应数据以及接收数据的规则,但是在人员开发后端的时候不仅仅需要你写io流进行数据传输,还需要你进行对应的tcp协议来进行数据打包发送http协议-CSD…

Elasticsearch: 非结构化的数据搜索

很多大数据组件在快速原型时期都是Java实现,后来因为GC不可控、内存或者向量化等等各种各样的问题换到了C,比如zookeeper->nuraft(https://www.yuque.com/treblez/qksu6c/hu1fuu71hgwanq8o?singleDoc# 《olap/clickhouse keeper 一致性协调服务》)&a…

安卓服务的常见问题,性能优化以及应用场景剖析

一、引言 在安卓开发中,服务(Service)扮演着至关重要的角色,它们在没有用户界面的情况下,为用户提供了长时间的后台任务执行能力。本文将探讨服务常见问题、优化策略、应用场景以及开发过程中应注意的事项。 二、应用场…

按键扫描16Hz-单片机通用模板

按键扫描16Hz-单片机通用模板 一、按键扫描的原理1、直接检测高低电平类型2、矩阵扫描类型3、ADC检测类型二、key.c的实现1、void keyScan(void) 按键扫描函数①void FHiKey(void) 按键按下功能②void FSameKey(void) 按键长按功能③void FLowKey(void) 按键释放功能三、key.h的…

Qt PCL学习(二):点云读取与保存

注意事项 版本一览:Qt 5.15.2 PCL 1.12.1 VTK 9.1.0前置内容:Qt PCL学习(一):环境搭建 0. 效果演示 1. pcl_open_save.pro QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgets// 添加下行代码&#…

npm 下载报错

报错信息 : 证书过期 (CERT_HAS_EXPIRED) D:\Apps\nodejs-v18.16.1\npx.cmd --yes create-next-app"latest" . --ts npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.npm.taobao.org/create-next-app failed…

Qlik Sense : Lookup函数

LookUp - 脚本函数 Lookup() 用于查找已经加载的表格,并返回与在字段 match_field_name 中第一次出现的值 match_field_value 对应的 field_name 值。表格可以是当前表格或之前加载的其他表格。 语法: lookup(field_name, match_field_name, match_…

macOS Sonoma 14.3.1(23D60)发布

系统介绍 黑果魏叔2 月 9 日消息,苹果今日向 Mac 电脑用户推送了 macOS 14.3.1 更新(内部版本号:23D60),本次更新距离上次发布隔了 17 天。 魏叔 查询苹果官方更新日志,macOS Sonoma 14.3.1 修复内容和 …

React环境配置

1.安装Node.js Node.js官网:https://nodejs.org/en/ 下载之后按默认选项安装好 重启电脑即可自动完成配置 2.安装React 国内使用 npm 速度很慢,可以使用淘宝定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm。 ①使用 winR 输入 cmd 打开终端 ②依…