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
A
orAAAA
record emits anEquivalentAddressGroup
in the list passed toNameResolver.Listener2.onResult2(ResolutionResult)
.- See Also:
DnsNameResolverProvider
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static interface
DnsNameResolver.AddressResolver
AddressResolver resolves a hostname into a list of addresses.protected static class
DnsNameResolver.InternalResolutionResult
Used as a DNS-based name resolver's internal representation of resolution result.private static class
DnsNameResolver.JdkAddressResolver
private class
DnsNameResolver.Resolve
static interface
DnsNameResolver.ResourceResolver
DnsNameResolver.ResourceResolver
is a Dns ResourceRecord resolver.(package private) static interface
DnsNameResolver.ResourceResolverFactory
DnsNameResolver.ResourceResolverFactory
is a factory for making resource resolvers.static class
DnsNameResolver.SrvRecord
Describes 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.AddressResolver
addressResolver
private java.lang.String
authority
private long
cacheTtlNanos
(package private) static long
DEFAULT_NETWORK_CACHE_TTL_SECONDS
Default DNS cache duration if network cache ttl value is not specified (null
).(package private) static boolean
enableJndi
(package private) static boolean
enableJndiLocalhost
protected static boolean
enableTxt
private java.util.concurrent.Executor
executor
private SharedResourceHolder.Resource<java.util.concurrent.Executor>
executorResource
Executor that will be used if an Executor is not provide viaNameResolver.Args
.private java.lang.String
host
private static java.lang.String
JNDI_LOCALHOST_PROPERTY
private static java.lang.String
JNDI_PROPERTY
private static java.lang.String
JNDI_TXT_PROPERTY
private NameResolver.Listener2
listener
private static java.lang.String
localHostname
Access throughgetLocalHostname()
.private static java.util.logging.Logger
logger
(package private) static java.lang.String
NETWORKADDRESS_CACHE_TTL_PROPERTY
Java networking system properties name for caching DNS result.private int
port
(package private) ProxyDetector
proxyDetector
private java.util.Random
random
protected boolean
resolved
private boolean
resolving
private java.util.concurrent.atomic.AtomicReference<DnsNameResolver.ResourceResolver>
resourceResolver
private static DnsNameResolver.ResourceResolverFactory
resourceResolverFactory
private static java.lang.String
SERVICE_CONFIG_CHOICE_CLIENT_HOSTNAME_KEY
private static java.lang.String
SERVICE_CONFIG_CHOICE_CLIENT_LANGUAGE_KEY
private static java.util.Set<java.lang.String>
SERVICE_CONFIG_CHOICE_KEYS
private static java.lang.String
SERVICE_CONFIG_CHOICE_PERCENTAGE_KEY
private static java.lang.String
SERVICE_CONFIG_CHOICE_SERVICE_CONFIG_KEY
private static java.lang.String
SERVICE_CONFIG_NAME_PREFIX
(package private) static java.lang.String
SERVICE_CONFIG_PREFIX
private NameResolver.ServiceConfigParser
serviceConfigParser
private boolean
shutdown
private com.google.common.base.Stopwatch
stopwatch
private SynchronizationContext
syncContext
private boolean
usingExecutorResource
True if using an executor resource that should be released after use.
-
Constructor Summary
Constructors Modifier Constructor Description protected
DnsNameResolver(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 boolean
cacheRefreshRequired()
private EquivalentAddressGroup
detectProxy()
protected DnsNameResolver.InternalResolutionResult
doResolve(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.String
getHost()
private static java.util.List<java.lang.String>
getHostnamesFromChoice(java.util.Map<java.lang.String,?> serviceConfigChoice)
private static java.lang.String
getLocalHostname()
private static long
getNetworkAddressCacheTtlNanos(boolean isAndroid)
Returns value of network address cache ttl property if not Android environment.private static java.lang.Double
getPercentageFromChoice(java.util.Map<java.lang.String,?> serviceConfigChoice)
(package private) int
getPort()
protected DnsNameResolver.ResourceResolver
getResourceResolver()
(package private) static DnsNameResolver.ResourceResolverFactory
getResourceResolverFactory(java.lang.ClassLoader loader)
java.lang.String
getServiceAuthority()
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.ConfigOrError
parseServiceConfig(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.void
refresh()
Re-resolve the name.private void
resolve()
private java.util.List<EquivalentAddressGroup>
resolveAddresses()
private NameResolver.ConfigOrError
resolveServiceConfig()
protected void
setAddressResolver(DnsNameResolver.AddressResolver addressResolver)
protected void
setResourceResolver(DnsNameResolver.ResourceResolver resourceResolver)
protected static boolean
shouldUseJndi(boolean jndiEnabled, boolean jndiLocalhostEnabled, java.lang.String target)
void
shutdown()
Stops the resolution.void
start(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
null
which 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:NameResolver
Returns 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.
NameResolver
s created from the same factory with the same argument must return the same authority.- Specified by:
getServiceAuthority
in classNameResolver
-
getHost
protected java.lang.String getHost()
-
start
public void start(NameResolver.Listener2 listener)
Description copied from class:NameResolver
Starts 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:
start
in classNameResolver
- Parameters:
listener
- used to receive updates on the target
-
refresh
public void refresh()
Description copied from class:NameResolver
Re-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:
refresh
in 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:NameResolver
Stops the resolution. Updates to the Listener will stop.- Specified by:
shutdown
in 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.IOException
Parse 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
null
if 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)
-
-