|
|
@ -15,7 +15,7 @@ |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
package org.springframework.cloud.loadbalancer.annotation; |
|
|
|
package org.springframework.cloud.loadbalancer.annotation; |
|
|
|
|
|
|
|
// comment-by-kai 源码阅读 spring cloud 2021.x
|
|
|
|
import reactor.util.retry.RetrySpec; |
|
|
|
import reactor.util.retry.RetrySpec; |
|
|
|
|
|
|
|
|
|
|
|
import org.springframework.boot.autoconfigure.AutoConfigureAfter; |
|
|
|
import org.springframework.boot.autoconfigure.AutoConfigureAfter; |
|
|
@ -63,20 +63,28 @@ public class LoadBalancerClientConfiguration { |
|
|
|
|
|
|
|
|
|
|
|
private static final int REACTIVE_SERVICE_INSTANCE_SUPPLIER_ORDER = 193827465; |
|
|
|
private static final int REACTIVE_SERVICE_INSTANCE_SUPPLIER_ORDER = 193827465; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 首先,在前文可以看到在 LoadBalancerAutoConfiguration 配置中,配置了 LoadBalancerClientFactory ,其实例 bean 存在于父容器中,
|
|
|
|
|
|
|
|
// 而当前配置类 LoadBalancerClientConfiguration 通过构造函数会当成默认配置类注册到 NamedContextFactory 的子容器中,每个子容器都拥有。
|
|
|
|
|
|
|
|
// 只有明白了这一点,才能够理解容器的隔离。
|
|
|
|
@Bean |
|
|
|
@Bean |
|
|
|
@ConditionalOnMissingBean |
|
|
|
@ConditionalOnMissingBean // ConditionalOnMissingBean 说明可以自己实现这个bean,来覆盖默认的配置。
|
|
|
|
public ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(Environment environment, |
|
|
|
public ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(Environment environment, |
|
|
|
LoadBalancerClientFactory loadBalancerClientFactory) { |
|
|
|
LoadBalancerClientFactory loadBalancerClientFactory) { |
|
|
|
|
|
|
|
// name表示服务名称,比如stock-service
|
|
|
|
|
|
|
|
// LoadBalancerClientFactory bean的配置:参考代码 LoadBalancerAutoConfiguration
|
|
|
|
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); |
|
|
|
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); |
|
|
|
return new RoundRobinLoadBalancer( |
|
|
|
return new RoundRobinLoadBalancer( |
|
|
|
loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name); |
|
|
|
loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ============================= Reactive Retry ============================= //
|
|
|
|
|
|
|
|
|
|
|
|
@Configuration(proxyBeanMethods = false) |
|
|
|
@Configuration(proxyBeanMethods = false) |
|
|
|
@ConditionalOnReactiveDiscoveryEnabled |
|
|
|
@ConditionalOnReactiveDiscoveryEnabled |
|
|
|
@Order(REACTIVE_SERVICE_INSTANCE_SUPPLIER_ORDER) |
|
|
|
@Order(REACTIVE_SERVICE_INSTANCE_SUPPLIER_ORDER) |
|
|
|
public static class ReactiveSupportConfiguration { |
|
|
|
public static class ReactiveSupportConfiguration { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ReactiveDiscoveryClient + DefaultConfigurationCondition
|
|
|
|
@Bean |
|
|
|
@Bean |
|
|
|
@ConditionalOnBean(ReactiveDiscoveryClient.class) |
|
|
|
@ConditionalOnBean(ReactiveDiscoveryClient.class) |
|
|
|
@ConditionalOnMissingBean |
|
|
|
@ConditionalOnMissingBean |
|
|
@ -86,6 +94,7 @@ public class LoadBalancerClientConfiguration { |
|
|
|
return ServiceInstanceListSupplier.builder().withDiscoveryClient().withCaching().build(context); |
|
|
|
return ServiceInstanceListSupplier.builder().withDiscoveryClient().withCaching().build(context); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ReactiveDiscoveryClient + ZonePreferenceConfigurationCondition
|
|
|
|
@Bean |
|
|
|
@Bean |
|
|
|
@ConditionalOnBean(ReactiveDiscoveryClient.class) |
|
|
|
@ConditionalOnBean(ReactiveDiscoveryClient.class) |
|
|
|
@ConditionalOnMissingBean |
|
|
|
@ConditionalOnMissingBean |
|
|
@ -134,11 +143,17 @@ public class LoadBalancerClientConfiguration { |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ============================= Blocking Retry ============================= //
|
|
|
|
|
|
|
|
|
|
|
|
@Configuration(proxyBeanMethods = false) |
|
|
|
@Configuration(proxyBeanMethods = false) |
|
|
|
@ConditionalOnBlockingDiscoveryEnabled |
|
|
|
@ConditionalOnBlockingDiscoveryEnabled |
|
|
|
@Order(REACTIVE_SERVICE_INSTANCE_SUPPLIER_ORDER + 1) |
|
|
|
@Order(REACTIVE_SERVICE_INSTANCE_SUPPLIER_ORDER + 1) |
|
|
|
public static class BlockingSupportConfiguration { |
|
|
|
public static class BlockingSupportConfiguration { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 真正获取 ServiceInstance 列表的 由 ServiceInstanceListSupplier 提供,
|
|
|
|
|
|
|
|
// 这里可以看到可以由 DiscoveryClient 提供。这样就已经跟注册中心客户端联系上了。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// DiscoveryClient + DefaultConfigurationCondition
|
|
|
|
@Bean |
|
|
|
@Bean |
|
|
|
@ConditionalOnBean(DiscoveryClient.class) |
|
|
|
@ConditionalOnBean(DiscoveryClient.class) |
|
|
|
@ConditionalOnMissingBean |
|
|
|
@ConditionalOnMissingBean |
|
|
@ -148,6 +163,7 @@ public class LoadBalancerClientConfiguration { |
|
|
|
return ServiceInstanceListSupplier.builder().withBlockingDiscoveryClient().withCaching().build(context); |
|
|
|
return ServiceInstanceListSupplier.builder().withBlockingDiscoveryClient().withCaching().build(context); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// DiscoveryClient + ZonePreferenceConfigurationCondition
|
|
|
|
@Bean |
|
|
|
@Bean |
|
|
|
@ConditionalOnBean(DiscoveryClient.class) |
|
|
|
@ConditionalOnBean(DiscoveryClient.class) |
|
|
|
@ConditionalOnMissingBean |
|
|
|
@ConditionalOnMissingBean |
|
|
@ -190,6 +206,8 @@ public class LoadBalancerClientConfiguration { |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ============================= Blocking Retry ============================= //
|
|
|
|
|
|
|
|
|
|
|
|
@Configuration(proxyBeanMethods = false) |
|
|
|
@Configuration(proxyBeanMethods = false) |
|
|
|
@ConditionalOnBlockingDiscoveryEnabled |
|
|
|
@ConditionalOnBlockingDiscoveryEnabled |
|
|
|
@ConditionalOnClass(RetryTemplate.class) |
|
|
|
@ConditionalOnClass(RetryTemplate.class) |
|
|
@ -208,6 +226,8 @@ public class LoadBalancerClientConfiguration { |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ============================= Reactive Retry ============================= //
|
|
|
|
|
|
|
|
|
|
|
|
@Configuration(proxyBeanMethods = false) |
|
|
|
@Configuration(proxyBeanMethods = false) |
|
|
|
@ConditionalOnReactiveDiscoveryEnabled |
|
|
|
@ConditionalOnReactiveDiscoveryEnabled |
|
|
|
@Conditional(ReactiveOnAvoidPreviousInstanceAndRetryEnabledCondition.class) |
|
|
|
@Conditional(ReactiveOnAvoidPreviousInstanceAndRetryEnabledCondition.class) |
|
|
@ -226,6 +246,7 @@ public class LoadBalancerClientConfiguration { |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ============================= 条件类 ============================= //
|
|
|
|
static final class BlockingOnAvoidPreviousInstanceAndRetryEnabledCondition extends AllNestedConditions { |
|
|
|
static final class BlockingOnAvoidPreviousInstanceAndRetryEnabledCondition extends AllNestedConditions { |
|
|
|
|
|
|
|
|
|
|
|
private BlockingOnAvoidPreviousInstanceAndRetryEnabledCondition() { |
|
|
|
private BlockingOnAvoidPreviousInstanceAndRetryEnabledCondition() { |
|
|
|