<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # RPC,第 1 部分:遠程過程調用簡介 > 原文:<https://github.com/angrave/SystemProgramming/wiki/RPC%2C-Part-1%3A-Introduction-to-Remote-Procedure-Calls> ## 什么是 RPC? 遠程過程調用。 RPC 是我們可以在不同的機器上執行過程(函數)的想法。在實踐中,該過程可以在同一臺機器上執行,但是它可以在不同的上下文中 - 例如在具有不同權限和不同生命周期的不同用戶下。 ## 什么是特權分離? 遠程代碼將在不同的用戶下執行,并具有來自調用者的不同權限。實際上,遠程呼叫可以以比呼叫者更多或更少的特權執行。這原則上可用于提高系統的安全性(通過確保組件以最小特權運行)。遺憾的是,需要仔細評估安全問題,以確保不會破壞 RPC 機制來執行不需要的操作。例如,RPC 實現可以隱式地信任任何連接的客戶端來執行任何操作,而不是對數據子集的操作子集。 ## 什么是存根代碼?什么是編組? 存根代碼是隱藏執行遠程過程調用的復雜性的必要代碼。存根代碼的作用之一是 _ 將 _ 必要的數據編組成可以作為字節流發送到遠程服務器的格式。 ```c // On the outside 'getHiscore' looks like a normal function call // On the inside the stub code performs all of the work to send and receive the data to and from the remote machine. int getHiscore(char* game) { // Marshall the request into a sequence of bytes: char* buffer; asprintf(&buffer,"getHiscore(%s)!", name); // Send down the wire (we do not send the zero byte; the '!' signifies the end of the message) write(fd, buffer, strlen(buffer) ); // Wait for the server to send a response ssize_t bytesread = read(fd, buffer, sizeof(buffer)); // Example: unmarshal the bytes received back from text into an int buffer[bytesread] = 0; // Turn the result into a C string int score= atoi(buffer); free(buffer); return score; } ``` ## 什么是服務器存根代碼?什么是解組? 服務器存根代碼將接收請求,將請求解組為有效的內存數據調用底層實現,并將結果發送回調用方。 ## 你怎么發送 int?浮動?結構?鏈表?圖表? 要實現 RPC,您需要決定(并記錄)將用于將數據序列化為字節序列的約定。即使是簡單的整數也有幾種常見的選擇: * 簽名還是未簽名? * ASCII * 固定的字節數或變量取決于幅度 * 小端或大端二進制格式? 要編組結構,請確定需要序列化哪些字段。可能沒有必要發送所有數據項(例如,某些項可能與特定 RPC 無關,或者可以由服務器從存在的其他數據項重新計算)。 要編組鏈表,不必發送鏈接指針 - 只是流式傳輸值。作為解組的一部分,服務器可以從字節序列重新創建鏈表結構。 通過從頭節點/頂點開始,可以遞歸地訪問簡單樹以創建數據的序列化版本。循環圖通常需要額外的內存來確保每個邊和頂點只處理一次。 ## 什么是 IDL(接口設計語言)? 手動編寫存根代碼是痛苦的,乏味的,容易出錯的,難以維護的,并且難以從實現的代碼中對線協議進行反向工程。更好的方法是指定數據對象,消息和服務,并自動生成客戶端和服務器代碼。 接口設計語言的一個現代示例是 Google 的 Protocol Buffer .proto 文件。 ## RPC 與本地呼叫的復雜性和挑戰? 遠程過程調用明顯較慢(10x 到 100x)并且比本地調用更復雜。 RPC 必須將數據編組為與線路兼容的格式。這可能需要多次通過數據結構,臨時存儲器分配和數據表示的轉換。 強大的 RPC 存根代碼必須智能地處理網絡故障和版本控制。例如,服務器可能必須處理來自仍在運行存根代碼的早期版本的客戶端的請求。 安全 RPC 需要實現額外的安全檢查(包括身份驗證和授權),驗證數據并加密客戶端和主機之間的通信。 ## 傳輸大量結構化數據 我們來看看三種使用 3 種不同格式傳輸數據的方法--JSON,XML 和 Google Protocol Buffers。 JSON 和 XML 是基于文本的協議。下面是 JSON 和 XML 消息的示例。 ```text-xml <ticket><price currency='dollar'>10</price><vendor>travelocity</vendor></ticket> ``` ```source-js { 'currency':'dollar' , 'vendor':'travelocity', 'price':'10' } ``` Google Protocol Buffers 是一種開源高效的二進制協議,強調高吞吐量,低 CPU 開銷和最小內存復制。存在多種語言的實現,包括 Go,Python,C ++和 C.這意味著可以從.proto 規范文件生成多種語言的客戶端和服務器存根代碼,以便將數據與二進制流進行編組。 Google Protocol Buffers 通過忽略消息中存在的未知字段來減少版本控制問題。有關更多信息,請參閱協議緩沖區簡介。 [https://developers.google.com/protocol-buffers/docs/overview](https://developers.google.com/protocol-buffers/docs/overview)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看