Spring Cloud 提供了自己的客户端负载均衡器抽象和实现。用于负载均衡 添加了机制、接口以及基于循环随机的实现 已为此提供。为了让实例从反应式中进行选择,使用了反应式。目前,我们支持基于服务的实现,该实现使用类路径中可用的发现客户端从服务发现中检索可用实例。ReactiveLoadBalancerServiceInstanceListSupplierServiceInstanceListSupplierSpring中文文档

可以通过将 的值设置为 来禁用 Spring Cloud LoadBalancer。spring.cloud.loadbalancer.enabledfalse
可以通过将 的值设置为 来禁用 Spring Cloud LoadBalancer。spring.cloud.loadbalancer.enabledfalse

LoadBalancer 上下文的急速加载

Spring Cloud LoadBalancer 为每个服务 ID 创建单独的 Spring 子上下文。默认情况下,每当对服务 ID 的第一个请求进行负载均衡时,这些上下文都会延迟初始化。Spring中文文档

您可以选择急切地加载这些上下文。为此,请使用属性指定要对其执行紧急加载的服务 ID,例如:spring.cloud.loadbalancer.eager-load.clientsSpring中文文档

spring.cloud-loadbalancer.eager-load.clients[0]=my-first-client
spring.cloud-loadbalancer.eager-load.clients[1]=my-second-client

在负载均衡算法之间切换

默认情况下使用的实现是 。要切换到其他实现,无论是针对选定的服务还是所有服务,您可以使用自定义 LoadBalancer 配置机制ReactiveLoadBalancerRoundRobinLoadBalancerSpring中文文档

例如,可以通过注解传递以下配置,以切换到使用 :@LoadBalancerClientRandomLoadBalancerSpring中文文档

public class CustomLoadBalancerConfiguration {

	@Bean
	ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
			LoadBalancerClientFactory loadBalancerClientFactory) {
		String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
		return new RandomLoadBalancer(loadBalancerClientFactory
				.getLazyProvider(name, ServiceInstanceListSupplier.class),
				name);
	}
}
作为类或配置参数传递的类不应使用组件扫描范围进行批注,也不应超出组件扫描范围。@LoadBalancerClient@LoadBalancerClients@Configuration
作为类或配置参数传递的类不应使用组件扫描范围进行批注,也不应超出组件扫描范围。@LoadBalancerClient@LoadBalancerClients@Configuration

Spring Cloud LoadBalancer 集成

为了便于使用 Spring Cloud LoadBalancer,我们提供了 (可以与 ) 和 (与 一起使用)。 您可以在以下部分中查看更多信息和用法示例:ReactorLoadBalancerExchangeFilterFunctionWebClientBlockingLoadBalancerClientRestTemplateRestClientSpring中文文档

Spring Cloud LoadBalancer 缓存

除了每次必须选择实例时检索实例的基本实现外,我们还提供了两种缓存实现。ServiceInstanceListSupplierDiscoveryClientSpring中文文档

咖啡因支持的 LoadBalancer 缓存实现

如果您在类路径中,将使用基于 Caffeine 的实现。 有关如何配置它的信息,请参阅 LoadBalancerCacheConfiguration 部分。com.github.ben-manes.caffeine:caffeineSpring中文文档

如果您使用的是 Caffeine,则还可以通过在属性中传递您自己的 Caffeine 规范来覆盖 LoadBalancer 的默认 Caffeine 缓存设置。spring.cloud.loadbalancer.cache.caffeine.specSpring中文文档

警告:传递您自己的 Caffeine 规范将覆盖任何其他 LoadBalancerCache 设置,包括常规 LoadBalancer 缓存配置字段,例如 和 。ttlcapacitySpring中文文档

默认 LoadBalancer 缓存实现

如果类路径中没有 Caffeine,则将使用 自动附带的 。 有关如何配置它的信息,请参阅 LoadBalancerCacheConfiguration 部分。DefaultLoadBalancerCachespring-cloud-starter-loadbalancerSpring中文文档

要使用 Caffeine 而不是默认缓存,请将依赖项添加到 classpath。com.github.ben-manes.caffeine:caffeine

LoadBalancer 缓存配置

您可以设置自己的值(写入后条目应过期的时间),表示为 ,方法是传递符合 Spring Boot String to Duration 转换器语法。 作为属性的值。 您还可以通过设置属性的值来设置自己的 LoadBalancer 缓存初始容量。ttlDurationStringspring.cloud.loadbalancer.cache.ttlspring.cloud.loadbalancer.cache.capacitySpring中文文档

默认设置包括 设置为 35 秒,默认设置为 。ttlinitialCapacity256Spring中文文档

您还可以通过将 的值设置为 来完全禁用 loadBalancer 缓存。spring.cloud.loadbalancer.cache.enabledfalseSpring中文文档

尽管基本的非缓存实现对于原型设计和测试很有用,但它的效率远低于缓存版本,因此我们建议始终在生产中使用缓存版本。例如,如果缓存已由实现完成,则应禁用负载均衡器缓存以防止双重缓存。DiscoveryClientEurekaDiscoveryClient
创建自己的配置时,如果使用,请确保将其直接放在通过网络检索实例的供应商之后的层次结构中,例如,在任何其他筛选供应商之前。CachingServiceInstanceListSupplierDiscoveryClientServiceInstanceListSupplier
要使用 Caffeine 而不是默认缓存,请将依赖项添加到 classpath。com.github.ben-manes.caffeine:caffeine
尽管基本的非缓存实现对于原型设计和测试很有用,但它的效率远低于缓存版本,因此我们建议始终在生产中使用缓存版本。例如,如果缓存已由实现完成,则应禁用负载均衡器缓存以防止双重缓存。DiscoveryClientEurekaDiscoveryClient
创建自己的配置时,如果使用,请确保将其直接放在通过网络检索实例的供应商之后的层次结构中,例如,在任何其他筛选供应商之前。CachingServiceInstanceListSupplierDiscoveryClientServiceInstanceListSupplier

加权负载均衡

为了实现加权负载均衡,我们提供了 .我们用来计算每个实例的权重。 默认情况下,我们尝试从元数据映射中读取和解析权重(键为 )。WeightedServiceInstanceListSupplierWeightFunctionweightSpring中文文档

如果元数据映射中未指定权重,则默认此实例的权重为 1。Spring中文文档

您可以通过设置 to 的值或提供您自己的 Bean 来配置它,例如:spring.cloud.loadbalancer.configurationsweightedServiceInstanceListSupplierSpring中文文档

public class CustomLoadBalancerConfiguration {

	@Bean
	public ServiceInstanceListSupplier discoveryClientServiceInstanceListSupplier(
			ConfigurableApplicationContext context) {
		return ServiceInstanceListSupplier.builder()
					.withDiscoveryClient()
					.withWeighted()
					.withCaching()
					.build(context);
	}
}
您还可以通过提供来自定义权重计算逻辑。WeightFunction

您可以使用此示例配置使所有实例都具有随机权重:Spring中文文档

public class CustomLoadBalancerConfiguration {

	@Bean
	public ServiceInstanceListSupplier discoveryClientServiceInstanceListSupplier(
			ConfigurableApplicationContext context) {
		return ServiceInstanceListSupplier.builder()
					.withDiscoveryClient()
					.withWeighted(instance -> ThreadLocalRandom.current().nextInt(1, 101))
					.withCaching()
					.build(context);
	}
}
您还可以通过提供来自定义权重计算逻辑。WeightFunction

基于区域的负载均衡

为了实现基于区域的负载均衡,我们提供了 . 我们使用特定于 -的配置(例如,)来选择客户端尝试筛选其可用服务实例的区域。ZonePreferenceServiceInstanceListSupplierDiscoveryClientzoneeureka.instance.metadata-map.zoneSpring中文文档

还可以通过设置属性值来覆盖特定于区域的设置。DiscoveryClientspring.cloud.loadbalancer.zone
目前,仅检测 Eureka Discovery Client 来设置 LoadBalancer 区域。对于其他发现客户端,请设置属性。更多仪器即将推出。spring.cloud.loadbalancer.zone
为了确定检索到的区域,我们检查其元数据映射中键下的值。ServiceInstance"zone"

筛选器检索到的实例,仅返回同一区域内的实例。 如果该区域是或同一区域中没有实例,则返回所有检索到的实例。ZonePreferenceServiceInstanceListSuppliernullSpring中文文档

为了使用基于区域的负载平衡方法,您必须在自定义配置中实例化 Bean。ZonePreferenceServiceInstanceListSupplierSpring中文文档

我们使用委托来处理 bean。 我们建议使用委托,用 to 利用 LoadBalancer 缓存机制包装它,然后在 的构造函数中传递生成的 bean。ServiceInstanceListSupplierDiscoveryClientServiceInstanceListSupplierCachingServiceInstanceListSupplierZonePreferenceServiceInstanceListSupplierSpring中文文档

您可以使用以下示例配置进行设置:Spring中文文档

public class CustomLoadBalancerConfiguration {

	@Bean
	public ServiceInstanceListSupplier discoveryClientServiceInstanceListSupplier(
			ConfigurableApplicationContext context) {
		return ServiceInstanceListSupplier.builder()
					.withDiscoveryClient()
                    .withCaching()
					.withZonePreference()
					.build(context);
	}
}
还可以通过设置属性值来覆盖特定于区域的设置。DiscoveryClientspring.cloud.loadbalancer.zone
目前,仅检测 Eureka Discovery Client 来设置 LoadBalancer 区域。对于其他发现客户端,请设置属性。更多仪器即将推出。spring.cloud.loadbalancer.zone
为了确定检索到的区域,我们检查其元数据映射中键下的值。ServiceInstance"zone"

LoadBalancer 的实例运行状况检查

可以为 LoadBalancer 启用计划的 HealthCheck。为此提供了。它会定期验证委托提供的实例是否仍然有效,并且仅返回正常的实例。 除非没有 - 否则它将返回所有检索到的实例。HealthCheckServiceInstanceListSupplierServiceInstanceListSupplierSpring中文文档

此机制在使用 .对于 由实际的 Service Registry 支持的客户端,没有必要使用,正如我们已经得到的那样 查询外部 ServiceDiscovery 后的正常实例。SimpleDiscoveryClient
对于每个服务具有少量实例的设置,也建议使用此供应商 以避免重试对失败实例的调用。
如果使用任何 Service Discovery 支持的供应商,则通常不需要添加此运行状况检查机制,因为我们直接检索实例的运行状况 从服务注册表。
依赖于委托通量提供的更新实例。在极少数情况下,当您希望使用不刷新实例的委托时,即使实例列表可能会更改(例如我们提供的),您也可以设置为让 .然后,您还可以通过修改 的值来调整 refretch 间隔,并通过设置为 as each instances refetch 来选择禁用额外的运行状况检查重复 也会触发健康检查。HealthCheckServiceInstanceListSupplierDiscoveryClientServiceInstanceListSupplierspring.cloud.loadbalancer.health-check.refetch-instancestrueHealthCheckServiceInstanceListSupplierspring.cloud.loadbalancer.health-check.refetch-instances-intervalspring.cloud.loadbalancer.health-check.repeat-health-checkfalse

HealthCheckServiceInstanceListSupplier使用以 . 为前缀的属性。您可以为调度程序设置 and。您可以通过设置 属性的值。还可以通过设置属性的值来为任何给定服务设置特定值,并替换为服务的正确 ID。如果未指定,则默认使用。如果设置为 或 为 空 作为值,则不会执行运行状况检查。您还可以通过设置 的值来设置运行状况检查请求的自定义端口。如果未设置任何端口,则请求的服务在服务实例中可用。spring.cloud.loadbalancer.health-checkinitialDelayintervalspring.cloud.loadbalancer.health-check.path.defaultspring.cloud.loadbalancer.health-check.path.[SERVICE_ID][SERVICE_ID][SERVICE_ID]/actuator/health[SERVICE_ID]nullspring.cloud.loadbalancer.health-check.portSpring中文文档

如果依赖于默认路径 (),请确保添加到协作者的依赖项,除非您计划自行添加此类终结点。/actuator/healthspring-boot-starter-actuator
默认情况下,将在已检索到的每个活动状态上发出。您可以通过将 的值设置为 来修改此行为。如果此属性设置为 ,则首先将整个活动实例序列收集到列表中,然后才发出,这可确保通量不会在属性中设置的运行状况检查间隔之间发出值。healthCheckFluxServiceInstancespring.cloud.loadbalancer.health-check.update-results-listfalsefalse

为了使用运行状况检查调度程序方法,您必须在自定义配置中实例化 Bean。HealthCheckServiceInstanceListSupplierSpring中文文档

我们使用委托来处理 bean。 我们建议在 的构造函数中传递一个委托。ServiceInstanceListSupplierDiscoveryClientServiceInstanceListSupplierHealthCheckServiceInstanceListSupplierSpring中文文档

您可以使用以下示例配置进行设置:Spring中文文档

public class CustomLoadBalancerConfiguration {

	@Bean
	public ServiceInstanceListSupplier discoveryClientServiceInstanceListSupplier(
			ConfigurableApplicationContext context) {
		return ServiceInstanceListSupplier.builder()
					.withDiscoveryClient()
					.withHealthChecks()
					.build(context);
	    }
	}
对于非反应式堆栈,请使用 . 您还可以传递自己的 或实例以用于检查。withBlockingHealthChecks()WebClientRestTemplateRestClient
HealthCheckServiceInstanceListSupplier有自己的基于 Reactor Flux 的缓存机制。因此,如果正在使用它,您可能希望跳过用 .replay()CachingServiceInstanceListSupplier
创建自己的配置时,请确保将其直接放在通过网络检索实例的供应商之后的层次结构中,例如,在任何其他筛选供应商之前。HealthCheckServiceInstanceListSupplierDiscoveryClientServiceInstanceListSupplier
此机制在使用 .对于 由实际的 Service Registry 支持的客户端,没有必要使用,正如我们已经得到的那样 查询外部 ServiceDiscovery 后的正常实例。SimpleDiscoveryClient
对于每个服务具有少量实例的设置,也建议使用此供应商 以避免重试对失败实例的调用。
如果使用任何 Service Discovery 支持的供应商,则通常不需要添加此运行状况检查机制,因为我们直接检索实例的运行状况 从服务注册表。
依赖于委托通量提供的更新实例。在极少数情况下,当您希望使用不刷新实例的委托时,即使实例列表可能会更改(例如我们提供的),您也可以设置为让 .然后,您还可以通过修改 的值来调整 refretch 间隔,并通过设置为 as each instances refetch 来选择禁用额外的运行状况检查重复 也会触发健康检查。HealthCheckServiceInstanceListSupplierDiscoveryClientServiceInstanceListSupplierspring.cloud.loadbalancer.health-check.refetch-instancestrueHealthCheckServiceInstanceListSupplierspring.cloud.loadbalancer.health-check.refetch-instances-intervalspring.cloud.loadbalancer.health-check.repeat-health-checkfalse
如果依赖于默认路径 (),请确保添加到协作者的依赖项,除非您计划自行添加此类终结点。/actuator/healthspring-boot-starter-actuator
默认情况下,将在已检索到的每个活动状态上发出。您可以通过将 的值设置为 来修改此行为。如果此属性设置为 ,则首先将整个活动实例序列收集到列表中,然后才发出,这可确保通量不会在属性中设置的运行状况检查间隔之间发出值。healthCheckFluxServiceInstancespring.cloud.loadbalancer.health-check.update-results-listfalsefalse
对于非反应式堆栈,请使用 . 您还可以传递自己的 或实例以用于检查。withBlockingHealthChecks()WebClientRestTemplateRestClient
HealthCheckServiceInstanceListSupplier有自己的基于 Reactor Flux 的缓存机制。因此,如果正在使用它,您可能希望跳过用 .replay()CachingServiceInstanceListSupplier
创建自己的配置时,请确保将其直接放在通过网络检索实例的供应商之后的层次结构中,例如,在任何其他筛选供应商之前。HealthCheckServiceInstanceListSupplierDiscoveryClientServiceInstanceListSupplier

LoadBalancer 的相同实例首选项

您可以设置 LoadBalancer,使其优先选择之前选择的实例(如果该实例可用)。Spring中文文档

为此,您需要使用 .您可以通过设置 to 的值或提供自己的 Bean 来配置它,例如:SameInstancePreferenceServiceInstanceListSupplierspring.cloud.loadbalancer.configurationssame-instance-preferenceServiceInstanceListSupplierSpring中文文档

public class CustomLoadBalancerConfiguration {

	@Bean
	public ServiceInstanceListSupplier discoveryClientServiceInstanceListSupplier(
			ConfigurableApplicationContext context) {
		return ServiceInstanceListSupplier.builder()
					.withDiscoveryClient()
					.withSameInstancePreference()
					.build(context);
	    }
	}
这也是 Zookeeper 的替代品。StickyRule
这也是 Zookeeper 的替代品。StickyRule

LoadBalancer 的基于请求的粘性会话

您可以设置 LoadBalancer,使其首选请求 cookie 中提供的实例。如果请求通过 或 传递给 LoadBalancer,则我们目前支持此功能,这些 或由 SC LoadBalancer 交换筛选器函数和筛选器使用。instanceIdClientRequestContextServerHttpRequestContextSpring中文文档

为此,您需要使用 .您可以通过设置 to 的值或提供自己的 Bean 来配置它,例如:RequestBasedStickySessionServiceInstanceListSupplierspring.cloud.loadbalancer.configurationsrequest-based-sticky-sessionServiceInstanceListSupplierSpring中文文档

public class CustomLoadBalancerConfiguration {

	@Bean
	public ServiceInstanceListSupplier discoveryClientServiceInstanceListSupplier(
			ConfigurableApplicationContext context) {
		return ServiceInstanceListSupplier.builder()
					.withDiscoveryClient()
					.withRequestBasedStickySession()
					.build(context);
	    }
	}

对于该功能,在发送请求转发之前,更新所选的服务实例(如果原始请求 Cookie 不可用,则可能与原始请求 Cookie 中的服务实例不同)非常有用。为此,请将 的值设置为 。spring.cloud.loadbalancer.sticky-session.add-service-instance-cookietrueSpring中文文档

默认情况下,Cookie 的名称为 。您可以通过更改属性的值来修改它。sc-lb-instance-idspring.cloud.loadbalancer.instance-id-cookie-nameSpring中文文档

WebClient 支持的负载平衡当前支持此功能。
WebClient 支持的负载平衡当前支持此功能。

Spring Cloud LoadBalancer 提示

Spring Cloud LoadBalancer 允许您设置提示,这些提示在对象中传递给 LoadBalancer,以后可以在可以处理它们的实现中使用。StringRequestReactiveLoadBalancerSpring中文文档

可以通过设置属性的值来为所有服务设置默认提示。您还可以设置特定值 对于任何给定的服务,请设置属性的值,并替换为服务的正确 ID。如果提示不是由用户设置的,则使用。spring.cloud.loadbalancer.hint.defaultspring.cloud.loadbalancer.hint.[SERVICE_ID][SERVICE_ID]defaultSpring中文文档

基于提示的负载均衡

我们还提供了一个 ,这是一个基于提示的实例选择的实现。HintBasedServiceInstanceListSupplierServiceInstanceListSupplierSpring中文文档

HintBasedServiceInstanceListSupplier检查提示请求标头(默认 header-name 为 ,但可以通过更改属性的值来修改它),如果找到提示请求标头,则使用标头中传递的提示值来筛选服务实例。X-SC-LB-Hintspring.cloud.loadbalancer.hint-header-nameSpring中文文档

如果未添加提示标头,则使用属性中的提示值来筛选服务实例。HintBasedServiceInstanceListSupplierSpring中文文档

如果未通过标头或属性设置任何提示,则返回委托提供的所有服务实例。Spring中文文档

筛选时,查找在其 . 中的键下设置了匹配值的服务实例。如果未找到匹配的实例,则返回委托提供的所有实例。HintBasedServiceInstanceListSupplierhintmetadataMapSpring中文文档

您可以使用以下示例配置进行设置:Spring中文文档

public class CustomLoadBalancerConfiguration {

	@Bean
	public ServiceInstanceListSupplier discoveryClientServiceInstanceListSupplier(
			ConfigurableApplicationContext context) {
		return ServiceInstanceListSupplier.builder()
					.withDiscoveryClient()
                    .withCaching()
					.withHints()
					.build(context);
	}
}

转换负载均衡的 HTTP 请求

您可以使用所选内容来转换负载平衡的 HTTP 请求。ServiceInstanceSpring中文文档

对于 和 ,您需要实现和定义如下:RestTemplateRestClientLoadBalancerRequestTransformerSpring中文文档

@Bean
public LoadBalancerRequestTransformer transformer() {
	return new LoadBalancerRequestTransformer() {
		@Override
		public HttpRequest transformRequest(HttpRequest request, ServiceInstance instance) {
			return new HttpRequestWrapper(request) {
				@Override
				public HttpHeaders getHeaders() {
					HttpHeaders headers = new HttpHeaders();
					headers.putAll(super.getHeaders());
					headers.add("X-InstanceId", instance.getInstanceId());
					return headers;
				}
			};
		}
	};
}

对于 ,您需要实现和定义如下:WebClientLoadBalancerClientRequestTransformerSpring中文文档

@Bean
public LoadBalancerClientRequestTransformer transformer() {
	return new LoadBalancerClientRequestTransformer() {
		@Override
		public ClientRequest transformRequest(ClientRequest request, ServiceInstance instance) {
			return ClientRequest.from(request)
					.header("X-InstanceId", instance.getInstanceId())
					.build();
		}
	};
}

如果定义了多个转换器,则按照定义 Bean 的顺序应用它们。 或者,您可以使用 或 指定顺序。LoadBalancerRequestTransformer.DEFAULT_ORDERLoadBalancerClientRequestTransformer.DEFAULT_ORDERSpring中文文档

Spring Cloud LoadBalancer 子集

SubsetServiceInstanceListSupplier实现确定性子集算法,以在委托层次结构中选择有限数量的实例。ServiceInstanceListSupplierSpring中文文档

您可以通过设置 to 的值或提供自己的 Bean 来配置它,例如:spring.cloud.loadbalancer.configurationssubsetServiceInstanceListSupplierSpring中文文档

public class CustomLoadBalancerConfiguration {

	@Bean
	public ServiceInstanceListSupplier discoveryClientServiceInstanceListSupplier(
			ConfigurableApplicationContext context) {
		return ServiceInstanceListSupplier.builder()
					.withDiscoveryClient()
					.withSubset()
					.withCaching()
					.build(context);
	    }
	}
默认情况下,每个服务实例都被分配一个唯一的 ,不同的值通常会选择不同的子集。通常,您无需注意它。但是,如果需要让多个实例选择相同的子集,则可以使用(支持占位符)进行设置。instanceIdinstanceIdspring.cloud.loadbalancer.subset.instance-id
默认情况下,子集的大小设置为 100。您也可以将其设置为 .spring.cloud.loadbalancer.subset.size
默认情况下,每个服务实例都被分配一个唯一的 ,不同的值通常会选择不同的子集。通常,您无需注意它。但是,如果需要让多个实例选择相同的子集,则可以使用(支持占位符)进行设置。instanceIdinstanceIdspring.cloud.loadbalancer.subset.instance-id
默认情况下,子集的大小设置为 100。您也可以将其设置为 .spring.cloud.loadbalancer.subset.size

Spring Cloud LoadBalancer 入门版

我们还提供了一个入门器,允许您在 Spring Boot 应用程序中轻松添加 Spring Cloud LoadBalancer。 为了使用它,只需在构建文件中添加到您的 Spring Cloud 依赖项即可。org.springframework.cloud:spring-cloud-starter-loadbalancerSpring中文文档

Spring Cloud LoadBalancer 入门包括 Spring Boot CachingEvictor
Spring Cloud LoadBalancer 入门包括 Spring Boot CachingEvictor

传递您自己的 Spring Cloud LoadBalancer 配置

您还可以使用注释传递自己的负载均衡器客户端配置,传递负载均衡器客户端的名称和配置类,如下所示:@LoadBalancerClientSpring中文文档

@Configuration
@LoadBalancerClient(value = "stores", configuration = CustomLoadBalancerConfiguration.class)
public class MyConfiguration {

	@Bean
	@LoadBalanced
	public WebClient.Builder loadBalancedWebClientBuilder() {
		return WebClient.builder();
	}
}
为了更轻松地处理您自己的 LoadBalancer 配置,我们在类中添加了一个方法。builder()ServiceInstanceListSupplier
您还可以使用我们的替代预定义配置来代替默认配置,方法是将属性值设置为用于缓存或用于缓存。spring.cloud.loadbalancer.configurationszone-preferenceZonePreferenceServiceInstanceListSupplierhealth-checkHealthCheckServiceInstanceListSupplier

您可以使用此功能实例化 or 的不同实现,这些实现由您编写,或由我们作为替代实现(例如)提供,以覆盖默认设置。ServiceInstanceListSupplierReactorLoadBalancerZonePreferenceServiceInstanceListSupplierSpring中文文档

您可以在此处查看自定义配置的示例。Spring中文文档

注解参数(在上面的示例中)指定了我们应使用给定自定义配置将请求发送到的服务的服务 ID。valuestores

您还可以通过注释传递多个配置(对于多个负载均衡器客户端),如以下示例所示:@LoadBalancerClientsSpring中文文档

@Configuration
@LoadBalancerClients({@LoadBalancerClient(value = "stores", configuration = StoresLoadBalancerClientConfiguration.class), @LoadBalancerClient(value = "customers", configuration = CustomersLoadBalancerClientConfiguration.class)})
public class MyConfiguration {

	@Bean
	@LoadBalanced
	public WebClient.Builder loadBalancedWebClientBuilder() {
		return WebClient.builder();
	}
}
作为类或配置参数传递的类不应使用组件扫描范围进行批注,也不应超出组件扫描范围。@LoadBalancerClient@LoadBalancerClients@Configuration
创建自己的配置时,如果使用 或,请确保使用其中之一,而不是同时使用两者,并确保将其直接放在通过网络检索实例的供应商之后的层次结构中,例如,在任何其他筛选供应商之前。CachingServiceInstanceListSupplierHealthCheckServiceInstanceListSupplierDiscoveryClientServiceInstanceListSupplier
为了更轻松地处理您自己的 LoadBalancer 配置,我们在类中添加了一个方法。builder()ServiceInstanceListSupplier
您还可以使用我们的替代预定义配置来代替默认配置,方法是将属性值设置为用于缓存或用于缓存。spring.cloud.loadbalancer.configurationszone-preferenceZonePreferenceServiceInstanceListSupplierhealth-checkHealthCheckServiceInstanceListSupplier
注解参数(在上面的示例中)指定了我们应使用给定自定义配置将请求发送到的服务的服务 ID。valuestores
作为类或配置参数传递的类不应使用组件扫描范围进行批注,也不应超出组件扫描范围。@LoadBalancerClient@LoadBalancerClients@Configuration
创建自己的配置时,如果使用 或,请确保使用其中之一,而不是同时使用两者,并确保将其直接放在通过网络检索实例的供应商之后的层次结构中,例如,在任何其他筛选供应商之前。CachingServiceInstanceListSupplierHealthCheckServiceInstanceListSupplierDiscoveryClientServiceInstanceListSupplier

Spring Cloud LoadBalancer 生命周期

使用 Custom LoadBalancer 配置注册的一种 Bean 类型可能很有用。LoadBalancerLifecycleSpring中文文档

Bean 提供名为 和 的回调方法,您应该实现这些方法,以指定在负载平衡之前和之后应执行哪些操作。LoadBalancerLifecycleonStart(Request<RC> request)onStartRequest(Request<RC> request, Response<T> lbResponse)onComplete(CompletionContext<RES, T, RC> completionContext)Spring中文文档

onStart(Request<RC> request)将对象作为参数。它包含用于选择适当实例的数据,包括下游客户端请求和提示。 还将对象和对象作为参数。另一方面,为方法提供对象。它包含 LoadBalancer ,包括选定的服务实例、针对该服务实例执行的请求和(如果可用)返回到下游客户端的响应,以及(如果发生异常)相应的 .RequestonStartRequestRequestResponse<T>CompletionContextonComplete(CompletionContext<RES, T, RC> completionContext)ResponseStatusThrowableSpring中文文档

该方法可用于确定相关处理器是否处理所提供类型的对象。如果未被用户覆盖,则返回 。supports(Class requestContextClass, Class responseClass, Class serverTypeClass)trueSpring中文文档

在前面的方法调用中,表示类型,表示客户端响应类型,表示返回的服务器类型。RCRequestContextREST
在前面的方法调用中,表示类型,表示客户端响应类型,表示返回的服务器类型。RCRequestContextREST

Spring Cloud LoadBalancer统计信息

我们提供了一个名为 的 bean,它使用 Micrometer 为负载均衡调用提供统计信息。LoadBalancerLifecycleMicrometerStatsLoadBalancerLifecycleSpring中文文档

为了将此 Bean 添加到应用程序上下文中, 将 的值设置为 to 并具有可用(例如,通过将 Spring Boot Actuator 添加到您的项目中)。spring.cloud.loadbalancer.stats.micrometer.enabledtrueMeterRegistrySpring中文文档

MicrometerStatsLoadBalancerLifecycle在以下位置注册以下仪表:MeterRegistrySpring中文文档

  • loadbalancer.requests.active:允许您监控任何服务实例的当前活动请求数(通过标记提供的服务实例数据)的仪表;Spring中文文档

  • loadbalancer.requests.success:一个计时器,用于测量任何负载均衡请求的执行时间,这些请求最终将响应传递到底层客户端;Spring中文文档

  • loadbalancer.requests.failed:一个计时器,用于测量以异常结束的任何负载均衡请求的执行时间;Spring中文文档

  • loadbalancer.requests.discard:一个计数器,用于测量丢弃的负载均衡请求数,即 LoadBalancer 尚未检索到要运行请求的服务实例的请求。Spring中文文档

有关服务实例、请求数据和响应数据的其他信息将通过标签添加到指标中(只要可用)。Spring中文文档

对于某些实现,例如 ,请求和响应数据可能不可用,因为我们从参数中建立泛型类型,可能无法确定类型并读取数据。BlockingLoadBalancerClient
当为给定计量添加至少一条记录时,计量将在注册表中注册。
您可以通过添加 MeterFilters 来进一步配置这些指标的行为(例如,添加发布百分位数和直方图)。
对于某些实现,例如 ,请求和响应数据可能不可用,因为我们从参数中建立泛型类型,可能无法确定类型并读取数据。BlockingLoadBalancerClient
当为给定计量添加至少一条记录时,计量将在注册表中注册。
您可以通过添加 MeterFilters 来进一步配置这些指标的行为(例如,添加发布百分位数和直方图)。

配置单个 LoadBalancerClient

可以使用不同的前缀单独配置单个 Loadbalancer 客户端,其中 clientId 是负载均衡器的名称。默认配置值可以在spring.cloud.loadbalancer中设置。命名空间,并将与客户端特定值优先合并spring.cloud.loadbalancer.clients.<clientId>.Spring中文文档

application.yml
spring:
  cloud:
    loadbalancer:
      health-check:
        initial-delay: 1s
      clients:
        myclient:
          health-check:
            interval: 30s

上面的示例将导致一个带有 和 的合并运行状况检查对象。@ConfigurationPropertiesinitial-delay=1sinterval=30sSpring中文文档

每个客户端的配置属性适用于大多数属性,但以下全局属性除外:Spring中文文档

  • spring.cloud.loadbalancer.enabled- 全局启用或禁用负载均衡Spring中文文档

  • spring.cloud.loadbalancer.retry.enabled- 全局启用或禁用负载均衡重试。如果全局启用它,您仍然可以使用 -prefixed 属性禁用特定客户端的重试,但不能反之亦然clientSpring中文文档

  • spring.cloud.loadbalancer.cache.enabled- 全局启用或禁用 LoadBalancer 缓存。如果全局启用它,您仍然可以通过创建不包含在委托层次结构中的自定义配置来禁用特定客户端的缓存,但反之则不然。CachingServiceInstanceListSupplierServiceInstanceListSupplierSpring中文文档

  • spring.cloud.loadbalancer.stats.micrometer.enabled- 全局启用或禁用 LoadBalancer 千分尺指标Spring中文文档

对于已使用映射的属性,您可以在不使用关键字的情况下为每个客户端指定不同的值(例如,,),我们保留了该行为,以保持库向后兼容。它将在下一个主要版本中进行修改。clientshintshealth-check.path
从 开始,我们在 中引入了标志。如果此标志设置为 ,则将实现方法以调用尚未实现该方法的可分配类,但不包括 和 ,在供应商通过网络执行实例检索之后,在完成任何基于请求的筛选之前,应将其直接放置在实例供应商层次结构中。默认情况下,它设置为。4.1.0callGetWithRequestOnDelegatesLoadBalancerPropertiestrueServiceInstanceListSupplier#get(Request request)delegate.get(request)DelegatingServiceInstanceListSupplierCachingServiceInstanceListSupplierHealthCheckServiceInstanceListSuppliertrue

[[-aot-and-native-image-support]] == AOT 和原生图像支持Spring中文文档

自 ,Spring Cloud LoadBalancer 支持 Spring AOT 转换和原生镜像。但是,若要使用此功能,需要显式定义服务 ID。为此,可以使用批注的 or 属性或作为属性的值。4.0.0LoadBalancerClientvaluename@LoadBalancerClientspring.cloud.loadbalancer.eager-load.clientsSpring中文文档

对于已使用映射的属性,您可以在不使用关键字的情况下为每个客户端指定不同的值(例如,,),我们保留了该行为,以保持库向后兼容。它将在下一个主要版本中进行修改。clientshintshealth-check.path
从 开始,我们在 中引入了标志。如果此标志设置为 ,则将实现方法以调用尚未实现该方法的可分配类,但不包括 和 ,在供应商通过网络执行实例检索之后,在完成任何基于请求的筛选之前,应将其直接放置在实例供应商层次结构中。默认情况下,它设置为。4.1.0callGetWithRequestOnDelegatesLoadBalancerPropertiestrueServiceInstanceListSupplier#get(Request request)delegate.get(request)DelegatingServiceInstanceListSupplierCachingServiceInstanceListSupplierHealthCheckServiceInstanceListSuppliertrue