负载均衡-ribbon源码解析

负载均衡-ribbon源码解析

1 @LoadBalanced注解

/*** 基于ribbon调用服务及负载均衡* @return*/
@LoadBalanced
@Bean
public RestTemplate restTemplate(){return new RestTemplate();
}

image-20230108140627021

image-20230108140840917

image-20230108141148123

@Bean
@ConditionalOnMissingBean
public RestTemplateCustomizer restTemplateCustomizer(final LoadBalancerInterceptor loadBalancerInterceptor) {return (restTemplate) -> {// 获取拦截器List<ClientHttpRequestInterceptor> list = new ArrayList(restTemplate.getInterceptors());// 添加一个新的拦截器(负载均衡的拦截器,该拦截器就是在restTemplate发送请求之前执行)list.add(loadBalancerInterceptor);// 将拦截器设置到restTemplate中  该restTemplate就是在OrderApplication中添加了@LoadBalanced的注解restTemplate.setInterceptors(list);};
}

总上所属:@LoadBalanced就是对template起到标识作用,加了@LoadBalanced注解的template开启负载均衡

2 源码解析

1)通过restTemplate发起请求

Result result = restTemplate.getForObject("http://product-server/product/" + id, Result.class);

2)执行拦截器的intercept方法

public ClientHttpResponse intercept(final HttpRequest request, final byte[] body, final ClientHttpRequestExecution execution) throws IOException {URI originalUri = request.getURI();String serviceName = originalUri.getHost();Assert.state(serviceName != null, "Request URI does not contain a valid hostname: " + originalUri);// 调用loadBalancer的execute方法  loadBalancer:负载均衡器// serviceName:就是product-serverreturn (ClientHttpResponse)this.loadBalancer.execute(serviceName, this.requestFactory.createRequest(request, body, execution));
}

3)查看RibbonLoadBalancerClient中的execute方法

public <T> T execute(String serviceId, LoadBalancerRequest<T> request, Object hint) throws IOException {// 通过负载均衡器 ILoadBalancer loadBalancer = this.getLoadBalancer(serviceId);// 通过负载均衡器 接 负载均衡算法 获取服务实例Server server = this.getServer(loadBalancer, hint);if (server == null) {throw new IllegalStateException("No instances available for " + serviceId);} else {RibbonLoadBalancerClient.RibbonServer ribbonServer = new RibbonLoadBalancerClient.RibbonServer(serviceId, server, this.isSecure(server, serviceId), this.serverIntrospector(serviceId).getMetadata(server));return this.execute(serviceId, (ServiceInstance)ribbonServer, (LoadBalancerRequest)request);}
}

4)根据负载均衡算法获取服务实例

protected Server getServer(ILoadBalancer loadBalancer, Object hint) {return loadBalancer == null ? null : loadBalancer.chooseServer(hint != null ? hint : "default");
}
public Server chooseServer(Object key) {if (this.counter == null) {this.counter = this.createCounter();}this.counter.increment();if (this.rule == null) {return null;} else {try {// rule就是配置的负载均衡算法// choose就是根据指定的负载均衡算法获取服务实例return this.rule.choose(key);} catch (Exception var3) {logger.warn("LoadBalancer [{}]:  Error choosing server for key {}", new Object[]{this.name, key, var3});return null;}}
}
// 默认的负载均衡器
private static final IRule DEFAULT_RULE = new RoundRobinRule();

}
}
}


```java
// 默认的负载均衡器
private static final IRule DEFAULT_RULE = new RoundRobinRule();

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

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

相关文章

基于element-ui的年份范围选择器

基于element-ui的年份范围选择器 element-ui官方只有日期范围和月份范围选择器&#xff0c;根据需求场景需要&#xff0c;支持年份选择器&#xff0c;原本使用两个分开的年份选择器实现的&#xff0c;但是往往有些是不能接受的。在网上找了很多都没有合适的&#xff0c;所以打…

记录一次部署Hugo主题lotusdocs到Github Pages实践

引言 随着开源项目的越来越复杂&#xff0c;项目文档的重要性日渐突出。一个好的项目要有一个清晰明了的文档来帮助大家使用。最近一直有在找寻一个简洁明了的文档主题来放置项目的各种相关文档。最终找到这次的主角&#xff1a;Lotus Docs 基于Hugo的主题。Lotus Docs的样子&…

Axure原型设计累加器计时器设计效果(职业院校技能大赛物联网技术应用项目原型设计题目)

目录 前言 一、本题实现效果 二、操作步骤 1.新建文件 2.界面设计 2.1文本框 2.2 按钮 2.3设计界面完成 3.交互 3.1启动交互设置 3.2 分别设置三个属性 3.2.1 设置值为“0” 3.2.2 文字于文本框 3.2.3 获取焦点时 3.3 停止按钮的交互动作 3.3.1 设置变量值 3.4 重…

RCNA 锐捷培训

第一章 网络基础入门 1.1 OSI参考模型及TCP/IP协议栈 数据是如何传输的&#xff1f; 数据在计算机网络中传输通常依赖于TCP/IP协议模型。 什么是网络&#xff1f; 网络是一种连接多个计算机、设备或系统的通信基础设施&#xff0c;其目的是实现资源共享、信息传递、接收和共享…

mysql 快速上传数据

快速上传数据 这个应该是比inset into values更快的插入数据的办法了。 不过要求挺苛刻的&#xff0c;数据要整理成和表格一致&#xff0c;也就是说每条数据都是完整的一条&#xff0c;而不是一部分。 下面的示例我以***为分割符划分字段&#xff0c;以 \n来分割每条数据。 LO…

自动化运维工具Ansible教程(二)【进阶篇】

文章目录 前言Ansible 入门到精通自动化运维工具Ansible教程(一)【入门篇】自动化运维工具Ansible教程(二)【进阶篇】精通篇 进阶篇1. Ansible 的高级主题&#xff08;例如&#xff1a;角色、动态清单、变量管理等&#xff09;**1. 角色&#xff08;Roles&#xff09;**&#x…

Tomcat修改配置文件

1.Tomcat启动乱码问题 1.1conf目录 说明&#xff1a;找到conf目录下logging.properties文件 1.2打开logging.properties文件 说明&#xff1a;将UTF-8修改成GBK 1.3.效果 2.端口冲突问题 2.1 conf目录 2.2打开 server.xml文件 2.3.修改端口 说明&#xff1a;port指的就是端…

LomBok常用注解及详细介绍

LomBok常用注解及详细介绍 前言 Lombok是一个作用于编辑器和构建工具的 Java 库&#xff0c;可以对编写的 Java 代码进行增强&#xff0c;比如说不用再写实体类的 getter 方法&#xff0c;equals 方法而是自动生成&#xff0c;自动生成日志输出变量等等&#xff0c;减少重复模…

vscode-server

1know_host清除 2 删除服务器里的home/user/.vscode-server&#xff08;不是根root下的vscode-server&#xff09;&#xff0c;删除时用户名保持一致。 3 ssh配置文件 /etc/ssh/sshd_config[想改变,使用root&#xff0c;修改文件权限] 4 删除修改后&#xff0c;重启Windows下…

解决 Axios 跨域问题,轻松实现接口调用

跨域是指访问另外一个域的资源&#xff0c;由于浏览器的同源策略&#xff0c;默认情况下使用 XMLHttpRequest 和 Fetch 请求时是不允许跨域的。跨域的根本原因是浏览器的同源策略&#xff0c;这是由浏览器对 JavaScript 施加的安全限制。 Axios 跨域常见报错 跨域请求被阻止 (…

网上办公系统设计与实现

目录 前言 1问题定义 1.1系统名称 1.2系统背景 1.3系统目标 2 可行性分析 2.1 经济可行性 2.2 技术可行性 2.3 操作可行性 2.4 法律可行性 2.5 可行性研究结论 2.6 用户组织机构图 2.7 目标系统业务流程图 2.8 接口设计 2.8.1外部接口 2.8.2 内部接口 3 需求分…

CentOS 安装HTTP代理服务器 Tinyproxy

Tinyproxy是一个小型的基于GPL的HTTP/SSL代理程序&#xff0c;非常适合小型网络而且便于快速部署。这个代理程序最大的优点就是占用系统资源比较少。这里使用的系统为CentOS7.6&#xff0c;可以直接 yum 方式安装。 yum install tinyproxy -y 如果提示找不到安装包&#xff0…