<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          RPC 框架設(shè)計(jì)

          共 1408字,需瀏覽 3分鐘

           ·

          2021-03-21 17:08

          初識(shí) RPC

          服務(wù)化有什么好處?

          • 防止代碼拷貝

          • 防止底層復(fù)雜性的擴(kuò)散

          • 防止公共庫(kù)的耦合

          • 保證 SQL 的質(zhì)量,能夠解除數(shù)據(jù)庫(kù)的耦合

          什么是 RPC

          RPC:Remote Procedure Call Protocol,遠(yuǎn)程過(guò)程調(diào)用協(xié)議,像調(diào)用本地函數(shù)一樣,去調(diào)用一個(gè)遠(yuǎn)端服務(wù)。

          相比“同一個(gè)進(jìn)程”的“本地”函數(shù)調(diào)用,有沒(méi)有辦法,調(diào)用一個(gè)“跨進(jìn)程”的“遠(yuǎn)程”函數(shù)呢?

          Socket 通訊,只能傳遞連續(xù)的字節(jié)流,如何將 “入?yún)?函數(shù)” 放到連續(xù)的字節(jié)流里呢?需要設(shè)計(jì)“應(yīng)用層報(bào)文(協(xié)議)”

          “跨進(jìn)程”“遠(yuǎn)程”調(diào)用的過(guò)程

          RPC 框架的架構(gòu)職責(zé)

          上述跨進(jìn)程調(diào)用遠(yuǎn)端的服務(wù),存在的問(wèn)題是沒(méi)有將通用操作抽離出來(lái)。

          RPC框架職責(zé):

          1. 讓調(diào)用端,像調(diào)用本地函數(shù)一樣,便捷的調(diào)用遠(yuǎn)程的服務(wù)

          2. 讓服務(wù)端,像提供本地函數(shù)一樣,便捷的提供遠(yuǎn)程的服務(wù)

          向調(diào)用方屏蔽各種復(fù)雜性,向服務(wù)方也屏蔽各種復(fù)雜性,讓調(diào)用方感覺(jué)上就是在調(diào)用本地函數(shù)一樣,來(lái)調(diào)用一個(gè)遠(yuǎn)端的服務(wù);讓服務(wù)方就像實(shí)現(xiàn)一個(gè)本地函數(shù)一樣,便捷地提供遠(yuǎn)端服務(wù)。

          序列化與反序列化

          為什么需要序列化?

          需要將對(duì)象等數(shù)據(jù)進(jìn)行二進(jìn)制轉(zhuǎn)儲(chǔ)。

          所謂序列化,是將“對(duì)象”形態(tài)的數(shù)據(jù)轉(zhuǎn)化為“連續(xù)空間二進(jìn)制字節(jié)流”形態(tài)數(shù)據(jù)的過(guò)程。

          如何進(jìn)行序列化?

          如何將一個(gè) class User 的內(nèi)存實(shí)體 u1 轉(zhuǎn)化為二進(jìn)制字節(jié)流?

          • 方案一:自描述

            自描述的標(biāo)記性語(yǔ)言 (XML/JSON),來(lái)進(jìn)行轉(zhuǎn)換。規(guī)定好轉(zhuǎn)換規(guī)則。

          • 方案二:序列化協(xié)議

            序號(hào) | key 長(zhǎng)度 | key 值 | value 長(zhǎng)度 | value 值

          序列化協(xié)議設(shè)計(jì),要考慮什么因素?

          1. 解析效率

          2. 壓縮率,傳輸有效性

          3. 擴(kuò)展性,兼容性

          4. 可讀性,可調(diào)試性

          5. 跨語(yǔ)言

          6. 通用性

          常見(jiàn)的序列化方法(協(xié)議)

          1. xml/json

          2. protobuf

          3. Avro

          4. CORBA

          5. mc_pack

          字節(jié)流發(fā)送 + 字節(jié)流接收

          同步 RPC 系統(tǒng)架構(gòu),核心流程

          RPC-server:IO線(xiàn)程,中間是一個(gè)隊(duì)列,工作線(xiàn)程處理結(jié)果,返回。

          連接池組件

          異步 RPC 系統(tǒng)架構(gòu),核心流程

          調(diào)用方調(diào)用,生成上下文,編程報(bào)文,放入隊(duì)列;調(diào)用結(jié)束

          異步架構(gòu),上下文管理器

          1. 為什么需要上下文管理器?

          2. 如何將請(qǐng)求-響應(yīng)-回調(diào)等信息匹配起來(lái)?

          一條連接,異步請(qǐng)求、響應(yīng)報(bào)文如何匹配? 可以通過(guò)“請(qǐng)求ID”關(guān)聯(lián)!!!

          通過(guò)“請(qǐng)求ID”關(guān)聯(lián) 請(qǐng)求-響應(yīng)-回調(diào)

          異步架構(gòu),超時(shí)管理器

          RPC-Server

          監(jiān)聽(tīng)一個(gè)端口,收發(fā)線(xiàn)程收發(fā)數(shù)據(jù)庫(kù)包,中間一個(gè)包隊(duì)列,工作線(xiàn)程來(lái)處理,整個(gè) RPC-Server 就是一個(gè)比較簡(jiǎn)單的生產(chǎn)者-消費(fèi)者。

          總結(jié)

          1. 什么是 RPC?

            像調(diào)用本地函數(shù)一樣,去調(diào)用一個(gè)遠(yuǎn)端服務(wù)

          2. 為什么需要 RPC 框架?

            用來(lái)屏蔽 rpc 調(diào)用過(guò)程中,跟業(yè)務(wù)代碼無(wú)關(guān)的底層技術(shù)細(xì)節(jié)

          3. 什么是序列化?為什么需要序列化?

            將對(duì)象轉(zhuǎn)換為二進(jìn)制流的過(guò)程

          4. 同步 RPC-Client 的核心組件是什么?

            序列化/反序列化、連接池

          5. 異步 RPC-Client 的核心組件是什么?

            收發(fā)隊(duì)列(用于解耦)、工作線(xiàn)程、上下文管理器

          source:https://www.cnblogs.com/ice-image/p/14554250.html

          喜歡,在看

          瀏覽 36
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  爱爱视频三级 | 亚洲黄在线观看 | 黄色做爱无码字慕 | 午夜成人无码免费视频 | 成人网站大香蕉 |