Class DnsNameResolver
- java.lang.Object
-
- io.grpc.NameResolver
-
- io.grpc.internal.DnsNameResolver
-
- Direct Known Subclasses:
GrpclbNameResolver
public class DnsNameResolver extends NameResolver
A DNS-basedNameResolver.Each
AorAAAArecord emits anEquivalentAddressGroupin the list passed toNameResolver.Listener2.onResult2(ResolutionResult).- See Also:
DnsNameResolverProvider
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static interfaceDnsNameResolver.AddressResolverAddressResolver resolves a hostname into a list of addresses.protected static classDnsNameResolver.InternalResolutionResultUsed as a DNS-based name resolver's internal representation of resolution result.private static classDnsNameResolver.JdkAddressResolverprivate classDnsNameResolver.Resolvestatic interfaceDnsNameResolver.ResourceResolverDnsNameResolver.ResourceResolveris a Dns ResourceRecord resolver.(package private) static interfaceDnsNameResolver.ResourceResolverFactoryDnsNameResolver.ResourceResolverFactoryis a factory for making resource resolvers.static classDnsNameResolver.SrvRecordDescribes a parsed SRV record.-
Nested classes/interfaces inherited from class io.grpc.NameResolver
NameResolver.Args, NameResolver.ConfigOrError, NameResolver.Factory, NameResolver.Listener, NameResolver.Listener2, NameResolver.ResolutionResult, NameResolver.ResolutionResultAttr, NameResolver.ServiceConfigParser
-
-
Field Summary
Fields Modifier and Type Field Description protected DnsNameResolver.AddressResolveraddressResolverprivate java.lang.Stringauthorityprivate longcacheTtlNanos(package private) static longDEFAULT_NETWORK_CACHE_TTL_SECONDSDefault DNS cache duration if network cache ttl value is not specified (null).(package private) static booleanenableJndi(package private) static booleanenableJndiLocalhostprotected static booleanenableTxtprivate java.util.concurrent.Executorexecutorprivate SharedResourceHolder.Resource<java.util.concurrent.Executor>executorResourceExecutor that will be used if an Executor is not provide viaNameResolver.Args.private java.lang.Stringhostprivate static java.lang.StringJNDI_LOCALHOST_PROPERTYprivate static java.lang.StringJNDI_PROPERTYprivate static java.lang.StringJNDI_TXT_PROPERTYprivate NameResolver.Listener2listenerprivate static java.lang.StringlocalHostnameAccess throughgetLocalHostname().private static java.util.logging.Loggerlogger(package private) static java.lang.StringNETWORKADDRESS_CACHE_TTL_PROPERTYJava networking system properties name for caching DNS result.private intport(package private) ProxyDetectorproxyDetectorprivate java.util.Randomrandomprotected booleanresolvedprivate booleanresolvingprivate java.util.concurrent.atomic.AtomicReference<DnsNameResolver.ResourceResolver>resourceResolverprivate static DnsNameResolver.ResourceResolverFactoryresourceResolverFactoryprivate static java.lang.StringSERVICE_CONFIG_CHOICE_CLIENT_HOSTNAME_KEYprivate static java.lang.StringSERVICE_CONFIG_CHOICE_CLIENT_LANGUAGE_KEYprivate static java.util.Set<java.lang.String>SERVICE_CONFIG_CHOICE_KEYSprivate static java.lang.StringSERVICE_CONFIG_CHOICE_PERCENTAGE_KEYprivate static java.lang.StringSERVICE_CONFIG_CHOICE_SERVICE_CONFIG_KEYprivate static java.lang.StringSERVICE_CONFIG_NAME_PREFIX(package private) static java.lang.StringSERVICE_CONFIG_PREFIXprivate NameResolver.ServiceConfigParserserviceConfigParserprivate booleanshutdownprivate com.google.common.base.Stopwatchstopwatchprivate SynchronizationContextsyncContextprivate booleanusingExecutorResourceTrue if using an executor resource that should be released after use.
-
Constructor Summary
Constructors Modifier Constructor Description protectedDnsNameResolver(java.lang.String nsAuthority, java.lang.String name, NameResolver.Args args, SharedResourceHolder.Resource<java.util.concurrent.Executor> executorResource, com.google.common.base.Stopwatch stopwatch, boolean isAndroid)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private booleancacheRefreshRequired()private EquivalentAddressGroupdetectProxy()protected DnsNameResolver.InternalResolutionResultdoResolve(boolean forceTxt)Main logic of name resolution.private static java.util.List<java.lang.String>getClientLanguagesFromChoice(java.util.Map<java.lang.String,?> serviceConfigChoice)protected java.lang.StringgetHost()private static java.util.List<java.lang.String>getHostnamesFromChoice(java.util.Map<java.lang.String,?> serviceConfigChoice)private static java.lang.StringgetLocalHostname()private static longgetNetworkAddressCacheTtlNanos(boolean isAndroid)Returns value of network address cache ttl property if not Android environment.private static java.lang.DoublegetPercentageFromChoice(java.util.Map<java.lang.String,?> serviceConfigChoice)(package private) intgetPort()protected DnsNameResolver.ResourceResolvergetResourceResolver()(package private) static DnsNameResolver.ResourceResolverFactorygetResourceResolverFactory(java.lang.ClassLoader loader)java.lang.StringgetServiceAuthority()Returns the authority used to authenticate connections to servers.(package private) static java.util.Map<java.lang.String,?>maybeChooseServiceConfig(java.util.Map<java.lang.String,?> choice, java.util.Random random, java.lang.String hostname)Determines if a given Service Config choice applies, and if so, returns it.(package private) static NameResolver.ConfigOrErrorparseServiceConfig(java.util.List<java.lang.String> rawTxtRecords, java.util.Random random, java.lang.String localHostname)(package private) static java.util.List<java.util.Map<java.lang.String,?>>parseTxtResults(java.util.List<java.lang.String> txtRecords)Parse TXT service config records as JSON.voidrefresh()Re-resolve the name.private voidresolve()private java.util.List<EquivalentAddressGroup>resolveAddresses()private NameResolver.ConfigOrErrorresolveServiceConfig()protected voidsetAddressResolver(DnsNameResolver.AddressResolver addressResolver)protected voidsetResourceResolver(DnsNameResolver.ResourceResolver resourceResolver)protected static booleanshouldUseJndi(boolean jndiEnabled, boolean jndiLocalhostEnabled, java.lang.String target)voidshutdown()Stops the resolution.voidstart(NameResolver.Listener2 listener)Starts the resolution.-
Methods inherited from class io.grpc.NameResolver
start
-
-
-
-
Field Detail
-
logger
private static final java.util.logging.Logger logger
-
SERVICE_CONFIG_CHOICE_CLIENT_LANGUAGE_KEY
private static final java.lang.String SERVICE_CONFIG_CHOICE_CLIENT_LANGUAGE_KEY
- See Also:
- Constant Field Values
-
SERVICE_CONFIG_CHOICE_PERCENTAGE_KEY
private static final java.lang.String SERVICE_CONFIG_CHOICE_PERCENTAGE_KEY
- See Also:
- Constant Field Values
-
SERVICE_CONFIG_CHOICE_CLIENT_HOSTNAME_KEY
private static final java.lang.String SERVICE_CONFIG_CHOICE_CLIENT_HOSTNAME_KEY
- See Also:
- Constant Field Values
-
SERVICE_CONFIG_CHOICE_SERVICE_CONFIG_KEY
private static final java.lang.String SERVICE_CONFIG_CHOICE_SERVICE_CONFIG_KEY
- See Also:
- Constant Field Values
-
SERVICE_CONFIG_PREFIX
static final java.lang.String SERVICE_CONFIG_PREFIX
- See Also:
- Constant Field Values
-
SERVICE_CONFIG_CHOICE_KEYS
private static final java.util.Set<java.lang.String> SERVICE_CONFIG_CHOICE_KEYS
-
SERVICE_CONFIG_NAME_PREFIX
private static final java.lang.String SERVICE_CONFIG_NAME_PREFIX
- See Also:
- Constant Field Values
-
JNDI_PROPERTY
private static final java.lang.String JNDI_PROPERTY
-
JNDI_LOCALHOST_PROPERTY
private static final java.lang.String JNDI_LOCALHOST_PROPERTY
-
JNDI_TXT_PROPERTY
private static final java.lang.String JNDI_TXT_PROPERTY
-
NETWORKADDRESS_CACHE_TTL_PROPERTY
static final java.lang.String NETWORKADDRESS_CACHE_TTL_PROPERTY
Java networking system properties name for caching DNS result.Default value is -1 (cache forever) if security manager is installed. If security manager is not installed, the ttl value is
nullwhich falls back togRPC default value.For android, gRPC doesn't attempt to cache; this property value will be ignored.
- See Also:
- Constant Field Values
-
DEFAULT_NETWORK_CACHE_TTL_SECONDS
static final long DEFAULT_NETWORK_CACHE_TTL_SECONDS
Default DNS cache duration if network cache ttl value is not specified (null).- See Also:
- Constant Field Values
-
enableJndi
static boolean enableJndi
-
enableJndiLocalhost
static boolean enableJndiLocalhost
-
enableTxt
protected static boolean enableTxt
-
resourceResolverFactory
private static final DnsNameResolver.ResourceResolverFactory resourceResolverFactory
-
proxyDetector
final ProxyDetector proxyDetector
-
localHostname
private static java.lang.String localHostname
Access throughgetLocalHostname().
-
random
private final java.util.Random random
-
addressResolver
protected volatile DnsNameResolver.AddressResolver addressResolver
-
resourceResolver
private final java.util.concurrent.atomic.AtomicReference<DnsNameResolver.ResourceResolver> resourceResolver
-
authority
private final java.lang.String authority
-
host
private final java.lang.String host
-
port
private final int port
-
executorResource
private final SharedResourceHolder.Resource<java.util.concurrent.Executor> executorResource
Executor that will be used if an Executor is not provide viaNameResolver.Args.
-
cacheTtlNanos
private final long cacheTtlNanos
-
syncContext
private final SynchronizationContext syncContext
-
stopwatch
private final com.google.common.base.Stopwatch stopwatch
-
resolved
protected boolean resolved
-
shutdown
private boolean shutdown
-
executor
private java.util.concurrent.Executor executor
-
usingExecutorResource
private final boolean usingExecutorResource
True if using an executor resource that should be released after use.
-
serviceConfigParser
private final NameResolver.ServiceConfigParser serviceConfigParser
-
resolving
private boolean resolving
-
listener
private NameResolver.Listener2 listener
-
-
Constructor Detail
-
DnsNameResolver
protected DnsNameResolver(@Nullable java.lang.String nsAuthority, java.lang.String name, NameResolver.Args args, SharedResourceHolder.Resource<java.util.concurrent.Executor> executorResource, com.google.common.base.Stopwatch stopwatch, boolean isAndroid)
-
-
Method Detail
-
getServiceAuthority
public java.lang.String getServiceAuthority()
Description copied from class:NameResolverReturns the authority used to authenticate connections to servers. It must be from a trusted source, because if the authority is tampered with, RPCs may be sent to the attackers which may leak sensitive user data.An implementation must generate it without blocking, typically in line, and must keep it unchanged.
NameResolvers created from the same factory with the same argument must return the same authority.- Specified by:
getServiceAuthorityin classNameResolver
-
getHost
protected java.lang.String getHost()
-
start
public void start(NameResolver.Listener2 listener)
Description copied from class:NameResolverStarts the resolution. The method is not supposed to throw any exceptions. That might cause the Channel that the name resolver is serving to crash. Errors should be propagated throughNameResolver.Listener2.onError(io.grpc.Status).An instance may not be started more than once, by any overload of this method, even after an intervening call to
NameResolver.shutdown().- Overrides:
startin classNameResolver- Parameters:
listener- used to receive updates on the target
-
refresh
public void refresh()
Description copied from class:NameResolverRe-resolve the name.Can only be called after
NameResolver.start(io.grpc.NameResolver.Listener)has been called.This is only a hint. Implementation takes it as a signal but may not start resolution immediately. It should never throw.
The default implementation is no-op.
- Overrides:
refreshin classNameResolver
-
resolveAddresses
private java.util.List<EquivalentAddressGroup> resolveAddresses()
-
resolveServiceConfig
@Nullable private NameResolver.ConfigOrError resolveServiceConfig()
-
detectProxy
@Nullable private EquivalentAddressGroup detectProxy() throws java.io.IOException
- Throws:
java.io.IOException
-
doResolve
protected DnsNameResolver.InternalResolutionResult doResolve(boolean forceTxt)
Main logic of name resolution.
-
parseServiceConfig
@Nullable static NameResolver.ConfigOrError parseServiceConfig(java.util.List<java.lang.String> rawTxtRecords, java.util.Random random, java.lang.String localHostname)
-
resolve
private void resolve()
-
cacheRefreshRequired
private boolean cacheRefreshRequired()
-
shutdown
public void shutdown()
Description copied from class:NameResolverStops the resolution. Updates to the Listener will stop.- Specified by:
shutdownin classNameResolver
-
getPort
final int getPort()
-
parseTxtResults
static java.util.List<java.util.Map<java.lang.String,?>> parseTxtResults(java.util.List<java.lang.String> txtRecords) throws java.io.IOExceptionParse TXT service config records as JSON.- Throws:
java.io.IOException- if one of the txt records contains improperly formatted JSON.
-
getPercentageFromChoice
@Nullable private static final java.lang.Double getPercentageFromChoice(java.util.Map<java.lang.String,?> serviceConfigChoice)
-
getClientLanguagesFromChoice
@Nullable private static final java.util.List<java.lang.String> getClientLanguagesFromChoice(java.util.Map<java.lang.String,?> serviceConfigChoice)
-
getHostnamesFromChoice
@Nullable private static final java.util.List<java.lang.String> getHostnamesFromChoice(java.util.Map<java.lang.String,?> serviceConfigChoice)
-
getNetworkAddressCacheTtlNanos
private static long getNetworkAddressCacheTtlNanos(boolean isAndroid)
Returns value of network address cache ttl property if not Android environment. For android, DnsNameResolver does not cache the dns lookup result.
-
maybeChooseServiceConfig
@Nullable static java.util.Map<java.lang.String,?> maybeChooseServiceConfig(java.util.Map<java.lang.String,?> choice, java.util.Random random, java.lang.String hostname)Determines if a given Service Config choice applies, and if so, returns it.- Parameters:
choice- The service config choice.- Returns:
- The service config object or
nullif this choice does not apply. - See Also:
- Service Config in DNS
-
setAddressResolver
protected void setAddressResolver(DnsNameResolver.AddressResolver addressResolver)
-
setResourceResolver
protected void setResourceResolver(DnsNameResolver.ResourceResolver resourceResolver)
-
getResourceResolver
@Nullable protected DnsNameResolver.ResourceResolver getResourceResolver()
-
getResourceResolverFactory
@Nullable static DnsNameResolver.ResourceResolverFactory getResourceResolverFactory(java.lang.ClassLoader loader)
-
getLocalHostname
private static java.lang.String getLocalHostname()
-
shouldUseJndi
protected static boolean shouldUseJndi(boolean jndiEnabled, boolean jndiLocalhostEnabled, java.lang.String target)
-
-