Go語言實現RPC程式設計

2022-06-29 13:21:10 字數 2219 閱讀 4026

上節課我們對rpc知識做了介紹,講解了rpc的原理,通過圖示方式講解了rpc的內部執行過程。本節課,我們繼續來學習rpc相關的內容。

在go語言官方**的pkg說明中,提供了官方支援的rpc包,具體鏈結如下:官方提供的rpc包完整的包名是:net/rpc。根據官方的解釋,rpc包主要是提供通過網路訪問乙個物件方法的功能。

本節課,我們就來學習如何使用go語言官方提供的rpc包實現rpc呼叫編碼。

前文我們已經講過rpc呼叫有兩個參與者,分別是:客戶端(client)和伺服器(server)

首先是提供方法暴露的一方--伺服器。

一、服務定義及暴露

在程式設計實現過程中,伺服器端需要註冊結構體物件,然後通過物件所屬的方法暴露給呼叫者,從而提供服務,該方法稱之為輸出方法,此輸出方法可以被遠端呼叫。當然,在定義輸出方法時,能夠被遠端呼叫的方法需要遵循一定的規則。我們通過**進行講解:

func (t *t) methodname(request t1,response *t2) error
上述**是go語言官方給出的對外暴露的服務方法的定義標準,其中包含了主要的幾條規則,分別是:

我們舉例說明:假設目前我們有乙個需求,給出乙個float型別變數,作為圓形的半徑,要求通過rpc呼叫,返回對應的圓形面積。具體的程式設計實現思路如下:

type mathutil struct

//該方法向外暴露:提供計算圓形面積的服務

func (mu *mathutil) calculatecirclearea(req float32, resp *float32) error

在上述的案例中,我們可以看到:

至此為止,已經實現了服務端的功能定義,接下來就是讓服務**生效,需要將服務進行註冊,並啟動請求處理。

二、註冊服務及監聽請求

net/rpc包為我們提供了註冊服務和處理請求的一系列方法,結合本案例實現註冊及處理邏輯,如下所示:

//1、初始化指標資料型別

mathutil := new(mathutil) //初始化指標資料型別

//2、呼叫net/rpc包的功能將服務物件進行註冊

err := rpc.register(mathutil)

if err != nil

//3、通過該函式把mathutil中提供的服務註冊到http協議上,方便呼叫者可以利用http的方式進行資料傳遞

//4、在特定的埠進行監聽

listen, err := net.listen("tcp", ":8081")

if err != nil

go http.serve(listen, nil)

經過服務註冊和監聽處理,rpc呼叫過程中的服務端實現就已經完成了。接下來需要實現的是客戶端請求**的實現。

三、客戶端呼叫

在服務端是通過http的埠監聽方式等待連線的,因此在客戶端就需要通過http連線,首先與服務端實現連線。

多引數的請求呼叫引數傳遞

上述內容演示了單個引數下的rpc呼叫,對於多引數下的請求該如何實現。我們通過另外乙個案例進行演示。

假設現在需要實現另外乙個需求:通過rpc呼叫實現計算兩個數字相加功能並返回計算結果。此時,就需要傳遞兩個引數,具體實現如下:

將引數定義在乙個新的結構體中,存放在param包中:

type addparma struct
在server.go檔案中,實現兩數相加的功能,並實現服務註冊的邏輯:

func (mu *mathutil) add(param param.addparma, resp *float32) error 

mathutil := new(mathutil)

err := rpc.registername("mathutil", mathutil)

if err != nil

listen, err := net.listen("tcp", ":8082")

http.serve(listen, nil)

在本案例中,我們通過新的註冊方法rpc.registername實現了服務的註冊和呼叫。

至此,我們已經完成了net/rpc包的最基礎的使用。

RPC遠端呼叫,go語言實現RPC小Demo

它是一種通過網路從遠端電腦程式上請求服務,而不需要了解底層網路技術的協議。採用客戶機 伺服器模式。請求程式是乙個客戶機 而服務服務提供程式就是乙個伺服器。過程 1.呼叫客戶端控制代碼 執行傳送引數。2.呼叫本地系統核心傳送網路訊息。3.訊息傳送到遠端主機。4.伺服器控制代碼得到訊息並取得引數。5.執...

go網路程式設計 RPC程式設計

remote procedure call,遠端過程呼叫 而一旦踏入公司尤其是大型網際網路公司就會發現,公司的系統都由成千上萬大大小小的服務組成,各服務部署在不同的機器上,由不同的團隊負責。這時就會遇到兩個問題 1 要搭建乙個新服務,免不了需要依賴他人的服務,而現在他人的服務都在遠端,怎麼呼叫?2 ...

Go語言實現Valid Parentheses

write a function called that takes a string of parentheses,and determines if the order of the parentheses is valid.the function should return true if ...