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

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。

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

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

相关文章

神通数据库v7.0试用版安装步骤

网上找了下神通数据库的安装教程&#xff0c;发现都已经过时&#xff0c;或者安装受阻&#xff0c;于是直接从官网下载后尝试亲自安装了一遍适用版&#xff0c;在CentOS7(64bit)环境具体操作步骤如下&#xff1a; 1、安装 wget工具 yum install -y wget 2、安装rar解压工具 …

ssm学生公寓管理中心系统源码和论文

ssm学生公寓管理中心系统源码和论文057 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;…

Nexus 如何配置 Python 的私有仓库

Nexus 可作为一个代理来使用。 针对一些网络环境不好的公司&#xff0c;可以通过配置 Nexus 来作为远程的代理。 Group 概念 Nexus 有一个 Group 的概念&#xff0c;我们可以认为一个 Nexus 仓库的 Group 就是很多不同的仓库的集合。 从下面的配置中我们可以看到&#xff0…

用户端Web自动化测试_L3

目录&#xff1a; 浏览器复用Cookie 复用pageobject设计模式异常自动截图测试用例流程设计电子商务产品实战 1.浏览器复用 复用浏览器简介 为什么要学习复用浏览器&#xff1f; 自动化测试过程中&#xff0c;存在人为介入场景提高调试UI自动化测试脚本效率 复用已有浏览…

测试框架pytest教程(3)夹具-@pytest.fixture

内置fixture Fixture使用pytest.fixture装饰&#xff0c;pytest有一些内置的fixture 命令可以查看内置fixture pytest --fixtures fixture范围 在pytest中&#xff0c;夹具&#xff08;fixtures&#xff09;具有不同的作用范围&#xff08;scope&#xff09;&#xff0c;用于…

JAVA毕业设计095—基于Java+Springboot+Vue的酒店管理系统(源码+数据库)

基于JavaSpringbootVue的酒店管理系统(源码数据库)095 一、系统介绍 本系统前后端分离(网页端和app端都有) 本系统分为管理员、酒店管理员、酒店员工、用户四种角色(角色菜单可自行分配) 用户功能&#xff1a; 注册、登录、酒店搜索、酒店列表、酒店预订、我的收藏、我的订…

ACM模式(基础输入输出)

import java.lang.*; import java.util.*; public class Main{public static void main(String[] args){Scanner in new Scanner(System.in);while(in.hasNextInt()){//下一行是否有数据int ain.nextInt();int bin.nextInt();System.out.println(ab);}} }Java方法间的调用 http…

上海交大ACM班总教头团队重磅新作,带你动手学机器学习(文末赠书4本)

目录 0 写在前面1 什么是机器学习&#xff1f;2 ACM 班总教头&#xff1a;俞勇3 动手学习机器学习赠书活动 0 写在前面 机器学习强基计划聚焦深度和广度&#xff0c;加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理&#xff1b;“广”在分析多个机器…

git merge规则

参考文档&#xff1a;https://juejin.cn/post/7129333439299321887 丹尼尔&#xff1a;Hi&#xff0c;蛋兄&#xff0c;周杰伦都出新专辑了&#xff0c;你咋还不更新啊&#xff0c;真的打算半年一更啊&#xff1f; 蛋先生&#xff1a;好像确实是这样&#xff0c;要不&#xff0…

微信小程序的springboot实现 个人行程日程安排系统

本站后台采用Java的springboot框架进行后台管理开发&#xff0c;可以在浏览器上登录进行后台数据方面的管理&#xff0c;MySQL作为本地数据库&#xff0c;微信小程序用到了微信开发者工具&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特…

我是大运火炬手丨民营企业家极米钟波:大运精神激励企业不断创新、追求极致

7月26日&#xff0c;成都第31届世界大学生夏季运动会火炬传递成都站第五传递日活动&#xff0c;在成都3所高校以及东安湖体育公园继续进行。极米科技股份有限公司&#xff08;以下简称“极米科技”&#xff09;董事长钟波是第92棒火炬手。 火炬手钟波 大学求学在成都&#xff…

《知识图谱与大模型融合实践研究报告》发布,创邻科技参编

近期&#xff0c;第三届知识图谱产业发展论坛暨知识图谱与大模型融合研讨会在北京召开。会上&#xff0c;《知识图谱与大模型融合实践研究报告》正式发布&#xff01; 该白皮书是由中国电子技术标准化研究院依托知识图谱产业推进方阵、全国信标委人工智能分委会知识图谱工作组…

TCP可靠性机制

确认号/序列号/ACK TCP帮助确保数据的准确传递。为了做到这一点&#xff0c;其使用了一些特殊的标记和信息&#xff0c;其中包括序号、确认号和ACK字段。 其中&#xff0c;它将每个字节的数据都进行了编号. 即为序列号. 序列号&#xff1a;就像给书中的每一页都编了号码一样&a…

Redis三种持久化方式详解

一、Redis持久性 Redis如何将数据写入磁盘 持久性是指将数据写入持久存储&#xff0c;如固态磁盘&#xff08;SSD&#xff09;。Redis提供了一系列持久性选项。其中包括&#xff1a; RDB&#xff08;快照&#xff09;&#xff1a;RDB持久性以指定的时间间隔执行数据集的时间点…

vue 简单实验 v-if 条件判定

1.代码 <script src"https://unpkg.com/vuenext" rel"external nofollow" ></script> <div id"conditional-rendering"><span v-if"seen">现在你看到我了</span> </div> <script> const C…

语法篇--XML数据传输格式

一、XML概述 1.1简介 XML&#xff0c;全称为Extensible Markup Language&#xff0c;即可扩展标记语言&#xff0c;是一种用于存储和传输数据的文本格式。它是由W3C&#xff08;万维网联盟&#xff09;推荐的标准&#xff0c;广泛应用于各种系统中&#xff0c;如Web服务、数据…

回归预测 | MATLAB实现SA-ELM模拟退火算法优化极限学习机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现SA-ELM模拟退火算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现SA-ELM模拟退火算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基本…

Java“牵手”虾皮商品详情数据,根据商品ID获取虾皮(Shopee商品详情数据接口,虾皮API接口申请指南

虾皮&#xff08;shopee&#xff09;商城是一个跨境网上批发购物平台&#xff0c;售卖各类商品&#xff0c;包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取虾皮商品详情数据&#xff0c;您可以通过开放平台的接口或者直接访问虾皮商城的网页来获取商品详情信息。以下…

vim 配置环境变量与 JDK 编译器异常

vim 配置环境变量 使用 vim 打开系统中的配置信息&#xff08;不存在将会创建&#xff09;&#xff1a; vim ~/.bash_profile 以配置两个版本 JDK 为例&#xff08;前提是已安装 JDK&#xff09;,使用上述命令打开配置信息&#xff1a; 输入法调成英文&#xff0c;输入 i&…