dubbo連接zookeeper注冊中心因為斷網(wǎng)導(dǎo)致線程無限等待問題【轉(zhuǎn)】

最近維護(hù)的系統(tǒng)切換了網(wǎng)絡(luò)環(huán)境贾节,由聯(lián)通換成了電信網(wǎng)絡(luò),因為某些過濾規(guī)則導(dǎo)致系統(tǒng)連不上zookeeper服務(wù)器(應(yīng)用系統(tǒng)機(jī)器在深圳,網(wǎng)絡(luò)為電信線路,zookeeper服務(wù)器在北京稀轨,網(wǎng)絡(luò)為聯(lián)通線路),因為我不是運(yùn)維人員也不懂運(yùn)維相關(guān)的技術(shù)岸军,所以排查了很久也不知道原因奋刽,最后無奈之下把深圳這邊的網(wǎng)絡(luò)切回了聯(lián)通,系統(tǒng)恢復(fù)正常艰赞。

但是因為本次事故體現(xiàn)了一個很嚴(yán)重的問題杨名,即當(dāng)zookeeper注冊中心連不上時dubbo的線程會無限等待,因為系統(tǒng)有一些定時任務(wù)會比較頻繁地開啟新線程連接dubbo猖毫,所以導(dǎo)致的結(jié)果是tomcat一會兒線程池就滿了台谍,其它的不依賴dubbo的功能也被阻塞無法使用。

所以需要解決一個問題吁断,即在斷網(wǎng)的情況下要保證應(yīng)用程序可以運(yùn)行(有很多功能不依賴外網(wǎng))趁蕊,一開始我以為dubbo應(yīng)該有對ZKClient連接相關(guān)的超時時間配置,結(jié)果找了很久也沒發(fā)現(xiàn)仔役,后來debug了dubbo的源代碼發(fā)現(xiàn)根本就沒有設(shè)置超時時間掷伙,ZKClient默認(rèn)的超時時間是Integer.MAX_VALUE,幾乎等于無限等待又兵,所以無奈之下只好重寫了dubbo的ZookeeperClient實現(xiàn)任柜,好在dubbo的擴(kuò)展性非常好,基于SPI的擴(kuò)展非常方便沛厨,下面是我的擴(kuò)展代碼:

1宙地、增加一個文件com.alibaba.dubbo.remoting.zookeeper.ZookeeperTransporter放置于項目的META-INF/dubbo/internal文件夾下,dubbo便會自動掃描到這個文件逆皮。文件內(nèi)容很簡單就一句話:zkclient=com.gwall.zookeeper.ZkclientZookeeperTransporter

即把dubbo原來的默認(rèn)實現(xiàn)替換為我的實現(xiàn)宅粥。

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默認(rèn)的無限等待 * @author long.zr * */

public class ZkclientZookeeperClient extends AbstractZookeeperClient {

private final ZkClient client;

private volatile KeeperState state = KeeperState.SyncConnected;

public ZkclientZookeeperClient(URL url) {

super(url);

//設(shè)置超時時間為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);

}

}

框架/平臺構(gòu)成:

Maven+Springmvc + Mybatis + Shiro(權(quán)限)+ Tiles(模板) +ActiveMQ(消息隊列) + Rest(服務(wù)) + WebService(服務(wù))+ EHcache(緩存) + Quartz(定時調(diào)度)+ Html5(支持PC钞诡、IOS、Android)

用戶權(quán)限系統(tǒng):

組織結(jié)構(gòu):角色、用戶臭增、用戶組懂酱、組織機(jī)構(gòu);權(quán)限點(diǎn):頁面誊抛、方法列牺、按鈕、數(shù)據(jù)權(quán)限拗窃、分級授權(quán)

項目管理新體驗:

快速出原型系統(tǒng)瞎领、組件樹、版本控制随夸、模塊移植九默、協(xié)同開發(fā)、實時監(jiān)控宾毒、發(fā)布管理

可持續(xù)集成:

所有組件可移植驼修、可定制、可擴(kuò)充诈铛,開發(fā)成果不斷積累乙各,形成可持續(xù)發(fā)展的良性循環(huán)

支持平臺平臺:

Windows XP、Windows 7 幢竹、Windows 10 耳峦、 Linux 、 Unix

服務(wù)器容器:

Tomcat 5/6/7 焕毫、Jetty蹲坷、JBoss、WebSphere 8.5

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末邑飒,一起剝皮案震驚了整個濱河市循签,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌幸乒,老刑警劉巖懦底,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異罕扎,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)丐重,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門腔召,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人扮惦,你說我怎么就攤上這事臀蛛。” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵浊仆,是天一觀的道長客峭。 經(jīng)常有香客問我,道長抡柿,這世上最難降的妖魔是什么舔琅? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮洲劣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘囱稽。我一直安慰自己,他們只是感情好战惊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吞获,像睡著了一般况凉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上衫哥,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機(jī)與錄音膛锭,去河邊找鬼。 笑死蚊荣,一個胖子當(dāng)著我的面吹牛初狰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播互例,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼媳叨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起糊秆,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捉片,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伍纫,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年赔蒲,在試婚紗的時候發(fā)現(xiàn)自己被綠了访惜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嘹履。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡砾嫉,死狀恐怖窒篱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情配并,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布溉旋,位于F島的核電站嫉髓,受9級特大地震影響观腊,放射性物質(zhì)發(fā)生泄漏算行。R本人自食惡果不足惜梧油,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一儡陨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧骗村,春花似錦、人聲如沸叙身。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽残吩。三九已至,卻和暖如春泣侮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背隶校。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工蛹锰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人铜犬。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像敛劝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子夸盟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理像捶,服務(wù)發(fā)現(xiàn),斷路器唆垃,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 0 準(zhǔn)備 安裝注冊中心:Zookeeper痘儡、Dubbox自帶的dubbo-registry-simple;安裝Du...
    七寸知架構(gòu)閱讀 13,989評論 0 88
  • 萬物復(fù)蘇的春天在悄悄走近矾瑰,除了保養(yǎng)好皮膚、勵志瘦身藏肉穿上美美的衣服之外凉夯,你也許還需要一些或成熟復(fù)古或俏皮可愛的配...
    安雅敏敏閱讀 1,639評論 4 46
  • 口中三千章懷事,袖里乾坤不自知劲够。 揮筆直書談天地,縱論五行異曲直征绎。 松林定隱觀時勢,燕雀贏飛笑吾癡人柿。 時人安知鴻鵠...
    萌萌AC閱讀 414評論 0 2
  • 目錄|我的奇葩相親經(jīng)歷目錄上一章|第10章戳這里哦 文|瘋狂小梅子 中午和李老師在學(xué)校食堂吃飯凫岖。 她特意帶了自己做...
    瘋狂小梅子閱讀 1,888評論 20 13