问题: 个人做了一个 java 连接 redis 的工具jar; 支持连接单机模式,哨兵模式,集群模式。
测试链接哨兵配置的时候发生异常:
抛出异常后执行下面的, jedis.close 抛出异常 Connection reset ……… Socket closed by peer .
跟踪代码是 outStream.flush Socket 链接异常.
这里有个关键的地方:
配置文件配置的是 127.0.0.1; 经过解析后 获取的IP 是192 的内网地址; 关键问题就在这,使用内网地址调用哨兵 127.0.0.1:26380 调不通。 所以抛出上面的异常。
然后看一下这个内网IP 是怎么来的。
package com.yonyou.ucf.mdd.start;
import redis.clients.jedis.HostAndPort;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class TestLocalHost {
public static String convertHost(String host) {
try {
InetAddress inetAddress = InetAddress.getByName(host);
return !inetAddress.isLoopbackAddress() && !host.equals("0.0.0.0") && !host.startsWith("169.254") ? host : getLocalhost();
} catch (Exception var2) {
System.out.println(String.format("{}.convertHost '" + host + "' is not a valid IP address. ", HostAndPort.class.getName(), var2));
return host;
}
}
public static String getLocalhost() {
String localAddress = null;
try {
InetAddress ia = InetAddress.getLocalHost();
localAddress = ia.getHostAddress();
} catch (UnknownHostException e) {
e.printStackTrace();
}
return localAddress;
}
public static String getLocalHostQuietly() {
String localAddress;
try {
localAddress = InetAddress.getLocalHost().getHostAddress();
} catch (Exception var2) {
System.out.println(String.format("{}.getLocalHostQuietly : cant resolve localhost address", HostAndPort.class.getName(), var2));
localAddress = "localhost";
}
return localAddress;
}
public static void main(String[] args) {
System.out.println(convertHost("127.0.0.1"));
}
}
这个是个测试类,逻辑就是 上面 parseString 的里面逻辑, 通过jdk 获取的网卡id 就是内网地址了。
但是这里没有入手点可以改。所以寻求别的思路了。。。
发现了一篇文章 https://hzkeung.com/2017/06/27/redis-sentinel-bind ,这里情况很相似。
继续增加配置
增加了bind 配置, 并且 内网地址放在第一位。 问题解决!!