做Demo时发现出现这个问题
Exception in thread "main" org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /userService
at org.apache.zookeeper.KeeperException.create(KeeperException.java:102)
at org.apache.zookeeper.KeeperException.create(KeeperException.java:54)
at org.apache.zookeeper.ZooKeeper.create(ZooKeeper.java:1733)
at com.kkb.UserService.serverRegister(UserService.java:67)
at com.kkb.UserService.start(UserService.java:33)
at com.kkb.UserService.main(UserService.java:22)
然后开始排查问题,第一步我检查的是代码是否有问题,是否是端口号未写对等,排查完之后无误。第二步,检查Ping是否互通,是否能接收数据,确认后可以互通。第三步,检查防火墙是否关闭,检查之后,连360都关了,也重启了一下虚拟机,还是没有解决问题。第四步,检查时间间隔
ZooKeeper zooKeeper = new ZooKeeper("192.168.13.14:2181,192.168.13.15:2181,192.168.13.16:2181", 3000, null);
我怀疑是不是3000,时间是否太短然后开始往上加,直到改为300000
END
package com.kkb;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.ACL;
import java.io.IOException;
import java.io.InputStream;
import java.net.*;
import java.util.ArrayList;
import java.util.Enumeration;
public class UserService {
private int port=3333;
private String node="/userService";
ServerSocket serverSocket;
public static void main(String[] args) throws Exception {
new UserService().start();
}
public void start() throws IOException, KeeperException, InterruptedException {
//获取本机的ip地址 因为centos上可能有多个网卡信息,直接获取第一个可能是错误的(127.0.0.1)
String ip = getLocalIP();
//启动socket服务端
serverSocket = new ServerSocket(port);
System.out.println("服务器已启动.....");
//注册服务到Zookeeper
serverRegister(ip);
//监听socket处理客户端请求
clientHandler();
}
//处理客户端连接
private void clientHandler() throws IOException {
while (true){
Socket clientSocket = serverSocket.accept();
InputStream inputStream = clientSocket.getInputStream();
byte[] barr = new byte[1024];
while (true){
int size = inputStream.read(barr);
if (size == -1){
System.out.println("客户端下线了....");
break;
}
String data = new String(barr, 0, size);
System.out.println("收到来自"+clientSocket.getInetAddress().getHostName()+"的:"+data);
}
}
}
private void serverRegister(String ip) throws IOException, KeeperException, InterruptedException {
//注册服务信息到Zookeeper中(服务注册/发布服务)
ZooKeeper zooKeeper = new ZooKeeper("192.168.13.14:2181,192.168.13.15:2181,192.168.13.16:2181", 300000, null);
System.out.println("连接Zookeeper成功!");
//在Zookeeper上创建节点 将自身的服务信息写入Zookeeper
//访问控制列表
ArrayList<ACL> acls = new ArrayList<>();
//任何都可以访问的权限
ACL acl = new ACL(31, ZooDefs.Ids.ANYONE_ID_UNSAFE);
acls.add(acl);
zooKeeper.create(node,(ip+":"+port).getBytes(),acls, CreateMode.EPHEMERAL);
System.out.println("服务发布成功!");
}
private String getLocalIP() throws SocketException {
String ip = null;
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
while (networkInterfaces.hasMoreElements()) {
NetworkInterface ni = (NetworkInterface) networkInterfaces.nextElement();
Enumeration<InetAddress> nias = ni.getInetAddresses();
while (nias.hasMoreElements()) {
InetAddress ia = (InetAddress) nias.nextElement();
if (!ia.isLinkLocalAddress() && !ia.isLoopbackAddress() && ia instanceof Inet4Address) {
ip = ia.getHostAddress();
}
}
}
return ip;
}
}