项目基础环境关键因素:dubbo,zookeeper
项目无法启动,且无异常输出。在配置足够多日志输出点之后,发觉阻塞在zookeeperRegistry,无法继续执行进行下去。
项目死活启动不了的时候,一般是阻塞在同步操作上。那么在分布式系统中,存在的阻塞点一般有:
和注册中心的链接;
和db的链接。
和db的链接一般在连接池有超时处理,但是和注册中心的链接却不一定,很容易造成链接挂起,使得项目陷入启动死等状态。
项目基于tomcat环境,通过开启tomcat远程调试端口,然后本地连接到远端机器,进行远程调试。然后在zookeeperRegistry中定义断点,发现确实是由于在zkClient连接zookeeper时的阻塞导致启动阻塞。
dubbo指向的zookeeper配置localhost:2181,而hosts对于localhost的解析没有配置,使得localhost解析成了机器的外网ip。然而,centos默认安装时开启iptable,并且只开放22端口,因此访问的2181端口无法通过外网连接到。因此,dubbo解析zookeeper地址时,解析为公网ip,然后又试图在公网下通过2181端口连接到zookeeper,此时又被iptable拒绝连接。导致连接请求陷入阻塞。这是导致表征的本质原因。
按理说,正常情况应该有超时异常等处理,看zkClient代码发现,dubbo中用的zkClient代码为:
public ZkClient(String serverstring) {
this(serverstring, Integer.MAX_VALUE);
}
超时时间设定为Integer.MAX_VALUE,而这就是导致表征的关键原因。