Ribbon 学习(一):脱离 Eureka 使用 Ribbon

2023-12-27 13:08

本文主要是介绍Ribbon 学习(一):脱离 Eureka 使用 Ribbon,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

说明

在之前的博文中,我介绍了OpenFeign 的使用及 Spring Cloud 集成 OpenFeign 后的使用和配置原理,并没有涉及到其他如负载均衡,服务降级等内容。在本篇博文中,我将简单介绍 Ribbon 的使用方式,通常 Ribbon 的使用都是在 Spring Cloud 体系中通过 Spring Cloud OpenFeign 集成 Ribbon 和 Eureka,实现了服务发现和负载均衡的无感使用。本篇博文将脱离 Eureka,手动配置服务列表来演示 Ribbon 的简单使用。

正文

引入依赖

创建 web 服务,引入以下依赖:

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

@LoadBalanced 注解

这里使用 Spring 自带的 RestTemplaate 进行请求,创建 RestTemplate 并使用 @LoadBalanced 注解,告诉 Spring Cloud 我们需要进行负载均衡:

@LoadBalanced
@Bean
RestTemplate getRestTemplate() {return new RestTemplate();
}

创建 RibbonClient 及配置

RibbonClient

创建 Controller,使用 @RibbonClient 注解,在注解中指定 name 参数值,配置 RibbonClient 的名称,并且通过指定 configuration 参数值来进行自定配置:

@RestController
@RibbonClient(name = "test-server", configuration = RibbonConfiguration.class)
public class HelloClient {@AutowiredRestTemplate restTemplate;@RequestMapping("/hello/{name}")public String hello(@PathVariable(name = "name") String name) {return this.restTemplate.getForObject("http://test-server/hello/" + name, String.class);}
}

在以上代码中,我指定该 client 的名称为 test-server, 并指定了自定义配置类 RibbonConfiguration.class。通过之前创建配置的 RestTemplate 来请求 http://test-server/hello/。

自定义配置类

在 @RabbionClient 注解中,通过 configuration 可以为某个 Client 进行配置,也可以在 @RibbonClients 注解中,通过 defaultConfiguration 为所有的 client 设置默认配置。

public class RibbonConfiguration {@AutowiredIClientConfig ribbonClientConfig;@Beanpublic IPing ribbonPing(IClientConfig clientConfig) {return new PingUrl();}@Beanpublic IRule ribbonRule(IClientConfig clientConfig) {return new AvailabilityFilteringRule();}
}

在以上代码中,我为名为 test-server 的 RibbonClient 配置了 IPing 和 IRule。注意,虽然是配置类,但是并没有使用 @Configuration 注解,如果使用了 @Configuration 注解,并且该类可以被启动类的 @ComponentScan 扫描到,那么该配置类就会作为所有 RibbonClients 的默认配置。

在该类中,注入 IClientConfig,配置了 PingUrl 和 AvailabilityFilteringRule,我们可以简单了解下这些类的作用,在之后文章中会进行详细说明。

  • IClientConfig 为一个 client 或 load balancer 存储对应的配置,默认实现类为 DefaultClientConfigImpl。
  • IPing 使用该类对服务进行状态检测,默认配置为 DummyPing。
  • IRule 该类指定了负载均衡的策略,默认配置为 ZoneAvoidanceRule。

这里使用 PingUrl 替换 DummyPing,该类会进行真实 ping 检测,使用 AvailabilityFilteringRule 替换 ZoneAvoidanceRule,该策略会根据服务的状态,主动剔除故障服务地址进行负载均衡,主要是使用 Ribbon 内置的断路器来过滤处于 open-circuit 状态的服务器。

配置服务地址列表

spring:application:name: ribbon-testserver:port: 8080test-server:ribbon:eureka:enabled: falselistOfServers: localhost:8088,localhost:8083ServerListRefreshInterval: 5000logging:level:com.netflix.loadbalancer.BaseLoadBalancer: debug

在 application.yml 配置文件中,对 test-server 进行了配置,因为是在脱离 Eureka 的情况下使用 Ribbon,需要将 ribbon.eureka.enabled 值设置为false,同时通过 listOfServers 配置服务地址,通过 ServerListRefreshInterval 指定多长时间间隔刷新服务地址列表,单位为 ms。

在配置文件中,也可以为 RibbonClient 配置 IRule IPing 等属性值:

test-server:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.AvailabilityFilteringRuleNFLoadBalancerPingClassName: com.netflix.loadbalancer.PingUrl

在配置文件中配置的属性值优先级高于在 @RibbonClient 配置值和 Spring Cloud Netflix 提供的默认值。

测试

启动两个 web 服务,端口分别为 8088 和 8083,创建测试用的接口,注意这里要创建检测用的接口,否则在使用时会报空指针异常。

检测接口

@RequestMapping("/")
public String monitor() {return "ok";
}

启动 ribbon 服务后,访问 http://localhost:8080/hello/tom 可以看到两个服务进行轮询负载
在这里插入图片描述
在这里插入图片描述

并且在关停一个服务后,经过几次失败,调用会一直负载到正常的服务,这就是 AvailabilityFilteringRule 的作用。

同时,通过 Debug 日志,可以看到 PingUrl 在定时检测服务状态
在这里插入图片描述

总结

在不使用 Eureka 的情况下,使用 @LoadBalanced 标注的 RestTemplate, 使用 @RabbionClient 创建 RibbonClient,并通过配置文件配置的服务器列表,我们可以实现服务的负载均衡,同时通过 @RabbionClient 注解的 configuration ,我们可以为不同的 Client 进行自定义配置,配置不同 IPing,IRule 服务的负载功能也会随之发生变化。

至此,Ribbon 在脱离 Eureka 时的简单使用已经介绍完毕,接下来我将通过源码来解析 Spring Cloud 是如何自动装配 Ribbon,通过 @LoadBalanced
标注的 RestTemplate 发出的请求为什么能实现负载。

参考资料

https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-ribbon.html

https://spring.io/guides/gs/client-side-load-balancing/

这篇关于Ribbon 学习(一):脱离 Eureka 使用 Ribbon的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/543232

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma