我國首個百萬千瓦級海上風電場併網發電,位於廣東陽江市
阿新 • • 發佈:2021-12-25
1、RPC (Remote Procedure Call) 遠端過程呼叫 (一個節點請求另一個節點提供的服務)
2、對應 RPC 的是本地過程呼叫,函式呼叫是最常見的本地過程呼叫
3、將本地過程呼叫,變成遠端過程呼叫會面臨各種問題
go 內建簡單 rpc 呼叫
server 端
package main import ( "net" "net/rpc" ) type HelleService struct { } func (s * HelleService) Hello (request string, reply * string) error { *reply = "hello" + request return nil } func main() { // 例項化一個 server listener, _ := net.Listen("tcp",":1234") // 註冊處理邏輯 handler _ = rpc.RegisterName("HelloService", &HelleService{}) // 啟動服務 conn,_ := listener.Accept() rpc.ServeConn(conn) }
client 端
package main import ("fmt" "net/rpc" ) func main() { // 建立連線 client, err := rpc.Dial("tcp","localhost:1234") if err != nil { panic("連線錯誤") } var reply string err = client.Call("HelloService.Hello","liang", &reply) if err != nil { panic("呼叫失敗") } fmt.Println(reply) }
替換 rpc 的序列化協議為 json (原 Gob)
server 端
func main() { // 例項化一個 server listener, _ := net.Listen("tcp",":1234") // 註冊處理邏輯 handler _ = rpc.RegisterName("HelloService", &HelleService{}) // 啟動服務 for { conn,_ := listener.Accept() go rpc.ServeCodec(jsonrpc.NewServerCodec(conn)) } }
client 端
func main() { // 建立連線 conn, err := net.Dial("tcp","localhost:1234") if err != nil { panic("連線錯誤") } var reply string client := rpc.NewClientWithCodec(jsonrpc.NewClientCodec(conn)) err = client.Call("HelloService.Hello","liang", &reply) if err != nil { panic("呼叫失敗") } fmt.Println(reply) }
任何語言都能進行 rpc 訪問,如python
替換 rpc 傳輸協議為 http (原 tcp)
server 端
func main() { // 例項化一個 server _ = rpc.RegisterName("HelloService", &HelleService{}) http.HandleFunc("/wahaha",func(w http.ResponseWriter, r *http.Request) { var conn io.ReadWriteCloser = struct { io.Writer io.ReadCloser }{ ReadCloser: r.Body, Writer: w, } rpc.ServeRequest(jsonrpc.NewServerCodec(conn)) }) http.ListenAndServe(":1234",nil) }
測試