這里寫dubbo線程模型金矛,主要是講服務(wù)消費(fèi)者和服務(wù)提供者這兩大核心的線程模型秸抚。
一 dubbo服務(wù)提供者線程模型。
這里我們想得到dubbo線程模型廊散,先啟動(dòng)dubbo提供者桑滩,然后jstack pid >> stack.log獲取線程信息。也可以根據(jù)debug來觀察信息允睹,如下圖所示运准。
11111.PNG
主要有以下線程:
- 5 New I/O worker
- 1 New I/O server boss
- 1 dubbo-remoting-server-heartbeat-thread-1
- 1 DubboRegistryFailedRetryTimer-thread-1
- 1 ZkClient-EventThread-23-127.0.0.1:2181
- 1 main-SendThread
- 1 main-EventThread
- 6 DubboSaveRegistryCache-thread-1
- 1 DubboServerHandler-ip-thread-1
- 1 DubboResponseTimeoutScanTimer
根據(jù)jstack打印的堆棧以及相關(guān)調(diào)用鏈路上debug會(huì)得出一些信息。
- New I/O worker和New I/O server boss 對(duì)應(yīng)netty的worker和boss線程缭受。
- heartbeat胁澳,心跳檢測(cè),dubbo服務(wù)端啟動(dòng)會(huì)米者,會(huì)對(duì)和客戶端的長(zhǎng)連接做周期性檢查韭畸。
- DubboRegistryFailedRetryTimer
dubbo服務(wù)提供者流程。
- (New I/O worker線程)當(dāng)有請(qǐng)求進(jìn)來的時(shí)候蔓搞,因?yàn)槭情L(zhǎng)連接胰丁,這里的請(qǐng)求進(jìn)來指的是Channel接受到消息,首先是進(jìn)入NettyHandler的messageReceived方法喂分。
- 然后經(jīng)過HeartbeatHandler判斷是不是心跳請(qǐng)求或者響應(yīng)锦庸,發(fā)現(xiàn)不是,則繼續(xù)往下執(zhí)行received蒲祈。
- 再往下走甘萧,把這里的Channel,ChannelHandler讳嘱,message扔給ChannelEventRunnable類幔嗦,放在DubboServerHandler-xxx-thread-8線程執(zhí)行。
- 該線程執(zhí)行代碼是在ChannelEventRunnable:run中沥潭。發(fā)現(xiàn)是RECEIVED邀泉,則調(diào)用DecodeHandler的received。然后執(zhí)行到HeaderExchangeHandler的received钝鸽。在received中汇恤,會(huì)有這個(gè)代碼Response response = handleRequest(exchangeChannel, request);。然后返回結(jié)果拔恰。