上節課我們對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 ...