Spring Cloud 负载均衡器
Spring Cloud 提供自己的客户端负载均衡器抽象和实现。用于负载均衡
机制ReactiveLoadBalancer新增了界面,并支持基于轮询和随机的实现
已经为此提供了保障。为了让实例从响应式中选择ServiceInstanceListSupplier被使用。目前我们支持基于服务发现的实现ServiceInstanceListSupplier该程序通过类路径中的发现客户端从服务发现中获取可用实例。
可以通过设置 的值来禁用 Spring Cloud LoadBalancerspring.cloud.loadbalancer.enabled自false. |
负载均衡器上下文的急加载
Spring Cloud LoadBalancer 为每个服务 ID 创建独立的 Spring 子上下文。默认情况下,这些上下文初始化为懒惰,当首次请求服务ID时需要负载均衡。
你可以选择随时加载这些上下文。为此,请指定你想要执行急加载的服务ID,使用以下条件Spring.cloud.loadbalancer.eager-load.clients属性,例如:
spring.cloud-loadbalancer.eager-load.clients[0]=my-first-client
spring.cloud-loadbalancer.eager-load.clients[1]=my-second-client
负载均衡算法之间的切换
这ReactiveLoadBalancer默认使用的实现是轮回负载均衡器.要切换到不同的实现,无论是针对选定服务还是全部,您可以使用自定义的负载均衡器配置机制。
例如,以下配置可通过@LoadBalancerClient注释以切换到使用随机负载均衡器:
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或者在组件扫描范围之外。 |
Spring Cloud LoadBalancer 集成
为了简化使用 Spring Cloud LoadBalancer,我们提供了反应堆负载均衡器交换过滤器函数(可用作Web客户端)BlockingLoadBalancerClient(该方法适用于Rest模板和Rest客户端).
您可以在以下章节中查看更多信息和使用示例:
Spring Cloud 负载均衡器缓存
除了基础ServiceInstanceListSupplier实现通过以下方式检索实例发现客户端每次需要选择实例时,我们会提供两种缓存实现。
咖啡因支持的负载均衡器缓存实现
如果你有com.github.ben-manes.caffeine:caffeine在类路径中,将采用基于咖啡因的实现。
有关如何配置,请参见 LoadBalancerCacheConfiguration 部分。
通过你自己的咖啡因规范会覆盖所有其他 LoadBalancerCache 设置,包括通用 LoadBalancer 缓存配置字段,例如TTL和能力. |
默认负载均衡器缓存实现
如果你在 classpath 里没有咖啡因,那默认负载均衡缓存,自动包含Spring-Cloud-starter-loadbalancer,将被使用。
有关如何配置,请参见 LoadBalancerCacheConfiguration 部分。
要用咖啡因代替默认缓存,可以添加com.github.ben-manes.caffeine:caffeine依赖于 classpath。 |
负载均衡器缓存配置
你可以自己设定TTL值(写入后条目应过期的时间),表示为期间,通过传递一个字符串符合Spring靴字符串自期间转换器语法.
作为Spring.cloud.loadbalancer.cache.ttl财产。
你也可以通过设置Spring.cloud.loadbalancer.cache.capacity财产。
默认设置包括TTL设置为35秒,默认初始容量是256.
你也可以完全禁用负载均衡器缓存,方法是设置spring.cloud.loadbalancer.cache.enabled自false.
虽然基础的非缓存实现对原型设计和测试很有用,但效率远低于缓存版本,因此我们建议在生产环境中始终使用缓存版本。如果缓存已经由发现客户端例如实现尤里卡发现客户端,应禁用负载均衡缓存以防止双重缓存。 |
当你创建自己的配置时,如果你使用CachingServiceInstanceListSupplier确保将其置于层级结构中,直接位于通过网络检索实例的提供商之后,例如,DiscoveryClientServiceInstanceListSupplier,排在其他过滤提供商之前。 |
加权负载均衡
为了实现加权负载均衡,我们提供了WeightedServiceInstanceListSupplier.我们使用权重函数计算每个实例的权重。
默认情况下,我们尝试从元数据映射中读取并解析权重(密钥为重量).
如果元数据映射中未指定权重,我们默认该实例的权重为1。
你可以通过设置 的值来配置Spring.cloud.loadbalancer.configurations自加权或者你自己提供ServiceInstanceListSupplier比如说,Bean:
public class CustomLoadBalancerConfiguration {
@Bean
public ServiceInstanceListSupplier discoveryClientServiceInstanceListSupplier(
ConfigurableApplicationContext context) {
return ServiceInstanceListSupplier.builder()
.withDiscoveryClient()
.withWeighted()
.withCaching()
.build(context);
}
}
你也可以自定义权重计算逻辑,提供以下条件权重函数. |
你可以用这个样本配置让所有实例都有一个随机权重:
public class CustomLoadBalancerConfiguration {
@Bean
public ServiceInstanceListSupplier discoveryClientServiceInstanceListSupplier(
ConfigurableApplicationContext context) {
return ServiceInstanceListSupplier.builder()
.withDiscoveryClient()
.withWeighted(instance -> ThreadLocalRandom.current().nextInt(1, 101))
.withCaching()
.build(context);
}
}
基于区域的负载均衡
为了实现基于区域的负载均衡,我们提供了ZonePreferenceServiceInstanceListSupplier.
我们使用发现客户端-特定区配置(例如,Eureka.instance.metadata-map.zone)选择客户端尝试过滤可用服务实例的区域。
你也可以覆盖发现客户端- 通过设置 的值来设置特定分区Spring.cloud.loadbalancer.zone财产。 |
目前,只有Eureka Discovery客户端被设置了设置负载均衡器区域的仪器。对于其他发现客户端,设置Spring.cloud.loadbalancer.zone财产。更多乐器演奏即将发布。 |
确定取回的区域ServiceInstance,我们检查“区域”其元数据映射中的关键节点。 |
这ZonePreferenceServiceInstanceListSupplier过滤检索到的实例,只返回同一区域内的实例。
如果区是零或者同一区域内没有实例,它会返回所有检索到的实例。
为了使用基于区域的负载均衡方法,你需要实例化一个ZonePreferenceServiceInstanceListSupplier豆子的自定义配置。
我们会用代表来合作ServiceInstanceListSupplier豆。 我们建议使用DiscoveryClientServiceInstanceListSupplier委托,用CachingServiceInstanceListSupplier利用LoadBalancer缓存机制,然后将生成的豆子传递到的构造器中ZonePreferenceServiceInstanceListSupplier.
你可以用这个示例配置来设置:
public class CustomLoadBalancerConfiguration {
@Bean
public ServiceInstanceListSupplier discoveryClientServiceInstanceListSupplier(
ConfigurableApplicationContext context) {
return ServiceInstanceListSupplier.builder()
.withDiscoveryClient()
.withCaching()
.withZonePreference()
.build(context);
}
}
负载均衡器的实例健康检查
可以为负载均衡器启用定时健康检查。这HealthCheckServiceInstanceListSupplier为此提供了保障。它定期核实代表提供的实例ServiceInstanceListSupplier仍然活着,只回归健康的个体,
除非没有实例,否则它会返回所有检索到的实例。
这种机制在使用SimpleDiscovery客户端.对于
如果客户端有实际的服务注册表支持,这并不是必须使用的,正如我们已经得到的
查询外部服务发现后,健康实例。 |
| 该提供商也推荐用于每项服务实例数量较少的配置 以避免在失败实例上重试调用。 |
| 如果使用任何服务发现支持的提供商,通常不需要添加这种健康检查机制,因为我们直接获取实例的健康状态 来自服务登记处。 |
这HealthCheckServiceInstanceListSupplier依赖于由代理流动提供更新的实例。在极少数情况下,你想使用一个不会刷新实例的代理,尽管实例列表可能会变化(例如DiscoveryClientServiceInstanceListSupplier由我们提供),你可以设置Spring.cloud.loadbalancer.health-check.refetch-instances自true以便通过HealthCheckServiceInstanceListSupplier.你还可以通过修改 的值来调整折射区间Spring.cloud.loadbalancer.health-check.refetch-instances-interval并选择通过设置禁用额外的健康检查重复spring.cloud.loadbalancer.health-check.repeat-health-check自false因为每个实例都会重新获取
还会触发健康检查。 |
HealthCheckServiceInstanceListSupplier使用以 为前缀的属性spring.cloud.loadbalancer.health-check.你可以设置初始延迟和间隔对于调度员来说。你可以通过设置设置健康检查URL的默认路径
该Spring.cloud.loadbalancer.health-check.path.default财产。你还可以为任何给定服务设置具体值,比如Spring.cloud.loadbalancer.health-check.path.[SERVICE_ID]性质,代入[SERVICE_ID]并且要提供你服务的正确身份证。如果[SERVICE_ID]未具体说明,/执行器/健康默认使用。如果[SERVICE_ID]设置为零或为空值,则健康检查不会执行。你也可以通过设置 的值来设置健康检查请求的自定义端口spring.cloud.loadbalancer.health-check.port.如果没有设置,则请求服务所用的端口在服务实例中可用。
如果你依赖默认路径(/执行器/健康),确保你补充Spring-启动-执行器除非你打算自己添加这样的端点,否则就要加入你的协作者的依赖。 |
默认情况下,健康检查流将对每个活体释放ServiceInstance那条信息已经被取回了。你可以通过设置 的值来修改这种行为Spring.cloud.loadbalancer.health-check.update-results-list自false.如果该性质被设置为false,整个存活实例序列先被收集成列表,然后才发出,确保通量不会在属性中设置的健康检查间隔之间发出值。 |
为了使用健康检查调度器方法,你需要实例化一个HealthCheckServiceInstanceListSupplier豆子的自定义配置。
我们会用代表来合作ServiceInstanceListSupplier豆。
我们建议通过DiscoveryClientServiceInstanceListSupplier在构造子中的代理HealthCheckServiceInstanceListSupplier.
你可以用这个示例配置来设置:
public class CustomLoadBalancerConfiguration {
@Bean
public ServiceInstanceListSupplier discoveryClientServiceInstanceListSupplier(
ConfigurableApplicationContext context) {
return ServiceInstanceListSupplier.builder()
.withDiscoveryClient()
.withHealthChecks()
.build(context);
}
}
对于非响应式栈,创建该提供商,包含withBlockingHealthChecks().
你也可以通过自己的考试Web客户端,Rest模板或Rest客户端实例用于检验。 |
HealthCheckServiceInstanceListSupplier拥有基于反应堆通量的缓存机制重播().因此,如果正在使用,你可能想跳过包裹提供商的过程。CachingServiceInstanceListSupplier. |
当你创建自己的配置时,HealthCheckServiceInstanceListSupplier确保将其置于层级结构中,紧接着通过网络检索实例的提供商,例如,DiscoveryClientServiceInstanceListSupplier,排在其他过滤提供商之前。 |
负载均衡器的实例偏好相同
你可以设置负载均衡器,使其优先选择之前选择的实例(如果该实例可用)。
为此,你需要使用SameInstancePreferenceServiceInstanceListSupplier.你可以通过设置 的值来配置Spring.cloud.loadbalancer.configurations自同实例偏好或者你自己提供ServiceInstanceListSupplier豆子——例如:
public class CustomLoadBalancerConfiguration {
@Bean
public ServiceInstanceListSupplier discoveryClientServiceInstanceListSupplier(
ConfigurableApplicationContext context) {
return ServiceInstanceListSupplier.builder()
.withDiscoveryClient()
.withSameInstancePreference()
.build(context);
}
}
这也是Zookeeper的替代品粘性规则. |
基于请求的负载均衡器粘性会话
你可以设置负载均衡器,使其优先选择实例ID通过请求cookie提供。如果请求通过以下任一途径传递给负载均衡器,我们目前支持此功能ClientRequestContext或ServerHttpRequestContext这些内容用于SC负载均衡器交换滤波函数和Filter。
为此,你需要使用RequestBasedStickySessionServiceInstanceListSupplier.你可以通过设置 的值来配置Spring.cloud.loadbalancer.configurations自基于请求的粘贴会话或者你自己提供ServiceInstanceListSupplier豆子——例如:
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-cookie自true.
默认情况下,cookie 的名称为sc-lb-实例-ID.你可以通过更改spring.cloud.loadbalancer.instance-id-cookie-name财产。
| 该功能目前支持Web客户端支持的负载均衡。 |
Spring Cloud 负载均衡器提示
Spring Cloud LoadBalancer 可以让你设置字符串传递给负载均衡器的提示请求对象,之后可以用于ReactiveLoadBalancer能够处理这些问题的实现。
你可以通过设置Spring.cloud.loadbalancer.hint.default财产。你也可以设定具体的数值
对于任意给定服务,通过设置Spring.cloud.loadbalancer.hint.[SERVICE_ID]性质,代入[SERVICE_ID]并且要提供你服务的正确身份证。如果提示不是用户设置的,默认值被使用。
基于提示的负载均衡
我们还提供HintBasedServiceInstanceListSupplier,即ServiceInstanceListSupplier基于提示的实例选择实现。
HintBasedServiceInstanceListSupplier检查提示请求头(默认头部名称为X-SC-LB-提示但你可以通过改变 的值来修改它Spring.cloud.loadbalancer.hint-header-name如果找到提示请求头,则使用头部传递的提示值来过滤服务实例。
如果没有添加提示头,HintBasedServiceInstanceListSupplier使用属性中的提示值来过滤服务实例。
如果没有提示,无论是头部还是属性,委托提供的所有服务实例都会被返回。
在筛选时,HintBasedServiceInstanceListSupplier查找在提示钥匙在他们的元数据地图.如果找不到匹配的实例,则返回代理提供的所有实例。
你可以使用以下示例配置来设置:
public class CustomLoadBalancerConfiguration {
@Bean
public ServiceInstanceListSupplier discoveryClientServiceInstanceListSupplier(
ConfigurableApplicationContext context) {
return ServiceInstanceListSupplier.builder()
.withDiscoveryClient()
.withCaching()
.withHints()
.build(context);
}
}
转换负载均衡的HTTP请求
你可以使用选定的ServiceInstance以转换负载均衡的HTTP请求。
为Rest模板和Rest客户端你需要实现并定义LoadBalancerRequestTransformer如下:
@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;
}
};
}
};
}
为Web客户端你需要实现并定义LoadBalancerClientRequestTransformer如下:
@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();
}
};
}
如果定义了多个转换器,则按定义豆子的顺序应用。
或者,你可以使用LoadBalancerRequestTransformer.DEFAULT_ORDER或LoadBalancerClientRequestTransformer.DEFAULT_ORDER以指定顺序。
Spring Cloud LoadBalancer 子集
SubsetServiceInstanceListSupplier实现确定性子集算法,用于选择有限数量的实例ServiceInstanceListSupplier代表层级。
你可以通过设置 的值来配置Spring.cloud.loadbalancer.configurations自子集或者你自己提供ServiceInstanceListSupplier豆子——例如:
public class CustomLoadBalancerConfiguration {
@Bean
public ServiceInstanceListSupplier discoveryClientServiceInstanceListSupplier(
ConfigurableApplicationContext context) {
return ServiceInstanceListSupplier.builder()
.withDiscoveryClient()
.withSubset()
.withCaching()
.build(context);
}
}
默认情况下,每个服务实例都被分配一个唯一实例ID,且不同实例ID值通常会选择不同的子集。通常,你不需要去关注它。不过,如果你需要让多个实例选择同一个子集,你可以用Spring.cloud.loadbalancer.subset.instance-id(支持占位符)。 |
默认情况下,子集的大小设置为100。你也可以用spring.cloud.loadbalancer.subset.size. |
基于版本的API负载均衡
为了实现基于版本的API负载均衡,我们提供了BlockingApiVersionServiceInstanceListSupplier和ReactiveApiVersionServiceInstanceListSupplier,根据你的客户是否使用 Spring 可以使用Rest客户端或Web客户端.
你可以通过设置来启用 API 版本管理Spring.cloud.loadbalancer.configurations自API版本或者通过提供ServiceInstanceListSupplier为所有或特定负载均衡器配置的 API 版本管理 bean服务IDs:
public class CustomLoadBalancerConfiguration {
@Bean
public ServiceInstanceListSupplier discoveryClientServiceInstanceListSupplier(
ConfigurableApplicationContext context) {
return ServiceInstanceListSupplier.builder()
.withDiscoveryClient()
.withCaching()
// Use withBlockingApiVersioning() for blocking clients
.withReactiveApiVersioning()
.build(context);
}
}
在底层,我们使用 Spring Framework 的阻断和反应式 API 版本控制支持。请参阅 Framework 文档,了解版本如何根据请求元素进行解析、比较和匹配。LoadBalancer API 版本管理策略与默认策略的一个不同点是,我们不进行版本验证,而是允许用户传递任意想要的版本。
要使用此功能,你需要指定需要用来获取版本的请求元素LoadBalancerProperties.ApiVersion. 使用spring.cloud.load-balancer.clients.<serviceId>.api-version属性前缀,你可以指定页眉,queryParameter,pathSegment或mediaTypeParameters(媒体类型参数)用于传递请求中的目标版本。你也可以设置默认版本(当请求中没有传递任何版本时使用)以及传递API版本是否为必填.
一旦启用了 API 版本控制功能,并通过任一请求元素提供了版本,通过默认版本我们会寻找与匹配的服务实例API_VERSION设定在他们的元数据地图。
如果找不到与匹配版本的服务实例,则会返回一个空实例列表。您可以通过设置来修改此行为spring.cloud.load-balancer.clients.<serviceId>.api-version.fallbackToAvailableInstances自true如果找不到符合API版本的实例,将触发返回所有可用实例。
我们会用代表来合作ServiceInstanceListSupplier豆。 我们建议使用DiscoveryClientServiceInstanceListSupplier委托,用CachingServiceInstanceListSupplier利用LoadBalancer缓存机制,然后将生成的豆子传递到的构造器中ReactiveApiVersionServiceInstanceListSupplier或BlockingApiVersionServiceInstanceListSupplier. |
默认情况下,我们使用org.springframework.web.accept.SemanticApiVersionParser用于版本解析。你可以自己提供ApiVersionParser在上下文中用豆子来覆盖它。 |
Spring Cloud LoadBalancer Starters
我们还提供了一个入门工具,让你可以轻松地在 Spring Boot 应用中添加 Spring Cloud LoadBalancer。使用时只需添加org.springframework.cloud:spring-cloud-starter-loadbalancer在你的构建文件中,对Spring Cloud的依赖。
| Spring Cloud LoadBalancer 入门软件包括 Spring Boot 缓存和 Evictor。 |
传递您自己的 Spring Cloud 负载均衡器配置
你也可以使用@LoadBalancerClient注释以传递你自己的负载均衡客户端配置,传递负载均衡客户端的名称和配置类,具体如下:
@Configuration
@LoadBalancerClient(value = "stores", configuration = CustomLoadBalancerConfiguration.class)
public class MyConfiguration {
@Bean
@LoadBalanced
public WebClient.Builder loadBalancedWebClientBuilder() {
return WebClient.builder();
}
}
为了让你更容易地进行自己的负载均衡器配置,我们添加了一个架构商()方法对ServiceInstanceListSupplier类。 |
你也可以用我们预定义的替代配置来替代默认配置,方法是设置Spring.cloud.loadbalancer.configurations属性到区域偏好使用ZonePreferenceServiceInstanceListSupplier带缓存或健康检查使用HealthCheckServiceInstanceListSupplier用缓存。 |
你可以利用这个功能实例化不同的实现ServiceInstanceListSupplier或反应堆负载均衡器,要么由您编写,要么由我们作为替代方案提供(例如)ZonePreferenceServiceInstanceListSupplier)来覆盖默认设置。
你可以在这里看到一个自定义配置的示例。
注释值参数(商店在上述示例中,指定了我们应向该服务发送请求的服务ID,并以给定的自定义配置。 |
你也可以通过@LoadBalancerClients注释,如下示例所示:
@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或者在组件扫描范围之外。 |
当你创建自己的配置时,如果你使用CachingServiceInstanceListSupplier或HealthCheckServiceInstanceListSupplier确保使用其中一个,而不是两个,并且确保将其置于层级结构中,紧接着通过网络获取实例的提供商,例如,DiscoveryClientServiceInstanceListSupplier,排在其他过滤提供商之前。 |
Spring Cloud 负载均衡器生命周期
一种可能有用的豆子类型,可以通过自定义负载均衡器配置注册,是负载均衡器生命周期.
这负载均衡器生命周期BEANS 提供回调方法,名为onStart(请求<RC>请求),onStartRequest(请求<RC>请求,回复<T>lbResponse)和onComplete(CompletionContext<RES, T, RCs>CompletionContext)你应该实现这些,来指定负载均衡前后应执行哪些动作。
onStart(请求<RC>请求)需要一个请求对象作为参数。它包含用于选择适当实例的数据,包括下游客户端请求和提示。onStartRequest也取请求目标,此外,还有回复:T<>对象作为参数。另一方面,一个完备上下文对象被提供给onComplete(CompletionContext<RES, T, RCs>CompletionContext)方法。它包含负载均衡器响应,包括所选服务实例,地位对该服务实例执行的请求,且(如果有)响应返回给下游客户端,以及(如果发生异常)相应的响应可投掷.
这supports(类请求ContextClass, 类响应类,
类 serverTypeClass)可以用该方法判断该处理器是否处理给定类型的对象。如果用户未覆盖,则返回true.
在上述方法调用中,钢筋混凝土方法请求上下文类型RES表示客户端响应类型,且T表示返回服务器类型。 |
Spring Cloud 负载均衡器统计
我们提供负载均衡器生命周期豆子打电话微米统计负载均衡器生命周期该系统使用Micrometer为负载均衡通话提供统计数据。
为了让这个豆子添加到你的应用上下文中,
设置 的值spring.cloud.loadbalancer.stats.micrometer.enabled自true并且有MeterRegistry可用(例如,通过在你的项目中添加Spring Boot执行器)。
微米统计负载均衡器生命周期在 中登记以下电表MeterRegistry:
-
负载均衡器.请求.active:一个允许你监控任何服务实例当前活跃请求数量的指标(通过标签获取的服务实例数据); -
loadbalancer.requests.success:计时器,用于测量任何负载均衡请求的执行时间,这些请求最终将响应传递给了底层客户端; -
loadbalancer.requests.failed:计时器,用于衡量任何以异常结束的负载均衡请求的执行时间; -
loadbalancer.requests.discard:一个计数器,用于衡量被丢弃的负载均衡请求数量,即负载均衡器尚未检索到用于运行请求的服务实例。
关于服务实例、请求数据和响应数据的额外信息会通过标签在可用时添加到度量中。
为Web客户端和Rest客户端-我们使用的是支持负载均衡uri模板对于乌里有空时标记。 |
可以禁用添加路径自乌里按设置标签spring.cloud.loadbalancer.stats.include-path自false. |
如同Rest模板-支持的负载均衡,我们无法访问uri模板,全程路径总是在乌里标记。为了避免高基数问题,如果路径是高基数值(例如,/orders/{id}哪里身份证需要大量值),强烈建议禁用添加路径乌里按设置标签spring.cloud.loadbalancer.stats.include-path自false. |
对于某些实现,例如BlockingLoadBalancerClient请求和响应数据可能不可用,因为我们通过参数建立泛型类型,无法确定类型并读取数据。 |
| 当某一电表至少新增一条记录时,这些电表会被登记在注册表中。 |
你还可以进一步配置这些指标的行为(例如,添加发布百分位和直方图)如下添加MeterFilters. |
配置单个负载均衡客户端
单个负载均衡器客户端可以单独配置,使用不同的前缀spring.cloud.loadbalancer.clients.<clientId>.哪里客户标识是负载均衡器的名称。默认配置值可在Spring.cloud.loadbalancer。命名空间 和 将合并,客户端特定值优先
spring:
cloud:
loadbalancer:
health-check:
initial-delay: 1s
clients:
myclient:
health-check:
interval: 30s
上述示例将导致合并的健康检查@ConfigurationProperties对象初始延迟=1秒和区间=30秒.
每个客户端的配置属性适用于大多数属性,除了以下全局属性:
-
spring.cloud.loadbalancer.enabled- 全局启用或禁用负载均衡 -
spring.cloud.loadbalancer.retry.enabled- 全局启用或禁用负载均衡重试。如果你全局启用,仍然可以通过客户端-前缀性质,但反过来则不然 -
spring.cloud.loadbalancer.cache.enabled- 全局启用或禁用负载均衡器缓存。如果你全局启用,仍然可以通过创建一个不包含CachingServiceInstanceListSupplier在ServiceInstanceListSupplier委托层级,但不是反过来。 -
spring.cloud.loadbalancer.stats.micrometer.enabled- 全局启用或禁用负载均衡器微米指标
对于已经使用映射的属性,你可以为每个客户端指定不同的值,而无需使用客户端关键词(例如,提示,health-check.path(健康检查.path)),我们保留了这种行为,以保持库向后兼容。它将在下一次重大版本中进行修改。 |
从这里开始4.1.0,我们引入了callGetWithRequestOnDelegates(呼叫GetWithRequestOnDelegates)旗帜负载均衡器属性.如果该标志设置为true,ServiceInstanceListSupplier#get(请求请求)方法将被实现为调用delegate.get(请求)在可从DelegatingServiceInstanceListSupplier那些还没有实现该方法的,但排除了CachingServiceInstanceListSupplier和HealthCheckServiceInstanceListSupplier,应在提供商通过网络进行实例检索后,直接放置在实例提供商层级中,之后才进行任何基于请求的过滤。它被设置为true默认。 |
AOT与原生图像支持
因为4.0.0Spring Cloud 负载均衡器支持 Spring AOT 变换和原生图像。然而,要使用此功能,您需要明确定义您的LoadBalancerClient服役身份证。你可以通过使用值或名称属性@LoadBalancerClient注释或作为Spring.cloud.loadbalancer.eager-load.clients财产。
LoadBalancer Integration for Spring HTTP Service Clients AutoConfiguration
因为5.0.0Spring Cloud 负载均衡器支持通过LoadBalancerRestClientHttpServiceGroupConfigurer和LoadBalancerWebClientHttpServiceGroupConfigurer.
对于每个 HTTP 服务客户端组,如果baseURL(定义在Spring.http.client.service.group。[groupName].base-url性质)是零一个服务ID基于负载均衡的 URL 设置为baseURL跟服务ID通过HTTP服务客户端解析团体名称.
如果baseURL是零或者其方案设为磅一个延迟负载均衡拦截器实例从应用上下文中选取用于阻断场景,且延迟负载均衡器交换过滤器函数用于反应性场景的实例,并被添加到该组的RestClient.Builder或WebClient.Builder如果有,允许请求进行负载均衡。
例如,在具有以下HTTP服务客户端配置的应用中:
@SpringBootApplication
@ImportHttpServices(group = "verificationClient", types = {VerificationService.class,
PersonService.class})
public class HttpVerificationClientApplication {
public static void main(String[] args) {
SpringApplication.run(HttpVerificationClientApplication.class, args);
}
}
如果spring.http.client.service.group.verificationClient.base-url属性未被设置,它会自动设置为验证客户端.
默认方案(http最初使用);然而,如果是安全的ServiceInstance通过负载均衡选择,将更改为https.
如果spring.http.client.service.group.verificationClient.base-url属性设置为一个具有磅scheme,(例如,lb://verificationClient/path),它将被用于http最初被设定为默认方案。
如果是安全的ServiceInstance通过负载均衡选择,方案将更改为https.
在这两种情况下,要么是延迟负载均衡拦截器或延迟负载均衡器交换过滤器函数将被添加到该组的客户端构建器中,从而实现请求的负载均衡。
如果spring.http.client.service.group.verificationClient.base-url属性设置为一个未将方案设置为 的 URL磅, (例如,lb://verificationClient/path),不应用负载均衡器集成。