Skip to content

Commit e081c91

Browse files
committed
Improve readability a bit
1 parent d616e98 commit e081c91

File tree

2 files changed

+59
-39
lines changed

2 files changed

+59
-39
lines changed

grpc-client-spring-boot-autoconfigure/src/main/java/net/devh/boot/grpc/client/nameresolver/DiscoveryClientNameResolver.java

Lines changed: 58 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,14 @@
2020
import static com.google.common.base.Preconditions.checkNotNull;
2121
import static com.google.common.base.Preconditions.checkState;
2222
import static java.util.Objects.requireNonNull;
23+
import static net.devh.boot.grpc.common.util.GrpcUtils.CLOUD_DISCOVERY_METADATA_PORT;
2324

2425
import java.net.InetSocketAddress;
2526
import java.util.List;
2627
import java.util.Map;
2728
import java.util.concurrent.Executor;
2829
import java.util.concurrent.atomic.AtomicReference;
30+
import java.util.function.Consumer;
2931

3032
import org.springframework.cloud.client.ServiceInstance;
3133
import org.springframework.cloud.client.discovery.DiscoveryClient;
@@ -40,7 +42,6 @@
4042
import io.grpc.SynchronizationContext;
4143
import io.grpc.internal.SharedResourceHolder;
4244
import lombok.extern.slf4j.Slf4j;
43-
import net.devh.boot.grpc.common.util.GrpcUtils;
4445

4546
/**
4647
* The DiscoveryClientNameResolver resolves the service hosts and their associated gRPC port using the channel's name
@@ -59,7 +60,7 @@ public class DiscoveryClientNameResolver extends NameResolver {
5960
private final String name;
6061
private final DiscoveryClient client;
6162
private final SynchronizationContext syncContext;
62-
private final Runnable externalCleaner;
63+
private final Consumer<DiscoveryClientNameResolver> shutdownHook;
6364
private final SharedResourceHolder.Resource<Executor> executorResource;
6465
private final boolean usingExecutorResource;
6566

@@ -78,27 +79,46 @@ public class DiscoveryClientNameResolver extends NameResolver {
7879
* @param client The client used to look up the service addresses.
7980
* @param args The name resolver args.
8081
* @param executorResource The executor resource.
81-
* @param externalCleaner The optional cleaner used during {@link #shutdown()}
82+
* @param shutdownHook The optional cleaner used during {@link #shutdown()}
8283
*/
8384
public DiscoveryClientNameResolver(final String name, final DiscoveryClient client, final Args args,
84-
final SharedResourceHolder.Resource<Executor> executorResource, final Runnable externalCleaner) {
85+
final SharedResourceHolder.Resource<Executor> executorResource,
86+
final Consumer<DiscoveryClientNameResolver> shutdownHook) {
8587
this.name = name;
8688
this.client = client;
8789
this.syncContext = requireNonNull(args.getSynchronizationContext(), "syncContext");
88-
this.externalCleaner = externalCleaner;
90+
this.shutdownHook = shutdownHook;
8991
this.executor = args.getOffloadExecutor();
9092
this.usingExecutorResource = this.executor == null;
9193
this.executorResource = executorResource;
9294
}
9395

96+
/**
97+
* Gets the name of the service to get the instances of.
98+
*
99+
* @return The name associated with this resolver.
100+
*/
101+
protected final String getName() {
102+
return this.name;
103+
}
104+
105+
/**
106+
* Checks whether this resolver is active. E.g. {@code #start} has been called, but not {@code #shutdown()}.
107+
*
108+
* @return True, if there is a listener attached. False, otherwise.
109+
*/
110+
protected final boolean isActive() {
111+
return this.listener != null;
112+
}
113+
94114
@Override
95115
public final String getServiceAuthority() {
96116
return this.name;
97117
}
98118

99119
@Override
100120
public void start(final Listener2 listener) {
101-
checkState(this.listener == null, "already started");
121+
checkState(!isActive(), "already started");
102122
if (this.usingExecutorResource) {
103123
this.executor = SharedResourceHolder.get(this.executorResource);
104124
}
@@ -108,7 +128,7 @@ public void start(final Listener2 listener) {
108128

109129
@Override
110130
public void refresh() {
111-
checkState(this.listener != null, "not started");
131+
checkState(isActive(), "not started");
112132
resolve();
113133
}
114134

@@ -120,19 +140,28 @@ public void refresh() {
120140
*/
121141
public void refreshFromExternal() {
122142
this.syncContext.execute(() -> {
123-
if (this.listener != null) {
143+
if (isActive()) {
124144
resolve();
125145
}
126146
});
127147
}
128148

149+
/**
150+
* Discovers matching service instances.
151+
*
152+
* @return A list of service instances to use.
153+
*/
154+
private List<ServiceInstance> discoverServices() {
155+
return this.client.getInstances(this.name);
156+
}
157+
129158
private void resolve() {
130159
log.debug("Scheduled resolve for {}", this.name);
131160
if (this.resolving) {
132161
return;
133162
}
134163
this.resolving = true;
135-
this.executor.execute(new Resolve(this.listener, this.instanceList));
164+
this.executor.execute(new Resolve(this.listener));
136165
}
137166

138167
@Override
@@ -142,8 +171,8 @@ public void shutdown() {
142171
this.executor = SharedResourceHolder.release(this.executorResource, this.executor);
143172
}
144173
this.instanceList = Lists.newArrayList();
145-
if (this.externalCleaner != null) {
146-
this.externalCleaner.run();
174+
if (this.shutdownHook != null) {
175+
this.shutdownHook.accept(this);
147176
}
148177
}
149178

@@ -158,17 +187,14 @@ public String toString() {
158187
private final class Resolve implements Runnable {
159188

160189
private final Listener2 savedListener;
161-
private final List<ServiceInstance> savedInstanceList;
162190

163191
/**
164192
* Creates a new Resolve that stores a snapshot of the relevant states of the resolver.
165193
*
166194
* @param listener The listener to send the results to.
167-
* @param instanceList The current server instance list.
168195
*/
169-
Resolve(final Listener2 listener, final List<ServiceInstance> instanceList) {
196+
Resolve(final Listener2 listener) {
170197
this.savedListener = requireNonNull(listener, "listener");
171-
this.savedInstanceList = requireNonNull(instanceList, "instanceList");
172198
}
173199

174200
@Override
@@ -178,13 +204,13 @@ public void run() {
178204
resultContainer.set(resolveInternal());
179205
} catch (final Exception e) {
180206
this.savedListener.onError(Status.UNAVAILABLE.withCause(e)
181-
.withDescription("Failed to update server list for " + DiscoveryClientNameResolver.this.name));
207+
.withDescription("Failed to update server list for " + getName()));
182208
resultContainer.set(Lists.newArrayList());
183209
} finally {
184210
DiscoveryClientNameResolver.this.syncContext.execute(() -> {
185211
DiscoveryClientNameResolver.this.resolving = false;
186212
final List<ServiceInstance> result = resultContainer.get();
187-
if (result != KEEP_PREVIOUS && DiscoveryClientNameResolver.this.listener != null) {
213+
if (result != KEEP_PREVIOUS && isActive()) {
188214
DiscoveryClientNameResolver.this.instanceList = result;
189215
}
190216
});
@@ -198,37 +224,36 @@ public void run() {
198224
* should be used.
199225
*/
200226
private List<ServiceInstance> resolveInternal() {
201-
final String name = DiscoveryClientNameResolver.this.name;
202-
final List<ServiceInstance> newInstanceList =
203-
DiscoveryClientNameResolver.this.client.getInstances(name);
204-
log.debug("Got {} candidate servers for {}", newInstanceList.size(), name);
227+
final List<ServiceInstance> newInstanceList = discoverServices();
228+
log.debug("Got {} candidate servers for {}", newInstanceList.size(), getName());
205229
if (CollectionUtils.isEmpty(newInstanceList)) {
206-
log.error("No servers found for {}", name);
207-
this.savedListener.onError(Status.UNAVAILABLE.withDescription("No servers found for " + name));
230+
log.error("No servers found for {}", getName());
231+
this.savedListener.onError(Status.UNAVAILABLE
232+
.withDescription("No servers found for " + getName()));
208233
return Lists.newArrayList();
209234
}
210235
if (!needsToUpdateConnections(newInstanceList)) {
211-
log.debug("Nothing has changed... skipping update for {}", name);
236+
log.debug("Nothing has changed... skipping update for {}", getName());
212237
return KEEP_PREVIOUS;
213238
}
214-
log.debug("Ready to update server list for {}", name);
239+
log.debug("Ready to update server list for {}", getName());
215240
final List<EquivalentAddressGroup> targets = Lists.newArrayList();
216241
for (final ServiceInstance instance : newInstanceList) {
217242
final int port = getGRPCPort(instance);
218-
log.debug("Found gRPC server {}:{} for {}", instance.getHost(), port, name);
243+
log.debug("Found gRPC server {}:{} for {}", instance.getHost(), port, getName());
219244
targets.add(new EquivalentAddressGroup(
220245
new InetSocketAddress(instance.getHost(), port), Attributes.EMPTY));
221246
}
222247
if (targets.isEmpty()) {
223-
log.error("None of the servers for {} specified a gRPC port", name);
248+
log.error("None of the servers for {} specified a gRPC port", getName());
224249
this.savedListener.onError(Status.UNAVAILABLE
225-
.withDescription("None of the servers for " + name + " specified a gRPC port"));
250+
.withDescription("None of the servers for " + getName() + " specified a gRPC port"));
226251
return Lists.newArrayList();
227252
} else {
228253
this.savedListener.onResult(ResolutionResult.newBuilder()
229254
.setAddresses(targets)
230255
.build());
231-
log.info("Done updating server list for {}", name);
256+
log.info("Done updating server list for {}", getName());
232257
return newInstanceList;
233258
}
234259
}
@@ -245,15 +270,14 @@ private int getGRPCPort(final ServiceInstance instance) {
245270
if (metadata == null) {
246271
return instance.getPort();
247272
}
248-
String portString = metadata.get(GrpcUtils.CLOUD_DISCOVERY_METADATA_PORT);
273+
String portString = metadata.get(CLOUD_DISCOVERY_METADATA_PORT);
249274
if (portString == null) {
250275
portString = metadata.get(LEGACY_CLOUD_DISCOVERY_METADATA_PORT);
251276
if (portString == null) {
252277
return instance.getPort();
253278
} else {
254279
log.warn("Found legacy grpc port metadata '{}' for client '{}' use '{}' instead",
255-
LEGACY_CLOUD_DISCOVERY_METADATA_PORT, DiscoveryClientNameResolver.this.name,
256-
GrpcUtils.CLOUD_DISCOVERY_METADATA_PORT);
280+
LEGACY_CLOUD_DISCOVERY_METADATA_PORT, getName(), CLOUD_DISCOVERY_METADATA_PORT);
257281
}
258282
}
259283
try {
@@ -271,10 +295,10 @@ private int getGRPCPort(final ServiceInstance instance) {
271295
* @return True, if the given instance list contains different entries than the stored ones.
272296
*/
273297
private boolean needsToUpdateConnections(final List<ServiceInstance> newInstanceList) {
274-
if (this.savedInstanceList.size() != newInstanceList.size()) {
298+
if (DiscoveryClientNameResolver.this.instanceList.size() != newInstanceList.size()) {
275299
return true;
276300
}
277-
for (final ServiceInstance instance : this.savedInstanceList) {
301+
for (final ServiceInstance instance : DiscoveryClientNameResolver.this.instanceList) {
278302
final int port = getGRPCPort(instance);
279303
boolean isSame = false;
280304
for (final ServiceInstance newInstance : newInstanceList) {

grpc-client-spring-boot-autoconfigure/src/main/java/net/devh/boot/grpc/client/nameresolver/DiscoveryClientResolverFactory.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import java.net.URI;
2323
import java.util.Set;
2424
import java.util.concurrent.ConcurrentHashMap;
25-
import java.util.concurrent.atomic.AtomicReference;
2625

2726
import javax.annotation.Nullable;
2827
import javax.annotation.PreDestroy;
@@ -73,12 +72,9 @@ public NameResolver newNameResolver(final URI targetUri, final NameResolver.Args
7372
+ "expected: '" + DISCOVERY_SCHEME + ":[//]/<service-name>'; "
7473
+ "but was '" + targetUri.toString() + "'");
7574
}
76-
final AtomicReference<DiscoveryClientNameResolver> reference = new AtomicReference<>();
7775
final DiscoveryClientNameResolver discoveryClientNameResolver =
7876
new DiscoveryClientNameResolver(serviceName.substring(1), this.client, args,
79-
GrpcUtil.SHARED_CHANNEL_EXECUTOR,
80-
() -> this.discoveryClientNameResolvers.remove(reference.get()));
81-
reference.set(discoveryClientNameResolver);
77+
GrpcUtil.SHARED_CHANNEL_EXECUTOR, this.discoveryClientNameResolvers::remove);
8278
this.discoveryClientNameResolvers.add(discoveryClientNameResolver);
8379
return discoveryClientNameResolver;
8480
}

0 commit comments

Comments
 (0)