golang官方rpc包的使用

2021-09-19 06:04:34 字數 2555 閱讀 7993

rpc(remote rrocedure call,遠端過程呼叫)是乙個計算機通訊協議。rpc協議假定某些傳輸協議的存在,如tcpudp,為通訊程式之間攜帶資訊資料。在osi網路通訊模型中,rpc跨越了傳輸層和應用層。

rpc採用c/s模式,請求程式就是乙個客戶機,而服務提供程式就是乙個伺服器。首先,客戶機呼叫程序傳送乙個有程序引數的呼叫資訊到服務程序,然後等待應答資訊。在伺服器端,程序保持睡眠狀態直到呼叫資訊到達為止。當乙個呼叫資訊到達,伺服器獲得程序引數,計算結果,傳送答覆資訊,然後等待下乙個呼叫資訊,最後,客戶端呼叫程序接受答覆資訊,獲得程序結果,然後呼叫執行繼續進行。

rpc是分布式系統中不同節點之間流行的通訊方式,go語言的rpc包路徑在net目錄下。下面的例子演示golang官方的net/rpc庫實現的rpc方法。

package main

import (

"fmt"

"net"

"net/rpc"

)typs s struct {}

type reply struct

func (s *s) recv(nul *struct{}, reply *reply) error

return nil

}func main()

listen, err := net.listen("tcp", "127.0.0.1:2015")

if err != nil

defer listen.close()

rpc.accept(listen)

}

首先需要將你的服務發布,也就是註冊乙個rpc服務。rpc.register函式呼叫會將物件型別中所有滿足rpc規則的物件方法註冊為rpc函式,所有註冊的方法會放在傳入物件的服務空間之下。

func register(rcvr inte***ce{}) error 

/*來看defaultserver上的register介面,它會在伺服器中發布滿足以下條件的接收器的方法集:

匯出型別的匯出方法;

兩個引數,且都是可匯出型別;

第二個引數是乙個指標;

乙個返回值,型別是error */

//客戶端在獲取每個方法時,傳入的引數形式為"type.method",其中type是接收者的具體型別。

func (server *server) register(rcvr inte***ce{}) error

接著需要監聽你發布的服務,等待請求的到來。network接受的型別必須是tcptcp4tcp6unix或者unixpacket

func listen(network, address string) (listener, error)
accept接受***上連線,並為每個傳入連線向defaultserver提供請求。

func accept(lis net.listener)
package main

import (

"fmt"

"net/rpc"

)type reply struct

func main()

var reply reply

err = client.call("s.recv", &struct{}{}, &reply)

if err != nil

fmt.println("reply:", string(reply.msg))

client.close()

}

首先需要連線伺服器,使用dial方法,建立乙個唯一的tcp連線。

func dial(network, address string) (*client, error) 

return newclient(conn), nil

}

call會呼叫指定的函式,即在tcp連線上,服務端為客戶端提供rpc服務,客戶端會一直等待完成,然後返回錯誤狀態。

func (client *client) call(servicemethod string, args inte***ce{}, reply inte***ce{}) error
go介面會非同步呼叫servicemethod的方法,呼叫完成後,會返回相同的call物件。完成的通道將會在呼叫完成時發出訊號,如果未完成,將分配乙個新的通道。如果非nil,那麼必須緩衝完成。

參考文章

rpchttp和rpc的優缺點

golang中的rpc包用法

rpc,即 remote procedure call 遠端過程呼叫 說得通俗一點就是 呼叫遠端計算機上的服務,就像呼叫本地服務一樣。我所在公司的專案是採用基於restful的微服務架構,隨著微服務之間的溝通越來越頻繁,就希望可以做成用rpc來做內部的通訊,對外依然用restful。於是就想到了go...

Go標準包RPC的使用

package main import errors fmt net net rpc rpc服務端 實現兩個rpc介面 1.計算除數和被除數兩個數的乘積,返回乘積結果 2.計算除數和被除數兩個數的除法結果,返回商和餘數 請求引數結構體 type requestparam struct 乘積計算結果直...

Golang實現自己的RPC框架

rpc session.go package rpc import encoding binary io net 編寫資料會話中讀寫 會話連線的結構體 type session struct 建立新連線 func newsession conn net.conn session 向連線中寫資料 fu...