Fix gh 629 new (#683)
* Swaps deprecated ConditionalOnEnabledEndpoint for updated annotation. Swaps with ConditionalOnAvailableEndpoint * Migrates to new OutputCaptureRule * Migrates to new OutputCaptureRule * Add health check loadBalancing implementation. * Make isAlive() method protected. Co-authored-by: Spencer Gibb <spencer@gibb.tech>
This commit is contained in:
committed by
GitHub
parent
744ad89177
commit
47a810606d
@@ -28,10 +28,13 @@
|
||||
|spring.cloud.inetutils.timeout-seconds | 1 | Timeout, in seconds, for calculating hostname.
|
||||
|spring.cloud.inetutils.use-only-site-local-interfaces | false | Whether to use only interfaces with site local addresses. See {@link InetAddress#isSiteLocalAddress()} for more details.
|
||||
|spring.cloud.loadbalancer.cache.caffeine.spec | | The spec to use to create caches. See CaffeineSpec for more details on the spec format.
|
||||
|spring.cloud.loadbalancer.cache.capacity | 256 | Initial cache capacity expressed as int.
|
||||
|spring.cloud.loadbalancer.cache.ttl | 30s | Time To Live - time counted from writing of the record, after which cache entries are expired, expressed as a {@link Duration}. The property {@link String} has to be in keeping with the appropriate syntax as specified in Spring Boot <code>StringToDurationConverter</code>. @see <a href= "https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/convert/StringToDurationConverter.java">StringToDurationConverter.java</a>
|
||||
|spring.cloud.loadbalancer.health-check.initial-delay | 0 | Initial delay value for the HealthCheck scheduler.
|
||||
|spring.cloud.loadbalancer.health-check.interval | 30s | Interval for rerunning the HealthCheck scheduler.
|
||||
|spring.cloud.loadbalancer.health-check.path | |
|
||||
|spring.cloud.loadbalancer.retry.enabled | true |
|
||||
|spring.cloud.loadbalancer.ribbon.enabled | true | Causes `RibbonLoadBalancerClient` to be used by default.
|
||||
|spring.cloud.loadbalancer.zone | | A {@link String} representation of the <code>zone</code> used for filtering instances by zoned load-balancing implementations.
|
||||
|spring.cloud.refresh.enabled | true | Enables autoconfiguration for the refresh scope and associated features.
|
||||
|spring.cloud.refresh.extra-refreshable | true | Additional class names for beans to post process into refresh scope.
|
||||
|spring.cloud.service-registry.auto-registration.enabled | true | Whether service auto-registration is enabled. Defaults to true.
|
||||
|
||||
@@ -906,12 +906,71 @@ public class CustomLoadBalancerConfiguration {
|
||||
@Bean
|
||||
public ServiceInstanceListSupplier discoveryClientServiceInstanceListSupplier(
|
||||
ReactiveDiscoveryClient discoveryClient, Environment environment,
|
||||
LoadBalancerProperties loadBalancerProperties,
|
||||
LoadBalancerZoneConfig zoneConfig,
|
||||
ApplicationContext context) {
|
||||
DiscoveryClientServiceInstanceListSupplier firstDelegate = new DiscoveryClientServiceInstanceListSupplier(
|
||||
discoveryClient, environment);
|
||||
ZonePreferenceServiceInstanceListSupplier delegate = new ZonePreferenceServiceInstanceListSupplier(firstDelegate,
|
||||
loadBalancerProperties);
|
||||
zoneConfig);
|
||||
ObjectProvider<LoadBalancerCacheManager> cacheManagerProvider = context
|
||||
.getBeanProvider(LoadBalancerCacheManager.class);
|
||||
if (cacheManagerProvider.getIfAvailable() != null) {
|
||||
return new CachingServiceInstanceListSupplier(delegate,
|
||||
cacheManagerProvider.getIfAvailable());
|
||||
}
|
||||
return delegate;
|
||||
}
|
||||
}
|
||||
----
|
||||
|
||||
=== Instance Health-Check for LoadBalancer
|
||||
|
||||
It is possible to enable a scheduled HealthCheck for the LoadBalancer. The `HealthCheckServiceInstanceListSupplier`
|
||||
is provided for that. It regularly verifies if the instances provided by a delegate
|
||||
`ServiceInstanceListSupplier` are still alive and only returns the healthy instances,
|
||||
unless there are none - then it returns all the retrieved instances.
|
||||
|
||||
TIP: This mechanism is particularly helpful while using the `SimpleDiscoveryClient`. For the
|
||||
clients backed by an actual Service Registry, it's not necessary to use, as we already get
|
||||
healthy instances after querying the external ServiceDiscovery.
|
||||
|
||||
The `HealthCheckServiceInstanceListSupplier` uses `InstanceHealthChecker` to verify if the instances are
|
||||
alive. We provide a default `PingHealthChecker` instance. It uses `WebClient` to execute
|
||||
requests against the `health` endpoint of the instance. You can also provide your own implementation
|
||||
of `InstanceHealthChecker` instead.
|
||||
|
||||
`HealthCheckServiceInstanceListSupplier` uses properties prefixed with
|
||||
`spring.cloud.loadbalancer.healthcheck`. You can set the `initialDelay` and `interval`
|
||||
for the scheduler.
|
||||
|
||||
For the `PingHealthChecker`, you can set the default path for the healthcheck URL by setting
|
||||
the value of the `spring.cloud.loadbalancer.healthcheck.path.default`. You can also set a specific value
|
||||
for any given service by setting the value of the `spring.cloud.loadbalancer.healthcheck.path.[SERVICE_ID]`,
|
||||
substituting the `[SERVICE_ID]` with the correct ID of your service. If the path is not set,
|
||||
`/actuator/health` is used by default.
|
||||
|
||||
In order to use the health-check scheduler approach, you will have to instantiate a `HealthCheckServiceInstanceListSupplier` bean in a <<custom-loadbalancer-configuration,custom configuration>>.
|
||||
|
||||
We use delegates to work with `ServiceInstanceListSupplier` beans.
|
||||
We suggest passing a `DiscoveryClientServiceInstanceListSupplier` delegate in the constructor of `HealthCheckServiceInstanceListSupplier` and, in turn, wrapping the latter with a `CachingServiceInstanceListSupplier` to leverage <<loadbalancer-caching, LoadBalancer caching mechanism>>.
|
||||
|
||||
You could use this sample configuration to set it up:
|
||||
|
||||
[[zoned-based-custom-loadbalancer-configuration]]
|
||||
[source,java,indent=0]
|
||||
----
|
||||
public class CustomLoadBalancerConfiguration {
|
||||
|
||||
@Bean
|
||||
public ServiceInstanceListSupplier discoveryClientServiceInstanceListSupplier(
|
||||
ReactiveDiscoveryClient discoveryClient, Environment environment,
|
||||
LoadBalancerProperties loadBalancerProperties,
|
||||
ApplicationContext context,
|
||||
InstanceHealthChecker healthChecker) {
|
||||
DiscoveryClientServiceInstanceListSupplier firstDelegate = new DiscoveryClientServiceInstanceListSupplier(
|
||||
discoveryClient, environment);
|
||||
HealthCheckServiceInstanceListSupplier delegate = new HealthCheckServiceInstanceListSupplier(firstDelegate,
|
||||
loadBalancerProperties, healthChecker);
|
||||
ObjectProvider<LoadBalancerCacheManager> cacheManagerProvider = context
|
||||
.getBeanProvider(LoadBalancerCacheManager.class);
|
||||
if (cacheManagerProvider.getIfAvailable() != null) {
|
||||
|
||||
Reference in New Issue
Block a user