SpringCloud学习笔记(六)_Ribbon服务调用

news2024/11/18 5:45:00

Ribbon介绍

Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具

Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时、重试等。简单的说,就是在配置文件中列出Load Balance(简称LB)后面所有的机器,Ribbon会自动的帮组你基于某种规则(如简单轮询,随机连接等)去连接这些机器,我们很容易使用Ribbon实现自定义的负载均衡算法

LB负载均衡(Load Balance)

**** 简单的说就是将用户的请求平摊到分配到多个服务上,从而达到系统的HA(高可用)。

常见的负载均衡有软件Nginx、LVS、硬件FS等

Ribbon本地负载均衡客户端 VS Nginx服务端负载均衡区别

Nginx是服务器负载均衡,客户端所有请求都会教给Nginx,然后由nginx实现转发请求,即负载均衡是由服务端实现的

Ribbon本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而本地实现RPC远程调用技术

官网:https://github.com/Netflix/ribbon

Ribbon使用

1、搭建项目、参考【SpringCloud】服务提供者集群与服务发现Discovery(三) 的示例

采用Eureka作为注册中心,且有2个服务提供者

架构如下:

2、Ribbon依赖,依赖如下:

 1 <dependency>
2     <groupId>org.springframework.cloud</groupId>
3     <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
4     <version>2.2.2.RELEASE</version>
5     <scope>compile</scope>
6 </dependency>

通过查看示例项目,调用者order项目依赖,发现在Eureka依赖中,默认含有依赖Ribbon的依赖

3、查看RibbonClientConfiguration.java,Ribbon自动装载类。

 1 @Configuration(proxyBeanMethods = false)
 2 @EnableConfigurationProperties
 3 @Import({ HttpClientConfiguration.class, OkHttpRibbonConfiguration.class,
 4         RestClientRibbonConfiguration.class, HttpClientRibbonConfiguration.class })
 5 public class RibbonClientConfiguration {
 6 
 7     ...
 8 
 9     // 自动注入IRule接口用来代表负责负载均衡的策略
10     @Bean
11     @ConditionalOnMissingBean
12     public IRule ribbonRule(IClientConfig config) {
13         if (this.propertiesFactory.isSet(IRule.class, name)) {
14             return this.propertiesFactory.get(IRule.class, config, name);
15         }
16         ZoneAvoidanceRule rule = new ZoneAvoidanceRule();
17         rule.initWithNiwsConfig(config);
18         return rule;
19     }
20 
21     // 自动注入ILoadBalance接口用来代表负责均衡的操作
22     @Bean
23     @ConditionalOnMissingBean
24     public ILoadBalancer ribbonLoadBalancer(IClientConfig config,
25             ServerList<Server> serverList, ServerListFilter<Server> serverListFilter,
26             IRule rule, IPing ping, ServerListUpdater serverListUpdater) {
27         if (this.propertiesFactory.isSet(ILoadBalancer.class, name)) {
28             return this.propertiesFactory.get(ILoadBalancer.class, config, name);
29         }
30         return new ZoneAwareLoadBalancer<>(config, rule, ping, serverList,
31                 serverListFilter, serverListUpdater);
32     }
33 
34     ...
35 }

其中自动注入IRule接口用来代表负责负载均衡的策略(默认策略:ZoneAvoidanceRule),和自动注入ILoadBalance接口用来代表负责均衡的操作(默认均衡:ZoneAwareLoadBalancer)

4、查看ILoadBalance接口(负责均衡的操作)

继承关系如下:

内容如下:

 1 public interface ILoadBalancer {
 2 
 3     public void addServers(List<Server> newServers);
 4 
 5     // 根据key选择一个服务
 6     public Server chooseServer(Object key);
 7 
 8     public void markServerDown(Server server);
 9 
10     public List<Server> getServerList(boolean availableOnly);
11 
12     public List<Server> getReachableServers();
13 
14     public List<Server> getAllServers();
15 }

5、查看IRule接口(负责均衡的策略)

实现关系:

内容如下:

1 public interface IRule{
2 
3     // 根据key选择一个服务
4     public Server choose(Object key);
5     
6     public void setLoadBalancer(ILoadBalancer lb);
7     
8     public ILoadBalancer getLoadBalancer();    
9 }

通过查看实例类,可以看到具体的实现了,可以知道负责均衡的策略

6、Ribbon工作原理

查看LoadBalancerAutoConfiguration自动配置类

 1 @Configuration(proxyBeanMethods = false)
 2 @ConditionalOnClass(RestTemplate.class)
 3 @ConditionalOnBean(LoadBalancerClient.class)
 4 @EnableConfigurationProperties(LoadBalancerRetryProperties.class)
 5 public class LoadBalancerAutoConfiguration {
 6 
 7     
 8     ...
 9 
10 
11     @Configuration(proxyBeanMethods = false)
12     @ConditionalOnClass(RetryTemplate.class)
13     public static class RetryInterceptorAutoConfiguration {
14 
15         @Bean
16         @ConditionalOnMissingBean
17         public RetryLoadBalancerInterceptor ribbonInterceptor(
18                 LoadBalancerClient loadBalancerClient,
19                 LoadBalancerRetryProperties properties,
20                 LoadBalancerRequestFactory requestFactory,
21                 LoadBalancedRetryFactory loadBalancedRetryFactory) {
22             return new RetryLoadBalancerInterceptor(loadBalancerClient, properties,
23                     requestFactory, loadBalancedRetryFactory);
24         }
25 
26         // RestTemplate定制器
27         @Bean
28         @ConditionalOnMissingBean
29         public RestTemplateCustomizer restTemplateCustomizer(
30                 final RetryLoadBalancerInterceptor loadBalancerInterceptor) {
31             return restTemplate -> {
32                 List<ClientHttpRequestInterceptor> list = new ArrayList<>(
33                         restTemplate.getInterceptors());
34                 list.add(loadBalancerInterceptor);
35                 // 给restTemplate,设置拦截器
36                 restTemplate.setInterceptors(list);
37             };
38         }
39 
40     }
41 
42 }

其中自动配置了一个LoadBalancerInterceptor,LoadBalancerInterceptor是个ClientHttpRequestInterceptor客户端请求拦截器。它的作用是在客户端发起请求之前拦截,进而实现客户端的负载均衡。

以下是RestTemplate注入,加@LoadBalanced,的配置方法

 1 @Configuration
 2 public class AppConfig {
 3 
 4     /**
 5      * 注入restTemplate,请用请求rest接口
 6      * @return
 7      */
 8     @Bean
 9     // 标注此注解后,RestTemplate就具有了客户端负载均衡能力
10     // 负载均衡技术依赖于的是Ribbon组件~
11     // RestTemplate都塞入一个loadBalancerInterceptor 让其具备有负载均衡的能力
12     @LoadBalanced
13     public RestTemplate restTemplate(){
14         return new RestTemplate();
15     }
16 }

7、测试Ribbon,是否根据对于的负责均衡的策略,实现负载

1)调试模式启动项目,使用地址:http://localhost:8000/consumer/payment/get/1,进行访问

返回内容为提供者2个节点分别交替返回的,到达负载均衡目的。

2)在ZoneAvoidanceRule类中添加断点,通过运行程序,可以看到程序会运行到ZoneAvoidanceRule类中。

自带负载均衡规则说明

策略名策略声明策略描述实现说明
BestAvailableRulepublic class BestAvailableRule extends ClientConfigEnabledRoundRobinRule选择一个最小的并发请求的server逐个考察Server,如果Server被tripped了,则忽略,在选择其中ActiveRequestsCount最小的server
AvailabilityFilteringRulepublic class AvailabilityFilteringRule extends PredicateBasedRule过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值)使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个server的运行状态
WeightedResponseTimeRulepublic class WeightedResponseTimeRule extends RoundRobinRule根据相应时间分配一个weight,相应时间越长,weight越小,被选中的可能性越低。一个后台线程定期的从status里面读取评价响应时间,为每个server计算一个weight。Weight的计算也比较简单responsetime 减去每个server自己平均的responsetime是server的权重。当刚开始运行,没有形成statas时,使用roubine策略选择server。
RetryRulepublic class RetryRule extends AbstractLoadBalancerRule对选定的负载均衡策略机上重试机制。在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server
RoundRobinRulepublic class RoundRobinRule extends AbstractLoadBalancerRuleroundRobin方式轮询选择server轮询index,选择index对应位置的server
RandomRulepublic class RandomRule extends AbstractLoadBalancerRule随机选择一个server在index上随机,选择index对应位置的server
ZoneAvoidanceRulepublic class ZoneAvoidanceRule extends PredicateBasedRule复合判断server所在区域的性能和server的可用性选择server使用ZoneAvoidancePredicate和AvailabilityPredicate来判断是否选择某个server,前一个判断判定一个zone的运行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于过滤掉连接数过多的Server。

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

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

相关文章

【HCIP】15.MPLS基础

多协议标签交换 MPLS位于TCP/IP协议栈中的数据链路层和网络层之间&#xff0c;可以向所有网络层提供服务。 通过在数据链路层和网络层之间增加额外的MPLS头部&#xff0c;基于MPLS头部实现数据快速转发。 术语 MPLS域&#xff08;MPLS Domain&#xff09;&#xff1a;一系列…

EL0读取arm寄存器获取时间的方法

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】:【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈思考: 如何在EL0获取当前系统时间?如何在Userspace获取当前系统时间?在EL0可以通过读取ARM寄存器,获取系统的…

Mongodb两种启动方法

一、命令行启动 1.修改存放数据库的位置 说明&#xff1a;E:\data\mongodb&#xff1b;我在E盘创建的文件夹mongodb mongod --dbpathE:\data\mongodb 2.成功启动 说明&#xff1a;默认端口27017&#xff0c;代表已经启动成功 &#xff0c;并在mongodb自动创建文件 二、配置项…

Time-harmonic Maxwell’s equations

参考文献:Preconditioners and their analyses for edge element saddle-point systems arising from time-harmonic Maxwell’s equations

战略是通过分析战领一个位置

战略定位派&#xff1a;战略形成是一个分析过程【安志强趣讲266期】 趣讲大白话&#xff1a;占个有利位置 **************************** 定位通俗讲就是占个有利位置 企业界“心智定位”和“战略定位”吵得很凶 定位这个词最先由特劳特提出&#xff0c;营销要占领消费者的心智…

飞天使-k8s基础组件分析-服务与ingress

文章目录 服务的介绍服务代理服务发现连接集群外服务服务发布无头服务 服务&#xff0c;pod和dns的关系端口转发通过expose 暴露应用服务案例INGRESSMetalLB使用参考文档 服务的介绍 服务的作用是啥&#xff1f; 提供外部调用&#xff0c;保证podip的真实性看看服务解决了什么…

文件上传漏洞-upload靶场1-2关 通过笔记(如何区分前段验证和后端验证)

文件上传漏洞-upload靶场1-2关 通过笔记&#xff08;区分前段验证和后端验证&#xff09; 前言 upload是一个文件上传的专用靶场&#xff0c;搭设也非常简单&#xff0c;只需要把相关源码文件放到apache的网站目录下即可使用&#xff0c;或者去github下载一键绿化包进行安装链…

内网安全:WMI协议与SMB协议横向移动

目录 网络拓扑图 网络环境说明 WMI协议 SMB协议 域内信息收集 WMI协议 - 横向移动 利用方式一&#xff1a;wmic命令 利用方式一&#xff1a;cscript 利用方式一&#xff1a;impacket SMB协议 - 横向移动 利用方式一&#xff1a;psexec 利用方式二&#xff1a;psexe…

外贸客户开发:如何通过谷歌地图找到外贸大客户?

前言&#xff1a;这篇文章分享的实操案例对于外贸从业者特别有用&#xff0c;并分享了一款免费可用的浏览器插件进行如何批量获客。 做外贸需要找客户成交&#xff0c;外贸业务员成单的前提是就是找到国外客户。 外贸找客户的方法无外乎两种&#xff1a; 第一种是主动出击第…

三、pikachu之文件上传

文章目录 1、文件上传概述2、客户端检测2.1 客户端检测原理及绕过方法2.2 实际操作之client check 3、服务端检测3.1 MIME type3.3.1 检测原理3.3.2 绕过方法3.3.3 实际操作之MIME type 3.2 文件内容检测3.2.1 检测原理3.2.2 绕过方式3.2.3 实际操作之getimagesize() 3.3 其他服…

前端学习记录~2023.8.10~JavaScript重难点实例精讲~第6章 Ajax

第 6 章 Ajax 前言6.1 Ajax的基本原理及执行过程6.1.1 XMLHttpRequest对象&#xff08;1&#xff09;XMLHttpRequest对象的函数&#xff08;2&#xff09;XMLHttpRequest对象的属性 6.1.2 XMLHttpRequest对象生命周期&#xff08;1&#xff09;创建XMLHttpRequest对象&#xff…

[C++入门]---vector深度剖析及模拟实现

文章目录 1. vector功能函数模拟实现vector成员变量定义vecor构造函数vector迭代器vector的size函数vector的capacity函数vector的operator[]函数vector的reserve函数vector的resize函数vector的insert函数vector的erase函数vector的push_back函数vector的pop_back函数vector的…

三维重建_体素重建_空间雕刻法/体素着色法

目录 1. 三角化和体素重建的区别 2. 空间雕刻法 空间雕刻法的一致性定义 空间雕刻法具体实现 基于八叉树的空间雕刻法具体实现​编辑 空间雕刻法效果展示 3. 体素着色法 体素着色法的缺点&#xff1a;不唯一性​编辑 体素着色法不唯一性解决措施​编辑 体素着色发实验环境与…

edge浏览器使用jupyter notebook删除快捷键没有用?

按快捷键删除没有用&#xff0c;出现一个黑色方框&#xff0c;里面的数字不断在加 解决方法&#xff1a; 在扩展中将Global Speed控制视频速度的插件关掉&#xff0c;或者将控制速度的快捷键改一下 可以在浏览器设置 》扩展 》管理扩展 里面关掉该插件 可以在Global Speed 的…

安达发APS|三分钟了解智能制造!

智能是由“智慧”和“能力”两个词语构成。从感觉到记忆到思维这一过程&#xff0c;称为“智慧”&#xff0c;智慧的结果产生了行为和语言&#xff0c;将行为和语言的表达过程称为“能力”&#xff0c;两者合称为“智能”。 因此&#xff0c;将感觉、记忆、回忆、思维、语言、…

1631. 最小体力消耗路径

你准备参加一场远足活动。给你一个二维 rows x columns 的地图 heights &#xff0c;其中 heights[row][col] 表示格子 (row, col) 的高度。一开始你在最左上角的格子 (0, 0) &#xff0c;且你希望去最右下角的格子 (rows-1, columns-1) &#xff08;注意下标从 0 开始编号&…

Python+TinyPNG熊猫网站自动化的压缩图片

前言 本篇在讲什么 PythonTinyPNG自动化处理图片 本篇需要什么 对Python语法有简单认知 依赖Python2.7环境 依赖TinyPNG工具 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手 提供全流程的源码内容 ★提高阅读体验★ &#x1f449;…

VMware Workstation Pro 无法使用开机状态下拍的快照来克隆虚拟机,怎么解决?

环境: VMware Workstation Pro16.0 Win10 专业版 问题描述: VMware Workstation Pro有台虚拟机在开机状态下拍了个6.7快照这个win10初始版,现在想在这个快照下直接克隆,无法使用开机状态下拍的快照创建克隆 解决方案: 1.关闭当前虚拟机 2.到虚拟机文件夹复制一份Wind…

web---Vue2_语法学习

文章目录 1、Vue2 常用指令1.1 初始Vue1.2 Vue的两种模板语法1.3 数据绑定1.4 el和data的两种写法1.5 MVVM模型1.6 Vue中的数据代理1.7 事件处理--事件的基本使用1.7 事件处理--事件修饰符1.7 事件处理--键盘事件1.8 计算属性1.9 监视属性1.9 深度监视2.0 绑定css样式2.1 条件渲…

如果将PC电脑变成web服务器:使用python3监测公网IP实现DDNS

如果将PC电脑变成web服务器&#xff1a;使用python3监测公网IP实现DDNS 上一篇文章中&#xff0c;我们使用Nignx的反向代理和端口转发实现域名访问家里主机上的web了。 由于家庭宽带基本都是动态IP&#xff0c;每当你重启一次光猫&#xff0c;IP地址就会变化一次。当光猫因为…