rpc遠端過程呼叫設計分析
rpc 的全稱是 remote procedure call 是一種程序間通訊方式。 它允許程式呼叫另乙個位址空間(通常是共享網路的另一台機器上)的過程或函式,而不用程式設計師顯式編碼這個遠端呼叫的細節。即程式設計師無論是呼叫本地的還是遠端的函式,本質上編寫的呼叫**基本相同。
①、客戶端client發起服務呼叫請求。
②、client stub 可以理解成乙個**,會將呼叫方法、引數按照一定格式進行封裝,通過服務提供的位址,發起 網路請求。
③、訊息通過網路傳輸到服務端。
④、server stub接受來自socket的訊息
⑤、server stub將訊息進行解包、告訴服務端呼叫的哪個服務,引數是什麼
⑥、結果返回給server stub。
⑦、sever stub把結果進行打包交給socket
⑧、socket通過網路傳輸訊息
⑨、client slub 從socket拿到訊息。
⑩、client stub解包訊息將結果返回給client。
乙個rpc框架就是把步驟2到9都封裝起來。
rpc 的主要目標是讓構建分布式計算(應用)更容易,在提供強大的遠端呼叫能力時不損失本地呼叫的語義簡潔性。 為實現該目標,rpc 框架需提供一種透明呼叫機制讓使用者不必顯式的區分本地呼叫和遠端呼叫。
rpc 呼叫分以下兩種:
非同步和同步的區分在於是否等待服務端執行完成並返回結果。
開發rpc應用系統一般分為三個步驟:
開發客戶端和伺服器端的程式時,rpc提供了我們不同層次的開發例程呼叫介面。不同層次的介面提供了對rpc不同程度控制。一般可分為5個等級的程式設計介面 :
1、簡單層例程
簡單層是面向普通rpc應用,為了快速開發rpc應用服務而設計的,提供了如下功能函式。
函式名功能描述
rpc_reg( )
在一特定型別的傳輸層上註冊某個過程,來作為提供服務的 rpc 程式
rpc_call( )
遠端呼叫在指定主機上指定的過程
rpc_broadcast( )
向指定型別的所有傳輸埠上廣播乙個遠端過程呼叫請求
2、高層例程
在這一層,程式需要在發出呼叫請求前先建立乙個客戶端控制代碼,或是在偵聽請求前先建立乙個伺服器端控制代碼。程式在該層可以自由的將自己的應用綁在所有的傳輸埠上,它提供了如下功能函式。
函式名功能描述
client *clnt_create (char * host ,unsigned long prog ,unsigned long vers ,char * proto );
通用客戶端建立例程 , host標識伺服器所在的遠端主機的名稱。proto表示使用哪種傳輸協議。此欄位當前支援的值為「udp」和「tcp」 。 使用udp有其缺點。由於基於udp的rpc訊息最多只能容納8 kb的編碼資料,因此該傳輸不能用於需要大引數或返回大量結果的過程。
clnt_create_timed( )
定義每次嘗試連線的超時最大時間
svc_create( )
在指定型別的傳輸埠上建立伺服器控制代碼,告訴底層 rpc 事件過程的相應入口位址
clnt_call ( )
向伺服器端發出乙個 rpc 呼叫請求
3、中間層例程
中間層向程式提供更為詳細的rpc控制介面,而這一層的**變得更為複雜,但執行也更為有效,它提供了如下功能函式。
函式名功能描述
clnt_tp_create( )
在指定的傳輸埠上建立客戶端控制代碼
clnt_tp_create_timed( )
定義最大傳輸時延
svc_tp_creaet( )
在指定的傳輸埠上建立服務控制代碼
clnt_call( )
向伺服器端發出 rpc 呼叫請求
4、專家層例程
函式名功能描述
clnt_tli_create( )
在指定的傳輸埠上建立客戶端控制代碼
svc_tli_create( )
在指定的傳輸埠上建立服務控制代碼
rpcb_set( )
通過呼叫 rpcbind 將 rpc 服務和網路位址做對映
rpcb_unset( )
刪除 rpcb_set( ) 所建的對映關係
rpcb_getaddr( )
呼叫 rpcbind 來犯會指定 rpc 服務所對應的傳輸位址
svc_reg( )
將指定的程式和版本號與相應的時間例程建起關聯
svc_ureg( )
刪除有 svc_reg( ) 所建的關聯
clnt_call( )
客戶端向指定的伺服器端發起 rpc 請求
5、底層例程
該層提供了所有對傳輸選項進行控制的呼叫介面,它提供了如下功能函式。
函式名功能描述
clnt_dg_create( )
採用無連線方式向遠端過程在客戶端建立客戶控制代碼
svc_dg_create( )
採用無連線方式建立服務控制代碼
clnt_vc_create( )
採用面向連線的方式建立客戶控制代碼
svc_vc_create( )
採用面向連線的方式建立 rpc 服務控制代碼
clnt_call( )
客戶端向伺服器端傳送呼叫請求
test.h
#include
#ifndef _test_h_rpcgen
#define _test_h_rpcgen
#ifdef __cplusplus
extern
"c"#endif
#endif
/* !_test_h_rpcgen */
client.c#include
"test.h"
void
testprog_1
(char
*host)
#endif
/* debug */
result_1 =
test_1
(&test_1_arg, clnt);if
(result_1 ==
(char**
)null)if
(strcmp
(*result_1,
"error")==
0)printf
("收到訊息 ... %s/n"
,*result_1)
;#ifndef debug
clnt_destroy (clnt)
;#endif
/* debug */
}int main (
int argc,
char
*ar**)
host = ar**[1]
; testprog_1 (host)
; exit (0)
;}
server.c#include
#include
"test.h"
char**
test_1_svc
(char
**argp,
struct svc_req *rqstp)
sprintf
(tmp_char,
"伺服器當前時間是 :%s"
,ctime
(&rawtime));
result = tmp_char;
return
&result;
}
ime;
if ( time(&rawtime) == ((time_t)-1) )
sprintf(tmp_char, "伺服器當前時間是 :%s", ctime(&rawtime));
result = tmp_char;
return &result;
遠端過程呼叫 RPC
rpc是遠端過程呼叫 remote procedure call 的縮寫。就是一台伺服器上的服務通過引數傳遞的方式呼叫另一台服 務器的服務,並獲取返回結果。比如有兩台伺服器a b,a上的服務想要呼叫b上的函式或方法,由於不在同乙個記憶體空間,不能直接呼叫,需要通過網路來表達呼叫的語義和傳達呼叫的資料...
RPC遠端過程呼叫
1.rpc 1.1 rpc remote procedure call 遠端過程呼叫.遠端過程指的是不是同乙個程序。1.2 rpc至少有兩個過程。呼叫方 client 被呼叫方 server 1.3 client主動發起請求,呼叫指定ip和port的server中的方法,把呼叫結果返回給client...
遠端過程呼叫RPC
1 可以夠跨多種開發工具及平台,比如說企業已有的系統開發完畢或者子系統已經部署交付了,它提供了rpc介面,新的子系統要整合,使用業界通用的rpc介面就可以整合了,你不可能要求原來的開發商再來修改一遍介面,否則的話就變成了資訊孤島。2 能夠跨多個伺服器,這個在其他計算機上很容易透過80埠的rpc來訪問...