简体   繁体   English

获取 java.net.UnknownHostException: hostname: Name or service not known while using spring-data-redis-starter

[英]Getting java.net.UnknownHostException: hostname: Name or service not known while using spring-data-redis-starter

I am trying to connect to Redis in cluster mode by using spring-boot-starter-data-redis and lettuce library and getting below exception,我正在尝试通过使用 spring-boot-starter-data-redis 和生菜库以集群模式连接到 Redis 并获得以下异常,

        2019-08-21 00:55:42.695  WARN 75 --- [ioEventLoop-6-1] i.l.c.c.topology.ClusterTopologyRefresh  : Unable to connect to myhostname.service:6379

java.util.concurrent.CompletionException: java.net.UnknownHostException: myhostname.service: Name or service not known
    at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:292) ~[na:1.8.0_181]
    at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:308) ~[na:1.8.0_181]
    at java.util.concurrent.CompletableFuture.uniApply(CompletableFuture.java:593) ~[na:1.8.0_181]
    at java.util.concurrent.CompletableFuture$UniApply.tryFire(CompletableFuture.java:577) ~[na:1.8.0_181]
    at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:474) ~[na:1.8.0_181]
    at java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:1977) ~[na:1.8.0_181]
    at io.lettuce.core.AbstractRedisClient.lambda$initializeChannelAsync$1(AbstractRedisClient.java:275) ~[lettuce-core-5.0.4.RELEASE.jar!/:na]
    at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:511) ~[netty-common-4.1.25.Final.jar!/:4.1.25.Final]
    at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:485) ~[netty-common-4.1.25.Final.jar!/:4.1.25.Final]
    at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:424) ~[netty-common-4.1.25.Final.jar!/:4.1.25.Final]
    at io.netty.util.concurrent.DefaultPromise.setFailure(DefaultPromise.java:112) ~[netty-common-4.1.25.Final.jar!/:4.1.25.Final]
    at io.netty.channel.DefaultChannelPromise.setFailure(DefaultChannelPromise.java:89) ~[netty-transport-4.1.25.Final.jar!/:4.1.25.Final]
    at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:216) ~[netty-transport-4.1.25.Final.jar!/:4.1.25.Final]
    at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:49) ~[netty-transport-4.1.25.Final.jar!/:4.1.25.Final]
    at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:188) ~[netty-transport-4.1.25.Final.jar!/:4.1.25.Final]
    at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:174) ~[netty-transport-4.1.25.Final.jar!/:4.1.25.Final]
    at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:511) ~[netty-common-4.1.25.Final.jar!/:4.1.25.Final]
    at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:485) ~[netty-common-4.1.25.Final.jar!/:4.1.25.Final]
    at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:424) ~[netty-common-4.1.25.Final.jar!/:4.1.25.Final]
    at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:103) ~[netty-common-4.1.25.Final.jar!/:4.1.25.Final]
    at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84) ~[netty-transport-4.1.25.Final.jar!/:4.1.25.Final]
    at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:978) ~[netty-transport-4.1.25.Final.jar!/:4.1.25.Final]
    at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:512) ~[netty-transport-4.1.25.Final.jar!/:4.1.25.Final]
    at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:423) ~[netty-transport-4.1.25.Final.jar!/:4.1.25.Final]
    at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:482) ~[netty-transport-4.1.25.Final.jar!/:4.1.25.Final]
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) ~[netty-common-4.1.25.Final.jar!/:4.1.25.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404) ~[netty-common-4.1.25.Final.jar!/:4.1.25.Final]
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:465) ~[netty-transport-4.1.25.Final.jar!/:4.1.25.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884) ~[netty-common-4.1.25.Final.jar!/:4.1.25.Final]
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.25.Final.jar!/:4.1.25.Final]
    at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_181]
Caused by: java.net.UnknownHostException: master1.event-store-service-V-70125f6-2-1566348843-redis.service: Name or service not known
    at java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method) ~[na:1.8.0_181]
    at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:928) ~[na:1.8.0_181]
    at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1323) ~[na:1.8.0_181]
    at java.net.InetAddress.getAllByName0(InetAddress.java:1276) ~[na:1.8.0_181]
    at java.net.InetAddress.getAllByName(InetAddress.java:1192) ~[na:1.8.0_181]
    at java.net.InetAddress.getAllByName(InetAddress.java:1126) ~[na:1.8.0_181]
    at java.net.InetAddress.getByName(InetAddress.java:1076) ~[na:1.8.0_181]
    at io.netty.util.internal.SocketUtils$8.run(SocketUtils.java:146) ~[netty-common-4.1.25.Final.jar!/:4.1.25.Final]
    at io.netty.util.internal.SocketUtils$8.run(SocketUtils.java:143) ~[netty-common-4.1.25.Final.jar!/:4.1.25.Final]
    at java.security.AccessController.doPrivileged(Native Method) ~[na:1.8.0_181]
    at io.netty.util.internal.SocketUtils.addressByName(SocketUtils.java:143) ~[netty-common-4.1.25.Final.jar!/:4.1.25.Final]
    at io.netty.resolver.DefaultNameResolver.doResolve(DefaultNameResolver.java:43) ~[netty-resolver-4.1.25.Final.jar!/:4.1.25.Final]
    at io.netty.resolver.SimpleNameResolver.resolve(SimpleNameResolver.java:63) ~[netty-resolver-4.1.25.Final.jar!/:4.1.25.Final]
    at io.netty.resolver.SimpleNameResolver.resolve(SimpleNameResolver.java:55) ~[netty-resolver-4.1.25.Final.jar!/:4.1.25.Final]
    at io.netty.resolver.InetSocketAddressResolver.doResolve(InetSocketAddressResolver.java:57) ~[netty-resolver-4.1.25.Final.jar!/:4.1.25.Final]
    at io.netty.resolver.InetSocketAddressResolver.doResolve(InetSocketAddressResolver.java:32) ~[netty-resolver-4.1.25.Final.jar!/:4.1.25.Final]
    at io.netty.resolver.AbstractAddressResolver.resolve(AbstractAddressResolver.java:108) ~[netty-resolver-4.1.25.Final.jar!/:4.1.25.Final]
    at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:208) ~[netty-transport-4.1.25.Final.jar!/:4.1.25.Final]
    ... 18 common frames omitted

Note: "myhostname.service" is due to I am using consul and I can ping myhostname.service also can connect to it using "redis-cli -c -h myhostname.service -p 6379" command.注意:“myhostname.service”是因为我使用的是 consul,我可以 ping myhostname.service 也可以使用“redis-cli -c -h myhostname.service -p 6379”命令连接到它。

My code to connect to redis is,我连接到redis的代码是,

@Configuration
@ConfigurationProperties(prefix = "redis")
public class LettuceCacheConfig {

    private static Logger logger = LoggerFactory.getLogger(LettuceCacheConfig.class);
    private static Long topologyRefreshDuration = 10L;
    private static int maxRedirects = 3;

    private String servers;
    private String profileName; 
    private String password;

    private PoolConfig poolConfig = new PoolConfig();

    class PoolConfig {
        int maxTotal;
        int maxIdle;
        int minIdle;

        public PoolConfig() {
        }
    }

    public LettuceClientConfiguration getLettuceClientConfig() {
        final ClusterTopologyRefreshOptions options = ClusterTopologyRefreshOptions.builder()
                .enablePeriodicRefresh(Duration.of(topologyRefreshDuration, ChronoUnit.MINUTES))
                .enableAllAdaptiveRefreshTriggers().dynamicRefreshSources(true).build();

        final LettuceClientConfiguration lettuceClientConfig = LettuceClientConfiguration.builder()
                .clientOptions(ClusterClientOptions.builder().topologyRefreshOptions(options)
                        .validateClusterNodeMembership(false).build())
                .build();

        return lettuceClientConfig;
    }


    private GenericObjectPoolConfig getPoolingConfiguration() {
        final GenericObjectPoolConfig config = new GenericObjectPoolConfig();
        config.setMaxIdle(this.poolConfig.getMaxIdle());
        config.setMaxTotal(this.poolConfig.getMaxTotal());
        config.setMinIdle(this.poolConfig.getMinIdle());
        return config;
    }

    public RedisClusterConfiguration getClusterConfiguration() {
        final RedisClusterConfiguration clusterConfiguration = new RedisClusterConfiguration();//new RedisClusterConfiguration(getRedisServers());
        String hostPort = getRedisServers().get(0);
        String tokens[] = hostPort.split(":");
        logger.info("REDIS HOST IS {}", tokens[0]);
        logger.info("REDIS PORT IS {}", tokens[1]);
        clusterConfiguration.clusterNode(tokens[0], Integer.parseInt(tokens[1]));
        clusterConfiguration.setMaxRedirects(maxRedirects);
        logger.info("PASSWORD is {}",password);
        clusterConfiguration.setPassword(RedisPassword.of(password));
        return clusterConfiguration;
    }



    private List<String> getRedisServers() {
        String tokens[] = servers.split(",");
        logger.debug("Redis Servers are {}", Arrays.toString(tokens));
        return Arrays.asList(tokens);
    }

    @Bean
    public RedisConnectionFactory getLettuceConnectionFactory() {
        return new LettuceConnectionFactory(getClusterConfiguration(),
         getLettuceClientConfig());
    }

}

Since I was getting exception at java.net.InetAddress.getByName("hostname") I tried,由于我在 java.net.InetAddress.getByName("hostname") 处遇到异常,所以我尝试了,

  1. running a redis-cli from my app container to connect to redis cluster containers it was successful.(as mentioned above.)从我的应用程序容器运行 redis-cli 以连接到 redis 集群容器,它成功了。(如上所述。)

  2. Since I was getting exception at java.net.InetAddress.getByName("hostname") I tried same method from inside of my app container using my redis hostname.由于我在 java.net.InetAddress.getByName("hostname") 处遇到异常,我使用我的 redis 主机名从我的应用程序容器内部尝试了相同的方法。 It was successful and did not throw UnknownHostException.它成功并且没有抛出 UnknownHostException。

  3. Pinging to the redis host from app container works.从应用程序容器 Ping 到 redis 主机有效。

  4. I did set up redis-cluster on local machine it works fine with above code only change was I provided 127.0.0.1:6379 instead of hostname.service:6379.我确实在本地机器上设置了 redis-cluster,上面的代码可以正常工作,只是我提供了 127.0.0.1:6379 而不是 hostname.service:6379。

I am using spring-boot-starter-parent:2.0.3.RELEASE and lettuce-core:5.0.4.我正在使用 spring-boot-starter-parent:2.0.3.RELEASE 和 lettuce-core:5.0.4。 Is there any issue with the code?代码有问题吗?

I can not say this answers this question completely but got the reason for the issue.我不能说这完全回答了这个问题,但得到了问题的原因。 Issue is when app containers startup, redis containers/service is not still registered with the consul, so look up for redis containers with the lookup name say "master1.redis.service" returns UnknownHostException.问题是当应用容器启动时,redis 容器/服务仍未注册到 consul,因此查找具有查找名称的 redis 容器,例如“master1.redis.service”返回 UnknownHostException。 But since I was running redis-cli and ping after a while there was no connection issue.但是由于我在一段时间后运行 redis-cli 和 ping,所以没有连接问题。 I verified this by restarting app containers while keeping the Redis containers up and then there was no UnknownHostException.我通过在保持 Redis 容器启动的同时重新启动应用程序容器来验证这一点,然后没有 UnknownHostException。 The reason unknow to me was if initially if there was UnknowHostException why ClusterTopologyRefreshOptions did not work?我不知道的原因是,如果最初存在 UnknowHostException 为什么 ClusterTopologyRefreshOptions 不起作用? As per my thinking it should have looked up the hostname again after some duration and would have got the resolution/ip from the consul.根据我的想法,它应该在一段时间后再次查找主机名,并且会从领事那里获得解析/IP。 But that did not happen但这并没有发生

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Apache httpcomponent返回java.net.UnknownHostException:名称或服务未知 - Apache httpcomponent returns java.net.UnknownHostException: Name or service not known 获取java.net.UnknownHostException: - Getting java.net.UnknownHostException: java.net.UnknownHostException:&lt; <hostname> &gt;:未知错误 - java.net.UnknownHostException: <<hostname>> : unknown error 如何在使用 Spring Boot 和 Eureka Server 时修复错误 java.net.UnknownHostException? - How to fix the error java.net.UnknownHostException while using Spring Boot and Eureka Server? java.net.UnknownHostException:服务器的主机名无效:本地 - java.net.UnknownHostException: Invalid hostname for server: local 的java.net.UnknownHostException - java.net.UnknownHostException java.net.UnknownHostException:无法解析主机没有与主机名关联的地址 - java.net.UnknownHostException: Unable to resolve host No address associated with hostname 使用AsyncHttpClient的java.net.UnknownHostException - java.net.UnknownHostException using AsyncHttpClient Redis - JUnit - 引起:java.net.UnknownHostException:本地主机 - Redis - JUnit - Caused by: java.net.UnknownHostException: localhost java.net.UnknownHostException:在 Spring Boot 和 Cloud 中进行 4 次查询后无法解析“inventory-service” - java.net.UnknownHostException: Failed to resolve 'inventory-service' after 4 queries in Spring Boot and Cloud
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM