【SpringCloud负载均衡】【源码+图解】【二】LoadBalancer配置

news2024/10/6 12:27:06

【SpringCloud负载均衡】【源码+图解】【一】LoadBalancer的HelloWorld体验

目录

  • 2. LoadBalancer的配置
    • 2.1 config.LoadBalancerAutoConfiguration
    • 2.2 BlockingLoadBalancerClientAutoConfiguration
    • 2.3 LoadBalancerEurekaAutoConfiguration
    • 2.4 loadbalancer.LoadBalancerAutoConfiguration & LoadBalancerInterceptorConfig

2. LoadBalancer的配置

下图是User客户端启动时配置文件的加载情况,箭头代表依赖。
在这里插入图片描述

2.1 config.LoadBalancerAutoConfiguration

// LoadBalancerClientsProperties即spring.cloud.loadbalancer.*的配置
@EnableConfigurationProperties(LoadBalancerClientsProperties.class)
// 如果不想要loadBalance功能可以将spring.cloud.loadbalancer.enabled=false,默认true,即默认开启LoadBalance功能
@ConditionalOnProperty(value = "spring.cloud.loadbalancer.enabled", havingValue = "true", matchIfMissing = true)
public class LoadBalancerAutoConfiguration {

    // 默认下是这些配置类
    // 	   default.org.springframework.cloud.netflix.eureka.loadbalancer.LoadBalancerEurekaAutoConfiguration
    // 	   org.springframework.cloud.netflix.eureka.loadbalancer.EurekaLoadBalancerClientConfiguration
    // 	   default.org.springframework.cloud.loadbalancer.config.BlockingLoadBalancerClientAutoConfiguration
    // 	   default.org.springframework.cloud.loadbalancer.config.LoadBalancerAutoConfiguration
	private final ObjectProvider<List<LoadBalancerClientSpecification>> configurations;

	public LoadBalancerAutoConfiguration(ObjectProvider<List<LoadBalancerClientSpecification>> configurations) {
		this.configurations = configurations;
	}

    // 它的作用是提供ZonePreferenceServiceInstanceListSupplier所需的zone,见4.2.2节
	@Bean
	@ConditionalOnMissingBean
	public LoadBalancerZoneConfig zoneConfig(Environment environment) {
		return new LoadBalancerZoneConfig(environment.getProperty("spring.cloud.loadbalancer.zone"));
	}

    // 注入LoadBalancerClientFactory,它的作用是创建ApplicationContext并提供loadBalance所需的类,见3.2节
	@ConditionalOnMissingBean
	@Bean
	public LoadBalancerClientFactory loadBalancerClientFactory(LoadBalancerClientsProperties properties) {
		LoadBalancerClientFactory clientFactory = new LoadBalancerClientFactory(properties);
		clientFactory.setConfigurations(this.configurations.getIfAvailable(Collections::emptyList));
		return clientFactory;
	}

}

2.2 BlockingLoadBalancerClientAutoConfiguration

@LoadBalancerClients
// 在前面的LoadBalancerAutoConfiguration之后配置
@AutoConfigureAfter(LoadBalancerAutoConfiguration.class)
@ConditionalOnClass(RestTemplate.class)
public class BlockingLoadBalancerClientAutoConfiguration {

    // 默认的BlockingLoadBalancerClient,它的作用是执行loadBalance的真正逻辑,见3节
	@Bean
	@ConditionalOnBean(LoadBalancerClientFactory.class)
	@ConditionalOnMissingBean
	public LoadBalancerClient blockingLoadBalancerClient(LoadBalancerClientFactory loadBalancerClientFactory) {
		return new BlockingLoadBalancerClient(loadBalancerClientFactory);
	}

    // 注入LoadBalancerServiceInstanceCookieTransformer,它的作用是将配置sticky-session的信息添加到请求头,见3.5节
	@Bean
	@ConditionalOnBean(LoadBalancerClientFactory.class)
	@ConditionalOnMissingBean(LoadBalancerServiceInstanceCookieTransformer.class)
	public LoadBalancerServiceInstanceCookieTransformer loadBalancerServiceInstanceCookieTransformer(
			LoadBalancerClientFactory loadBalancerClientFactory) {
		return new LoadBalancerServiceInstanceCookieTransformer(loadBalancerClientFactory);
	}

    // 注入XForwardedHeadersTransformer,它的作用是将配置中的x-forwarded信息添加到请求头,见3.5节
	@Bean
	@ConditionalOnMissingBean(XForwardedHeadersTransformer.class)
	@ConditionalOnBean(LoadBalancerClientFactory.class)
	public XForwardedHeadersTransformer xForwarderHeadersTransformer(
			LoadBalancerClientFactory loadBalancerClientFactory) {
		return new XForwardedHeadersTransformer(loadBalancerClientFactory);
	}
}

2.3 LoadBalancerEurekaAutoConfiguration

// 如果开启eureka客户端功能,则注入相应功能的类
@ConditionalOnProperty(name = "eureka.client.enabled", matchIfMissing = true)
public class LoadBalancerEurekaAutoConfiguration {
	public static final String LOADBALANCER_ZONE = "spring.cloud.loadbalancer.zone";

    // spring.cloud.loadbalancer.eureka.*的配置
	@Bean
	@ConditionalOnMissingBean
	EurekaLoadBalancerProperties eurekaLoadBalancerProperties() {
		return new EurekaLoadBalancerProperties();
	}

    // spring.cloud.loadbalancer.zone
	@Bean
	@ConditionalOnMissingBean
	LoadBalancerZoneConfig zoneConfig(Environment environment) {
		return new LoadBalancerZoneConfig(environment.getProperty(LOADBALANCER_ZONE));
	}

}

2.4 loadbalancer.LoadBalancerAutoConfiguration & LoadBalancerInterceptorConfig

LoadBalancerInterceptorConfig是loadbalancer.LoadBalancerAutoConfiguration的内部类,按着顺序看逻辑更清晰

public class LoadBalancerAutoConfiguration {

	@LoadBalanced
	@Autowired(required = false)
    // 4、获取所有需要LoadBalanced的RestTemplate
	private List<RestTemplate> restTemplates = Collections.emptyList();

    // LoadBalancerServiceInstanceCookieTransformer
    // XForwardedHeadersTransformer
	@Autowired(required = false)
	private List<LoadBalancerRequestTransformer> transformers = Collections.emptyList();

	@Bean
	public SmartInitializingSingleton loadBalancedRestTemplateInitializerDeprecated(
			final ObjectProvider<List<RestTemplateCustomizer>> restTemplateCustomizers) {
		return () -> restTemplateCustomizers.ifAvailable(customizers -> {
			for (RestTemplate restTemplate : LoadBalancerAutoConfiguration.this.restTemplates) {
				for (RestTemplateCustomizer customizer : customizers) {
                    // 5、给每个RestTemplate添加所有装饰器的功能
					customizer.customize(restTemplate);
				}
			}
		});
	}

    
	@Bean
	@ConditionalOnMissingBean
	public LoadBalancerRequestFactory loadBalancerRequestFactory(LoadBalancerClient loadBalancerClient) {
        // 1、初始化创建LoadBalancerRequest的工厂,作用是将如同http请求封装成BlockingLoadBalancerRequest
		return new LoadBalancerRequestFactory(loadBalancerClient, this.transformers);
	}

	@Configuration(proxyBeanMethods = false)
    // 如果org.springframework.retry.support.RetryTemplate不存在或者spring.cloud.loadbalancer.retry.enabled为false
    // 默认情况下两个条件都符合,所以默认情况下走LoadBalancerInterceptor,否则走RetryLoadBalancerInterceptor
	@Conditional(RetryMissingOrDisabledCondition.class)
	static class LoadBalancerInterceptorConfig {

        // 2、初始化拦截器LoadBalancerInterceptor,作用是拦截@LoadBalanced的RestTemplate发出的请求
		@Bean
		public LoadBalancerInterceptor loadBalancerInterceptor(LoadBalancerClient loadBalancerClient,
				LoadBalancerRequestFactory requestFactory) {
			return new LoadBalancerInterceptor(loadBalancerClient, requestFactory);
		}

        // 3、初始化装饰器,作用是将LoadBalancerInterceptor添加到RestTemplate
		@Bean
		@ConditionalOnMissingBean
		public RestTemplateCustomizer restTemplateCustomizer(final LoadBalancerInterceptor loadBalancerInterceptor) {
			return restTemplate -> {
                // 装饰器的功能:给restTemplate添加拦截器
				List<ClientHttpRequestInterceptor> list = new ArrayList<>(restTemplate.getInterceptors());
				list.add(loadBalancerInterceptor);
				restTemplate.setInterceptors(list);
			};
		}

	}
}

客户端成功启动后上述的配置就会生效,当客户端调用restTemplate发出请求时请求被Interceptor拦截,然后实现负载均衡。

未完待续

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

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

相关文章

[附源码]Python计算机毕业设计SSM建筑材料采购管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

引擎入门 | Unity UI简介–第2部分(5)

本期我们继续为大家进行Unity UI简介&#xff08;第二部分&#xff09;的后续教程 本篇内容 9.设置动画对话框 文章末尾可免费获取教程源代码 本篇本篇Unity UI简介&#xff08;第二部分&#xff09;篇幅较长&#xff0c;分为八篇&#xff0c;本篇为第五篇。 9.设置动画对…

css:css属性pointer-events实现点击穿透

文档 https://developer.mozilla.org/zh-CN/docs/Web/CSS/pointer-events pointer-events CSS 属性指定在什么情况下 (如果有) 某个特定的图形元素可以成为鼠标事件的 target 常用属性 /* Keyword values */ pointer-events: auto; /* 与pointer-events属性未指定时的表现效…

jsp+servlet+mysql实现的学生签到考勤请假管理系统源码+教程

今天给大家演示一下由jsp servlet mysql实现的一款学生签到管理系统&#xff0c;系统主要分管理员、学生、辅导员、教师等角色登录&#xff0c;实现学生发起请假、教师辅导员审批等动作&#xff0c;该项目不仅源码完整&#xff0c;还带有完整的论文文档&#xff0c;数据库设计说…

Linux下普通用户(非root用户)安装Java,Java程序能编译不能运行的原因

Linux下普通用户&#xff08;非root用户&#xff09;安装Java1. 下载2. 解压缩3. 修改环境变量4. 验证5. 第一个Java程序1. 下载 根据自己的系统&#xff0c;从官网上直接下载即可。本文以jdk-8u202-linux-x64.tar.gz为例。 2. 解压缩 使用以下命令解压 tar -zxvf jdk-8u2…

【Python自然语言处理+tkinter图形化界面】实现智能医疗客服问答机器人实战(附源码、数据集、演示 超详细)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 一、问答智能客服简介 QA问答是Question-and-Answer的缩写&#xff0c;根据用户提出的问题检索答案&#xff0c;并用用户可以理解的自然语言回答用户&#xff0c;问答型客服注重一问一答处理&#xff0c;侧重知识的推理。 …

Yolov5 中添加Network Slimming剪枝--稀疏训练部分

前言&#xff1a;Network Slimming剪枝过程让如下 1. 稀疏化 2. 剪枝 3. 反复迭代这个过程 一、稀疏化&#xff1a; 通过Network Slimming 的核心思想是:添加L1正则来约束BN层系数&#xff0c;从而剪掉那些贡献比较小的通道channel 原理如下&#xff1a;BN层的计算是这样的…

如何理解UML2.5.1(02篇)

为了避免使大家产生畏难情绪&#xff0c;本节先讲一个相对简单又相对普遍的问题。先看UML2.5.1中第13.2.3.5的如下内容&#xff1a; A Behavior shall be the method for no more than one BehavioralFeature, called its specification. 翻译过来就是&#xff1a; 一个行为应该…

[附源码]Python计算机毕业设计SSM家政服务系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

2093197-94-3,DBCO-BODIPY FL,二苯并环辛炔-BODIPY FL点击化学染料环辛炔

【中文名称】氟化硼二吡咯二苯并环辛炔&#xff0c;二苯并环辛炔-BODIPY FL 【英文名称】 DBCO-BODIPY FL&#xff0c;BDP FL DBCO 【结 构 式】 【CAS号】2093197-94-3 【分子式】C32H29BF2N4O2 【分子量】550.42 【基团部分】DBCO部分 【纯度标准】95% 【包装规格】5g&#x…

【校招VIP】线上实习 推推 书籍详情模块 产品脑图周最佳

【推推】主要是为校招设计的小说一更新就通知的项目&#xff0c;每个模块都具有亮点和难点&#xff0c;项目表现为手机网站应用&#xff0c;可嵌入小程序或APP中。 恭喜来自 太原理工大学 的 星晚&#x1f31f; 同学获得本周线上实习【推推】第一期 书籍详情模块 产品脑图设计…

kubernetes编排文件示例

kubernetes编排文件示例 编排文件生成网址&#xff1a;https://www.kubebiz.com/ mysql单机 需要一个配置文件,内容不会就用默认的即可 my.cnf [mysqld]pid-file /var/run/mysqld/mysqld.pid socket /var/run/mysqld/mysqld.sock datadir /var…

Python制作GUI学生管理系统,不会的看这里

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 欢迎观看本篇文章呀~不管你是学生还是工作人 我相信你进来了你就是想实现这个案例的 学会以后&#xff0c;还可以去接一些小小的外包&#xff0c;又是挣钱的一天~ 那么就开始实现吧&#xff01;python制作GUI 学生管理系…

Curve 块存储应用实践 -- iSCSI

Curve 是云原生计算基金会 (CNCF) Sandbox 项目&#xff0c;是网易数帆发起开源的高性能、易运维、云原生的分布式存储系统。 为了让大家更容易使用以及了解 Curve&#xff0c;我们期望接下来通过系列应用实践文章&#xff0c;以专题的形式向大家展示 Curve。 本篇文章是Curv…

activiti框架搭建及问题记录

activiti应用什么是activitiactiviti配置首先创建项目配置pom依赖配置文件那么审批&#xff08;流程&#xff09;怎么创建呢&#xff1f;流程启动任务处理activiti问题分享数据库创建问题activiti事件监听器没有对象的问题什么是activiti activiti是一个业务流程管理的框架&am…

LeetCode中等题之使括号有效的最少添加

题目 只有满足下面几点之一&#xff0c;括号字符串才是有效的&#xff1a; 它是一个空字符串&#xff0c;或者 它可以被写成 AB &#xff08;A 与 B 连接&#xff09;, 其中 A 和 B 都是有效字符串&#xff0c;或者 它可以被写作 (A)&#xff0c;其中 A 是有效字符串。 给定一…

开发工具系列IDEA:配置注释自动生成

一、类、接口、枚举配置&#xff0c;进入idea后&#xff0c;依次打开 File -> Settings -> Editor -> File and Code Templates -> Files /*** FileName: ${NAME}* Author: ${USER}* Date: ${DATE} ${TIME}* Description: ${DESCRIPTION}* History:* <aut…

中国电信移动物联网发展成果与创新实践 ,干货满满

近日&#xff0c;首届移动物联网大会&#xff08;2022&#xff09;&#xff08;以下简称“大会”&#xff09;在江苏省无锡市举办。本次大会由工信部指导&#xff0c;中国信息通信研究院&#xff08;以下简称“中国信通院”&#xff09;、中国通信学会、无锡市人民政府、人民邮…

产品工作流| 项目评估

一、什么是项目评估 根据已有的公开招标书要求&#xff0c;销售侧拿到招标要求&#xff0c;让研发评估项目。 1、需求满足度评估。 2、需求开发项&#xff0c;以及成本评估。 3、总结项目评估。 二、项目评估流程 材料依据&#xff1a; 1、投标材料。 2、项目评估表&#x…

路由器,集线器,交换机,网桥,光猫有啥区别?

网络分层 网线替代了上面的灰色部分&#xff0c;实现物理层互联。 如果想要两台电脑互联成功&#xff0c;还需要确保每一层所需要的步骤都要做到位&#xff0c;这样数据才能确保正确投送并返回。 从数据链路层到物理层&#xff0c;数据会被转为01比特流。 此时需要把比特流传…