SOFA Bolt源碼分析 3-Sync同步請求

一、調(diào)用方式

TestResponse response = (TestResponse) client.invokeSync("127.0.0.1:8888", request, 30 * 1000);

二、源碼分析

1.final Connection conn = getConnectionAndInitInvokeContext(url, invokeContext);//創(chuàng)建連接對象
2.this.connectionManager.check(conn);//連接有效性校驗(yàn)
3.this.invokeSync(conn, request, invokeContext, timeoutMillis);
    3.1RemotingCommand requestCommand = toRemotingCommand(request, conn, invokeContext,timeoutMillis);//初始化遠(yuǎn)程命令對象撇叁,包括序列化器(用戶可以自定義)和crc(可關(guān)閉)
    3.2ResponseCommand responseCommand = (ResponseCommand) super.invokeSync(conn, requestCommand,timeoutMillis);
      3.2.1final InvokeFuture future = createInvokeFuture(request, request.getInvokeContext());//創(chuàng)建默認(rèn)的InvokeFuture
      3.2.2conn.addInvokeFuture(future);//將InvokeFuture設(shè)置到連接下的invokeFutureMap,考慮到連接的復(fù)用畦贸,invokeFutureMap通過每次請求的唯一ID來保存
      3.2.3RemotingCommand response = future.waitResponse(timeoutMillis);//因?yàn)槭峭秸埱笤赡郑ㄟ^countDownLatch來阻塞等待異步獲取到請求接口楞捂,有超時(shí)時(shí)間
    3.3RpcResponseResolver.resolveResponseObject(responseCommand,
            RemotingUtil.parseRemoteAddress(conn.getChannel()));//字節(jié)碼反序列化

但是通過上面的代碼,我們不難發(fā)現(xiàn)趋厉,這里并沒有像netty里的inbound的channelRead寨闹,那這就要回到我們上一章講的RcpClient的new過程了,源碼如下:
RpcClient

private ConnectionFactory connectionFactory = new RpcConnectionFactory(userProcessors,this);//初始化鏈接工廠,這里就是RpcHandler初始化的地方君账,RpcHandler是在后續(xù)客戶端的初始化過程中繁堡,被添加到Bootstrap里的,詳細(xì)分析可以看上一章乡数;這里還初始化了HeartbeatHandler椭蹄,也是后面客戶端初始化過程需要用到的,心跳設(shè)計(jì)會(huì)在后續(xù)的章節(jié)講到

RpcHandler

channelRead(ChannelHandlerContext ctx, Object msg)
1.ProtocolCode protocolCode = ctx.channel().attr(Connection.PROTOCOL).get();
2.Protocol protocol = ProtocolManager.getProtocol(protocolCode);//獲取鏈接的協(xié)議净赴,協(xié)議設(shè)計(jì)會(huì)在后續(xù)講到
3.protocol.getCommandHandler().handleCommand(new RemotingContext(ctx, new InvokeContext(), serverSide, userProcessors), msg);
    3.1final RemotingProcessor processor = processorManager.getProcessor(cmd.getCmdCode());//獲取遠(yuǎn)程調(diào)用處理器
    3.2processor.process(ctx, cmd, processorManager.getDefaultExecutor());//使用默認(rèn)的線程池處理請求绳矩,也可以用戶自定義
        AbstractRemotingProcessor
        3.2.1ProcessTask task = new ProcessTask(ctx, msg);//每一次請求一個(gè)子任務(wù),負(fù)責(zé)相應(yīng)接收
            RpcResponseProcessor.doProcess
            3.2.1.1Connection conn = ctx.getChannelContext().channel().attr(Connection.CONNECTION).get();//獲取當(dāng)前的鏈接
            3.2.1.2InvokeFuture future = conn.removeInvokeFuture(cmd.getId());//從invokeFutureMap獲取當(dāng)前請求的InvokeFuture
            3.2.1.3future.putResponse(cmd)//將還未反序列化的RemotingCommand對象放入到InvokeFuture劫侧,等待用戶進(jìn)程獲取
            3.2.1.4future.executeInvokeCallback()//通知回調(diào)埋酬,但因?yàn)槲覀兪峭侥J剑鋵?shí)callbackListener是空的烧栋,并沒有相應(yīng)的回調(diào)任務(wù)
            

總結(jié)
SOFA的這樣由一個(gè)單獨(dú)的線程對inbound進(jìn)去讀取写妥,再有線程池去分發(fā)處理,能一定的減少對于inbound區(qū)IO壓力

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末审姓,一起剝皮案震驚了整個(gè)濱河市珍特,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌扎筒,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嗜桌,死亡現(xiàn)場離奇詭異,居然都是意外死亡骨宠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門相满,熙熙樓的掌柜王于貴愁眉苦臉地迎上來层亿,“玉大人,你說我怎么就攤上這事立美。” “怎么了建蹄?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵裕偿,是天一觀的道長。 經(jīng)常有香客問我痛单,道長击费,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任桦他,我火速辦了婚禮蔫巩,結(jié)果婚禮上快压,老公的妹妹穿的比我還像新娘。我一直安慰自己蔫劣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布脉幢。 她就那樣靜靜地躺著嫌松,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缘眶。 梳的紋絲不亂的頭發(fā)上巷懈,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天割岛,我揣著相機(jī)與錄音维咸,去河邊找鬼瞬哼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼剥汤,長吁一口氣:“原來是場噩夢啊……” “哼慈迈!你這毒婦竟也來了蠢沿?” 一聲冷哼從身側(cè)響起舷蟀,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤匈子,失蹤者是張志新(化名)和其女友劉穎政敢,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體眷篇,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疲憋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年睬罗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片垂券。...
    茶點(diǎn)故事閱讀 38,646評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖菇爪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情凳宙,我是刑警寧澤熙揍,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布氏涩,位于F島的核電站届囚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏意系。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一饺汹、第九天 我趴在偏房一處隱蔽的房頂上張望蛔添。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胁塞。三九已至咏尝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間啸罢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工扰才, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人衩匣。 一個(gè)月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像生百,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子蚀浆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評論 2 348