diff --git a/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/core/RandomLoadBalancer.java b/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/core/RandomLoadBalancer.java index ed97037c..f1b9f356 100644 --- a/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/core/RandomLoadBalancer.java +++ b/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/core/RandomLoadBalancer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,11 +29,13 @@ import org.springframework.cloud.client.loadbalancer.DefaultResponse; import org.springframework.cloud.client.loadbalancer.EmptyResponse; import org.springframework.cloud.client.loadbalancer.Request; import org.springframework.cloud.client.loadbalancer.Response; +import org.springframework.util.function.SingletonSupplier; /** * A random-based implementation of {@link ReactorServiceInstanceLoadBalancer}. * * @author Olga Maciaszek-Sharma + * @author Nan Chiu * @since 2.2.7 */ public class RandomLoadBalancer implements ReactorServiceInstanceLoadBalancer { @@ -42,7 +44,7 @@ public class RandomLoadBalancer implements ReactorServiceInstanceLoadBalancer { private final String serviceId; - private ObjectProvider serviceInstanceListSupplierProvider; + private final SingletonSupplier serviceInstanceListSingletonSupplier; /** * @param serviceInstanceListSupplierProvider a provider of @@ -52,14 +54,15 @@ public class RandomLoadBalancer implements ReactorServiceInstanceLoadBalancer { public RandomLoadBalancer(ObjectProvider serviceInstanceListSupplierProvider, String serviceId) { this.serviceId = serviceId; - this.serviceInstanceListSupplierProvider = serviceInstanceListSupplierProvider; + this.serviceInstanceListSingletonSupplier = SingletonSupplier.of( + () -> serviceInstanceListSupplierProvider.getIfAvailable(NoopServiceInstanceListSupplier::new) + ); } @SuppressWarnings("rawtypes") @Override public Mono> choose(Request request) { - ServiceInstanceListSupplier supplier = serviceInstanceListSupplierProvider - .getIfAvailable(NoopServiceInstanceListSupplier::new); + ServiceInstanceListSupplier supplier = serviceInstanceListSingletonSupplier.obtain(); return supplier.get(request) .next() .map(serviceInstances -> processInstanceResponse(supplier, serviceInstances)); diff --git a/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/core/RoundRobinLoadBalancer.java b/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/core/RoundRobinLoadBalancer.java index 7bed7fe5..6eede246 100644 --- a/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/core/RoundRobinLoadBalancer.java +++ b/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/core/RoundRobinLoadBalancer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,6 +30,7 @@ import org.springframework.cloud.client.loadbalancer.DefaultResponse; import org.springframework.cloud.client.loadbalancer.EmptyResponse; import org.springframework.cloud.client.loadbalancer.Request; import org.springframework.cloud.client.loadbalancer.Response; +import org.springframework.util.function.SingletonSupplier; /** * A Round-Robin-based implementation of {@link ReactorServiceInstanceLoadBalancer}. @@ -37,6 +38,7 @@ import org.springframework.cloud.client.loadbalancer.Response; * @author Spencer Gibb * @author Olga Maciaszek-Sharma * @author Zhuozhi JI + * @author Nan Chiu */ public class RoundRobinLoadBalancer implements ReactorServiceInstanceLoadBalancer { @@ -46,7 +48,7 @@ public class RoundRobinLoadBalancer implements ReactorServiceInstanceLoadBalance final String serviceId; - ObjectProvider serviceInstanceListSupplierProvider; + private final SingletonSupplier serviceInstanceListSingletonSupplier; /** * @param serviceInstanceListSupplierProvider a provider of @@ -67,7 +69,9 @@ public class RoundRobinLoadBalancer implements ReactorServiceInstanceLoadBalance public RoundRobinLoadBalancer(ObjectProvider serviceInstanceListSupplierProvider, String serviceId, int seedPosition) { this.serviceId = serviceId; - this.serviceInstanceListSupplierProvider = serviceInstanceListSupplierProvider; + this.serviceInstanceListSingletonSupplier = SingletonSupplier.of( + () -> serviceInstanceListSupplierProvider.getIfAvailable(NoopServiceInstanceListSupplier::new) + ); this.position = new AtomicInteger(seedPosition); } @@ -77,8 +81,7 @@ public class RoundRobinLoadBalancer implements ReactorServiceInstanceLoadBalance // https://github.com/Netflix/ocelli/blob/master/ocelli-core/ // src/main/java/netflix/ocelli/loadbalancer/RoundRobinLoadBalancer.java public Mono> choose(Request request) { - ServiceInstanceListSupplier supplier = serviceInstanceListSupplierProvider - .getIfAvailable(NoopServiceInstanceListSupplier::new); + ServiceInstanceListSupplier supplier = serviceInstanceListSingletonSupplier.obtain(); return supplier.get(request) .next() .map(serviceInstances -> processInstanceResponse(supplier, serviceInstances));