RPC 程式設計

2021-06-01 07:32:44 字數 3799 閱讀 2399

anupama bindu, 資深軟體工程師, ibm  

srinath karanam, 軟體工程師, ibm  

簡介:使用 rpc 程式設計是在客戶機和伺服器實體之間進行可靠通訊的最強大、最高效的方法之一。它為在分布式計算環境中執行的幾乎所有應用程式提供基礎。本文介紹 rpc 客戶機和伺服器之間基本的事件流,然後討論這些事件的執行時處理。本文按照功能分類介紹不同的例程。

本文的標籤:api, linux, rpc, unix, 應用開發, 編碼, 網路, 通訊

標記本文!

發布日期:2009 年 12 月 24 日

級別:初級

其他語言版本:英文

為本文評分

簡介任何 rpc 客戶機-伺服器程式的重要實體都包括 idl 檔案(介面定義檔案)、客戶機 stub、伺服器 stub 以及由客戶機和伺服器程式共用的標頭檔案。客戶機和伺服器 stub 使用 rpc 執行時庫通訊。rpc 執行時庫提供一套標準的執行時例程來支援 rpc 應用程式。了解執行時例程的內部情況有助於進一步了解 rpc 程式設計。

在一般的應用程式中,被呼叫的過程在相同的位址空間中執行,並把結果返回給發出呼叫的過程。在分布式環境中,客戶機和伺服器在不同的機器上執行,客戶端呼叫在伺服器端執行的過程,並把結果傳送回客戶機。這稱為遠端過程呼叫 (rpc),是 rpc 程式設計的基礎。

使用 rpc 程式設計是在分布式環境中執行的客戶機和伺服器應用程式之間進行可靠通訊的最強大、最高效的方法之一。

圖 1. 基本的 rpc 客戶機-伺服器互動

圖 1 說明客戶機和伺服器通過網路完成 rpc 呼叫的方式。

當客戶機應用程式發出遠端過程呼叫時,在兩端的 rpc 執行時庫的幫助下,客戶機 stub 把與這個呼叫相關的資訊通過網路傳遞給伺服器 stub,見 圖 1。伺服器 stub 把所需的資訊提供給伺服器應用程式。伺服器應用程式執行遠端過程呼叫,然後使用 rpc 執行時庫通過伺服器 stub 把結果傳遞給客戶機 stub。最後,客戶機 stub 把結果返回給客戶機應用程式。stub 作為應用程式和 rpc 執行時之間的介面,以兩者可以理解的格式交換資訊。

在開發客戶機-伺服器應用程式時,客戶機和伺服器首先應該就要交換的過程的宣告和定義達成一致。這就是介面起的作用,介面維護客戶機和伺服器都認可的所有過程宣告和資料型別。

我們把所有共用的宣告和資料型別放在介面定義語言 (idl) 檔案中,客戶機和伺服器將共享這個檔案。我們在 idl 檔案中使用 uuid,以使之在網路上所有其他介面中保持惟一。uuid 是乙個惟一的隨機數,是由 uuidgen 實用程式使用網路位址資訊和系統時間生成的。

圖 2 說明在開發簡單的客戶機-伺服器分布式應用程式時涉及的步驟。

圖 2. 開發 rpc 客戶機-伺服器應用程式

用 idl 編譯器編譯 idl 檔案,生成客戶機和伺服器 stub 物件檔案以及標頭檔案。這個標頭檔案包含共用的定義和過程。stub 檔案在遠端過程呼叫期間作為應用程式和 rpc 執行時庫之間的介面。標頭檔案包含在客戶機和伺服器源**檔案中。用 c 編譯器分別編譯客戶機和伺服器檔案,生成物件檔案。客戶機物件檔案和客戶機 stub 檔案與 rpc 執行時庫鏈結,生成客戶機可執行程式。以相似的方式生成伺服器可執行程式,見圖 2。

本文中的常用術語

繫結向量: 繫結向量是一組引用繫結資訊的繫結控制代碼。

物件 uuid: 除了管理介面的詳細資訊之外,伺服器應用程式還可以管理物件 uuid 引用的資源。與介面一樣,伺服器也可以公布物件 uuid。客戶機應用程式可以只匯入物件 uuid。

入口點向量: rpc 執行時維護乙個協議 id 表以支援與協議相關的開關。它還提供一套與協議的呼叫、繫結、管理和連網方面相關的協議服務。每個服務表示為乙個入口點。在每個入口點中,有一套可以使用的函式。

塔: 這是在名稱服務資料庫中儲存繫結資訊的形式。

協議序列: 協議序列代表 rpc 通訊使用的網路協議。最常用的協議序列是 ncacn_ip_tcp 和 ncadg_ip_udp。

可以看到,每個協議序列中使用三個協議:

圖 3 說明在客戶機和伺服器之間完成 rpc 涉及的步驟。

圖 3. 在客戶機和伺服器之間完成 rpc 涉及的步驟

伺服器 rpc 應用程式初始化期間它會向 rpc 執行時庫註冊介面。需要註冊介面是因為,客戶機在向伺服器發出遠端過程呼叫時,要檢查它是否與伺服器相容。伺服器建立繫結資訊並把資訊儲存在名稱服務資料庫中,客戶機可以訪問這個資料庫並尋找到伺服器的連線資訊。伺服器如果使用動態端點,那麼它把端點資訊放在伺服器系統上的本地端點對映資料庫中。本地端點對映資料庫用於儲存在此主機上執行的 rpc 伺服器程序的所有端點。伺服器啟動,監聽來自客戶機的遠端過程呼叫。

客戶機發出遠端過程呼叫,此時它會聯絡名稱服務資料庫,以尋找伺服器系統的相關資訊。rpc 執行時庫使用這些資訊聯絡伺服器系統上的本地端點對映資料庫,了解伺服器程序在哪個端點上監聽到達的 rpc。

客戶機找到伺服器之後,客戶機 stub 把遠端過程呼叫和引數轉換為伺服器 stub 可以理解的格式,然後交給客戶機執行時,由客戶機執行時通過網路傳輸這些資訊。

伺服器 rpc 執行時庫接收到達的 rpc 呼叫,把它傳遞給伺服器 stub,伺服器 stub 把它轉換為伺服器可以理解的格式。

執行 rpc 呼叫之後,伺服器 stub 和伺服器執行時把結果傳送回客戶機。

客戶機 rpc 執行時接收執行結果,傳遞給客戶機 stub,客戶機 stub 再把它傳遞給客戶機程序。客戶機應用程式從客戶機 stub 接收結果並完成 rpc 呼叫。

本文的其餘部分解釋完成遠端過程呼叫在客戶端和伺服器端上需要使用的例程。

回頁首

伺服器端執行時例程類別

在伺服器上管理介面

本節概述在伺服器應用程式中向 rpc 執行時註冊介面規範和取消註冊的例程。rpc_server_register_if例程用於註冊介面,rpc_server_unregister_if用於取消註冊。

在伺服器上管理協議序列

管理繫結控制代碼

把伺服器匯出到名稱服務

在伺服器上管理端點

監聽 rpc

回頁首

客戶端執行時例程

管理繫結控制代碼

繫結控制代碼是大多數 rpc 執行時例程的基本輸入引數。可以使用繫結控制代碼完成不同的任務,管理這些控制代碼是必需的。可以根據需要把它們轉換和組合為字串格式,解析它們以尋找特定的字段值,使用它們查詢物件的相關資訊,使用它們獲得完整的繫結,複製和釋放它們。

在這個類別中(對於客戶端),有兩個重要的例程:

rpc_binding_to_string_binding  rpc_ep_resolve_binding
通過名稱服務尋找伺服器

名稱服務資料庫是伺服器位置資訊的儲存庫,其中的資訊表示為繫結資訊。客戶機應用程式通常使用名稱服務 rpc 例程:

管理介面資訊

客戶機應用程式使用 rpc 執行時提供的以下例程查詢介面的詳細資訊:

查詢協議序列

回頁首

共用的例程

管理端點對映

所有管理例程都用於了解伺服器的監聽狀態、伺服器的統計資料、註冊的介面列表等等。根據繫結控制代碼在本地或遠端執行這個呼叫。null 繫結控制代碼表示在本地執行呼叫。

管理名稱服務的元素

這包括管理名稱服務條目、組和概要。

回頁首

結束語在本文中,我們討論了任何 rpc 客戶機和伺服器應用程式呼叫的最基本、最重要的例程。還解釋了 rpc 執行時如何實現每個例程的功能。我們希望本文可以幫助讀者更深入地了解 rpc 執行時的工作原理。

RPC 程式設計

簡介 任何 rpc 客戶機 伺服器程式的重要實體都包括 idl 檔案 介面定義檔案 客戶機 stub 伺服器 stub 以及由客戶機和伺服器程式共用的標頭檔案。客戶機和伺服器 stub 使用 rpc 執行時庫通訊。rpc 執行時庫提供一套標準的執行時例程來支援 rpc 應用程式。了解執行時例程的內部...

RPC 程式設計

anupama bindu,資深軟體工程師,ibm srinath karanam,軟體工程師,ibm 簡介 使用 rpc 程式設計是在客戶機和伺服器實體之間進行可靠通訊的最強大 最高效的方法之一。它為在分布式計算環境中執行的幾乎所有應用程式提供基礎。本文介紹 rpc 客戶機和伺服器之間基本的事件流...

RPC 程式設計

簡介 任何 rpc 客戶機 伺服器程式的重要實體都包括 idl 檔案 介面定義檔案 客戶機 stub 伺服器 stub 以及由客戶機和伺服器程式共用的標頭檔案。客戶機和伺服器 stub 使用 rpc 執行時庫通訊。rpc 執行時庫提供一套標準的執行時例程來支援 rpc 應用程式。了解執行時例程的內部...