dubbo连接zookeeper注册中心因为断网导致线程无限等待问题【转】

最近维护的系统切换了网络环境,由联通换成了电信网络,因为某些过滤规则导致系统连不上zookeeper服务器(应用系统机器在深圳,网络为电信线路,zookeeper服务器在北京,网络为联通线路),因为我不是运维人员也不懂运维相关的技术,所以排查了很久也不知道原因,最后无奈之下把深圳这边的网络切回了联通,系统恢复正常。

但是因为本次事故体现了一个很严重的问题,即当zookeeper注册中心连不上时dubbo的线程会无限等待,因为系统有一些定时任务会比较频繁地开启新线程连接dubbo,所以导致的结果是tomcat一会儿线程池就满了,其它的不依赖dubbo的功能也被阻塞无法使用。

所以需要解决一个问题,即在断网的情况下要保证应用程序可以运行(有很多功能不依赖外网),一开始我以为dubbo应该有对ZKClient连接相关的超时时间配置,结果找了很久也没发现,后来debug了dubbo的源代码发现根本就没有设置超时时间,ZKClient默认的超时时间是Integer.MAX_VALUE,几乎等于无限等待,所以无奈之下只好重写了dubbo的ZookeeperClient实现,好在dubbo的扩展性非常好,基于SPI的扩展非常方便,下面是我的扩展代码:

1、增加一个文件com.alibaba.dubbo.remoting.zookeeper.ZookeeperTransporter放置于项目的META-INF/dubbo/internal文件夹下,dubbo便会自动扫描到这个文件。文件内容很简单就一句话:zkclient=com.gwall.zookeeper.ZkclientZookeeperTransporter

即把dubbo原来的默认实现替换为我的实现。

2、ZkclientZookeeperTransporter并不是我想替换的代码,我要替换的是ZkclientZookeeperTransporter的成员变量ZookeeperClient,只是dubbo只在ZookeeperTransporter上加了SPI注解,所以只好这样办了,ZkclientZookeeperTransporter代码照抄过来。

3、在ZkclientZookeeperTransporter里面使用自己的ZkclientZookeeperClient,代码如下:

package com.gwall.zookeeper;

import java.util.List;

import org.I0Itec.zkclient.IZkChildListener;

import org.I0Itec.zkclient.IZkStateListener;

import org.I0Itec.zkclient.ZkClient;

import org.I0Itec.zkclient.exception.ZkNoNodeException;

import org.I0Itec.zkclient.exception.ZkNodeExistsException;

import org.apache.zookeeper.Watcher.Event.KeeperState;

import com.alibaba.dubbo.common.URL;

import com.alibaba.dubbo.remoting.zookeeper.ChildListener;

import com.alibaba.dubbo.remoting.zookeeper.StateListener;

import com.alibaba.dubbo.remoting.zookeeper.support.AbstractZookeeperClient;

/** * 修改dubbo提供的ZkclientZookeeperClient * 主要目的是增加一个连接zookeeper的超时时间,避免ZkClient默认的无限等待 * @author long.zr * */

public class ZkclientZookeeperClient extends AbstractZookeeperClient {

private final ZkClient client;

private volatile KeeperState state = KeeperState.SyncConnected;

public ZkclientZookeeperClient(URL url) {

super(url);

//设置超时时间为5000毫秒

client = new ZkClient(url.getBackupAddress(),5000);

client.subscribeStateChanges(new IZkStateListener() {

public void handleStateChanged(KeeperState state) throws Exception {

ZkclientZookeeperClient.this.state = state;

if (state == KeeperState.Disconnected) {

stateChanged(StateListener.DISCONNECTED);

} else if (state == KeeperState.SyncConnected) {

stateChanged(StateListener.CONNECTED);

}

}

public void handleNewSession() throws Exception {

stateChanged(StateListener.RECONNECTED);

}

});

}

public void createPersistent(String path) {

try {

client.createPersistent(path, true);

} catch (ZkNodeExistsException e) {

}

}

public void createEphemeral(String path) {

try {

client.createEphemeral(path);

} catch (ZkNodeExistsException e) {

}

}

public void delete(String path) {

try {

client.delete(path);

} catch (ZkNoNodeException e) {

}

}

public List getChildren(String path) {

try {

return client.getChildren(path);

} catch (ZkNoNodeException e) {

return null;

}

}

public boolean isConnected() {

return state == KeeperState.SyncConnected;

}

public void doClose() {

client.close();

}

public IZkChildListener createTargetChildListener(String path, final ChildListener listener) {

return new IZkChildListener() {

public void handleChildChange(String parentPath, List currentChilds)

throws Exception {

listener.childChanged(parentPath, currentChilds);

}

};

}

public List addTargetChildListener(String path, final IZkChildListener listener) {

return client.subscribeChildChanges(path, listener);

}

public void removeTargetChildListener(String path, IZkChildListener listener) {

client.unsubscribeChildChanges(path,  listener);

}

}

框架/平台构成:

Maven+Springmvc + Mybatis + Shiro(权限)+ Tiles(模板) +ActiveMQ(消息队列) + Rest(服务) + WebService(服务)+ EHcache(缓存) + Quartz(定时调度)+ Html5(支持PC、IOS、Android)

用户权限系统:

组织结构:角色、用户、用户组、组织机构;权限点:页面、方法、按钮、数据权限、分级授权

项目管理新体验:

快速出原型系统、组件树、版本控制、模块移植、协同开发、实时监控、发布管理

可持续集成:

所有组件可移植、可定制、可扩充,开发成果不断积累,形成可持续发展的良性循环

支持平台平台:

Windows XP、Windows 7 、Windows 10 、 Linux 、 Unix

服务器容器:

Tomcat 5/6/7 、Jetty、JBoss、WebSphere 8.5

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • 0 准备 安装注册中心:Zookeeper、Dubbox自带的dubbo-registry-simple;安装Du...
    七寸知架构阅读 13,905评论 0 88
  • 万物复苏的春天在悄悄走近,除了保养好皮肤、励志瘦身藏肉穿上美美的衣服之外,你也许还需要一些或成熟复古或俏皮可爱的配...
    安雅敏敏阅读 1,571评论 4 46
  • 口中三千章怀事,袖里乾坤不自知。 挥笔直书谈天地,纵论五行异曲直。 松林定隐观时势,燕雀赢飞笑吾痴。 时人安知鸿鹄...
    萌萌AC阅读 372评论 0 2
  • 目录|我的奇葩相亲经历目录上一章|第10章戳这里哦 文|疯狂小梅子 中午和李老师在学校食堂吃饭。 她特意带了自己做...
    疯狂小梅子阅读 1,848评论 20 13