mirror of https://github.com/grpc/grpc-java.git
core: add flags for selectively enabling grpclb
This commit is contained in:
parent
75b48b4dfe
commit
9b200eb7be
|
|
@ -82,10 +82,19 @@ final class DnsNameResolver extends NameResolver {
|
||||||
private static final String GRPCLB_NAME_PREFIX = "_grpclb._tcp.";
|
private static final String GRPCLB_NAME_PREFIX = "_grpclb._tcp.";
|
||||||
|
|
||||||
private static final String JNDI_PROPERTY =
|
private static final String JNDI_PROPERTY =
|
||||||
System.getProperty("io.grpc.internal.DnsNameResolverProvider.enable_jndi", "false");
|
System.getProperty("io.grpc.internal.DnsNameResolverProvider.enable_jndi", "true");
|
||||||
|
private static final String JNDI_SRV_PROPERTY =
|
||||||
|
System.getProperty("io.grpc.internal.DnsNameResolverProvider.enable_grpclb", "false");
|
||||||
|
private static final String JNDI_TXT_PROPERTY =
|
||||||
|
System.getProperty("io.grpc.internal.DnsNameResolverProvider.enable_service_config", "false");
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
static boolean enableJndi = Boolean.parseBoolean(JNDI_PROPERTY);
|
static boolean enableJndi = Boolean.parseBoolean(JNDI_PROPERTY);
|
||||||
|
@VisibleForTesting
|
||||||
|
static boolean enableSrv = Boolean.parseBoolean(JNDI_SRV_PROPERTY);
|
||||||
|
@VisibleForTesting
|
||||||
|
static boolean enableTxt = Boolean.parseBoolean(JNDI_TXT_PROPERTY);
|
||||||
|
|
||||||
|
|
||||||
private static final ResourceResolverFactory resourceResolverFactory =
|
private static final ResourceResolverFactory resourceResolverFactory =
|
||||||
getResourceResolverFactory(DnsNameResolver.class.getClassLoader());
|
getResourceResolverFactory(DnsNameResolver.class.getClassLoader());
|
||||||
|
|
@ -195,7 +204,8 @@ final class DnsNameResolver extends NameResolver {
|
||||||
if (enableJndi) {
|
if (enableJndi) {
|
||||||
resourceResolver = getResourceResolver();
|
resourceResolver = getResourceResolver();
|
||||||
}
|
}
|
||||||
resolutionResults = resolveAll(addressResolver, resourceResolver, host);
|
resolutionResults =
|
||||||
|
resolveAll(addressResolver, resourceResolver, enableSrv, enableTxt, host);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
savedListener.onError(
|
savedListener.onError(
|
||||||
Status.UNAVAILABLE.withDescription("Unable to resolve host " + host).withCause(e));
|
Status.UNAVAILABLE.withDescription("Unable to resolve host " + host).withCause(e));
|
||||||
|
|
@ -267,7 +277,11 @@ final class DnsNameResolver extends NameResolver {
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
static ResolutionResults resolveAll(
|
static ResolutionResults resolveAll(
|
||||||
AddressResolver addressResolver, @Nullable ResourceResolver resourceResolver, String name) {
|
AddressResolver addressResolver,
|
||||||
|
@Nullable ResourceResolver resourceResolver,
|
||||||
|
boolean requestSrvRecords,
|
||||||
|
boolean requestTxtRecords,
|
||||||
|
String name) {
|
||||||
List<? extends InetAddress> addresses = Collections.emptyList();
|
List<? extends InetAddress> addresses = Collections.emptyList();
|
||||||
Exception addressesException = null;
|
Exception addressesException = null;
|
||||||
List<EquivalentAddressGroup> balancerAddresses = Collections.emptyList();
|
List<EquivalentAddressGroup> balancerAddresses = Collections.emptyList();
|
||||||
|
|
@ -281,17 +295,26 @@ final class DnsNameResolver extends NameResolver {
|
||||||
addressesException = e;
|
addressesException = e;
|
||||||
}
|
}
|
||||||
if (resourceResolver != null) {
|
if (resourceResolver != null) {
|
||||||
try {
|
if (requestSrvRecords) {
|
||||||
balancerAddresses = resourceResolver.resolveSrv(addressResolver, GRPCLB_NAME_PREFIX + name);
|
|
||||||
} catch (Exception e) {
|
|
||||||
balancerAddressesException = e;
|
|
||||||
}
|
|
||||||
// Only do the TXT record lookup if one of the above address resolutions succeeded.
|
|
||||||
if (!(balancerAddressesException != null && addressesException != null)) {
|
|
||||||
try {
|
try {
|
||||||
txtRecords = resourceResolver.resolveTxt(SERVICE_CONFIG_NAME_PREFIX + name);
|
balancerAddresses =
|
||||||
|
resourceResolver.resolveSrv(addressResolver, GRPCLB_NAME_PREFIX + name);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
txtRecordsException = e;
|
balancerAddressesException = e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (requestTxtRecords) {
|
||||||
|
boolean balancerLookupFailedOrNotAttempted =
|
||||||
|
!requestSrvRecords || balancerAddressesException != null;
|
||||||
|
boolean dontResolveTxt =
|
||||||
|
(addressesException != null) && balancerLookupFailedOrNotAttempted;
|
||||||
|
// Only do the TXT record lookup if one of the above address resolutions succeeded.
|
||||||
|
if (!dontResolveTxt) {
|
||||||
|
try {
|
||||||
|
txtRecords = resourceResolver.resolveTxt(SERVICE_CONFIG_NAME_PREFIX + name);
|
||||||
|
} catch (Exception e) {
|
||||||
|
txtRecordsException = e;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -192,8 +192,11 @@ public class DnsNameResolverTest {
|
||||||
when(mockResolver.resolveAddress(Matchers.anyString()))
|
when(mockResolver.resolveAddress(Matchers.anyString()))
|
||||||
.thenReturn(Collections.<InetAddress>singletonList(backendAddr));
|
.thenReturn(Collections.<InetAddress>singletonList(backendAddr));
|
||||||
ResourceResolver resourceResolver = null;
|
ResourceResolver resourceResolver = null;
|
||||||
|
boolean resovleSrv = true;
|
||||||
|
boolean resolveTxt = true;
|
||||||
|
|
||||||
ResolutionResults res = DnsNameResolver.resolveAll(mockResolver, resourceResolver, hostname);
|
ResolutionResults res = DnsNameResolver.resolveAll(
|
||||||
|
mockResolver, resourceResolver, resovleSrv, resolveTxt, hostname);
|
||||||
assertThat(res.addresses).containsExactly(backendAddr);
|
assertThat(res.addresses).containsExactly(backendAddr);
|
||||||
assertThat(res.balancerAddresses).isEmpty();
|
assertThat(res.balancerAddresses).isEmpty();
|
||||||
assertThat(res.txtRecords).isEmpty();
|
assertThat(res.txtRecords).isEmpty();
|
||||||
|
|
@ -214,9 +217,11 @@ public class DnsNameResolverTest {
|
||||||
.thenReturn(Collections.singletonList("service config"));
|
.thenReturn(Collections.singletonList("service config"));
|
||||||
when(mockResourceResolver.resolveSrv(Matchers.any(AddressResolver.class), Matchers.anyString()))
|
when(mockResourceResolver.resolveSrv(Matchers.any(AddressResolver.class), Matchers.anyString()))
|
||||||
.thenReturn(Collections.singletonList(balancerAddr));
|
.thenReturn(Collections.singletonList(balancerAddr));
|
||||||
|
boolean resovleSrv = true;
|
||||||
|
boolean resolveTxt = true;
|
||||||
|
|
||||||
ResolutionResults res =
|
ResolutionResults res = DnsNameResolver.resolveAll(
|
||||||
DnsNameResolver.resolveAll(mockAddressResolver, mockResourceResolver, hostname);
|
mockAddressResolver, mockResourceResolver, resovleSrv, resolveTxt, hostname);
|
||||||
assertThat(res.addresses).containsExactly(backendAddr);
|
assertThat(res.addresses).containsExactly(backendAddr);
|
||||||
assertThat(res.balancerAddresses).containsExactly(balancerAddr);
|
assertThat(res.balancerAddresses).containsExactly(balancerAddr);
|
||||||
assertThat(res.txtRecords).containsExactly("service config");
|
assertThat(res.txtRecords).containsExactly("service config");
|
||||||
|
|
@ -238,9 +243,11 @@ public class DnsNameResolverTest {
|
||||||
.thenReturn(Collections.<String>emptyList());
|
.thenReturn(Collections.<String>emptyList());
|
||||||
when(mockResourceResolver.resolveSrv(Matchers.any(AddressResolver.class), Matchers.anyString()))
|
when(mockResourceResolver.resolveSrv(Matchers.any(AddressResolver.class), Matchers.anyString()))
|
||||||
.thenReturn(Collections.singletonList(balancerAddr));
|
.thenReturn(Collections.singletonList(balancerAddr));
|
||||||
|
boolean resovleSrv = true;
|
||||||
|
boolean resolveTxt = true;
|
||||||
|
|
||||||
ResolutionResults res =
|
ResolutionResults res = DnsNameResolver.resolveAll(
|
||||||
DnsNameResolver.resolveAll(mockAddressResolver, mockResourceResolver, hostname);
|
mockAddressResolver, mockResourceResolver, resovleSrv, resolveTxt, hostname);
|
||||||
assertThat(res.addresses).isEmpty();
|
assertThat(res.addresses).isEmpty();
|
||||||
assertThat(res.balancerAddresses).containsExactly(balancerAddr);
|
assertThat(res.balancerAddresses).containsExactly(balancerAddr);
|
||||||
assertThat(res.txtRecords).isEmpty();
|
assertThat(res.txtRecords).isEmpty();
|
||||||
|
|
@ -261,9 +268,11 @@ public class DnsNameResolverTest {
|
||||||
.thenReturn(Collections.singletonList("service config"));
|
.thenReturn(Collections.singletonList("service config"));
|
||||||
when(mockResourceResolver.resolveSrv(Matchers.any(AddressResolver.class), Matchers.anyString()))
|
when(mockResourceResolver.resolveSrv(Matchers.any(AddressResolver.class), Matchers.anyString()))
|
||||||
.thenThrow(new Exception("something like javax.naming.NamingException"));
|
.thenThrow(new Exception("something like javax.naming.NamingException"));
|
||||||
|
boolean resovleSrv = true;
|
||||||
|
boolean resolveTxt = true;
|
||||||
|
|
||||||
ResolutionResults res =
|
ResolutionResults res = DnsNameResolver.resolveAll(
|
||||||
DnsNameResolver.resolveAll(mockAddressResolver, mockResourceResolver, hostname);
|
mockAddressResolver, mockResourceResolver, resovleSrv, resolveTxt, hostname);
|
||||||
assertThat(res.addresses).containsExactly(backendAddr);
|
assertThat(res.addresses).containsExactly(backendAddr);
|
||||||
assertThat(res.balancerAddresses).isEmpty();
|
assertThat(res.balancerAddresses).isEmpty();
|
||||||
assertThat(res.txtRecords).containsExactly("service config");
|
assertThat(res.txtRecords).containsExactly("service config");
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue