golang實現(xiàn)簡單rpc調(diào)用過程解析
基本概念
RPC(Remote Procedure Call)遠程過程調(diào)用,簡單的理解是一個節(jié)點請求另一個節(jié)點提供的服務,該協(xié)議允許運行于一臺計算機的程序調(diào)用另一臺計算機的子程序,而程序員無需額外地為這個交互作用編程,RPC最直接的作用就是微服務。
RPC通信過程
RPC的通信過程網(wǎng)上介紹很多,這里就不在單獨介紹了,具體過程如下:
1.Client以本地調(diào)用的方式發(fā)起調(diào)用;
2.Client stub收到調(diào)用后負責將被調(diào)用的方法名、參數(shù)等打包編碼成特定格式成網(wǎng)絡傳輸?shù)南Ⅲw;
3.Client stub將消息體通過網(wǎng)絡發(fā)送給服務端;
4.Server stub收到通過網(wǎng)絡接收到消息后按照相應格式進行拆包解碼,獲取方法名和參數(shù);
5.Server stub根據(jù)方法名和參數(shù)進行本地調(diào)用;
6.被調(diào)用者(Server)本地調(diào)用執(zhí)行后將結(jié)果返回給Server stub;
7.Server stub將返回值打包編碼成消息;
8.通過網(wǎng)絡發(fā)送給Client;
9.Client stub收到消息后,進行拆包解碼,返回給Client;
10.Client得到本次RPC調(diào)用的最終結(jié)果.
RPC 具體實現(xiàn)
server端
package main import ( "net" "net/http" "net/rpc" "strings" ) type EchoUtil struct { } func (echo *EchoUtil) CountString(str string, rsp *int) error { *rsp = strings.Count(str, "s") return nil } func main() { echoUtil := new(EchoUtil) /*將服務對象進行注冊*/ err := rpc.Register(echoUtil) if err != nil { err.Error() } rpc.HandleHTTP() /* 固定端口進行監(jiān)聽*/ listen, err := net.Listen("tcp", ":9999") if err != nil { panic(err.Error()) } http.Serve(listen, nil) }
客戶端
package main import ( "fmt" "net/rpc" ) func main() { cli, err := rpc.DialHTTP("tcp", "localhost:9999") if err != nil { panic(err.Error()) } var resp *int /*采用同步調(diào)用的方式*/ err = cli.Call("EchoUtil.CountString", "this is test", &resp) if err != nil { panic(err.Error()) } fmt.Println(*resp) }
到此這篇關(guān)于golang實現(xiàn)簡單rpc調(diào)用的文章就介紹到這了,更多相關(guān)golang rpc調(diào)用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang編程實現(xiàn)刪除字符串中出現(xiàn)次數(shù)最少字符的方法
這篇文章主要介紹了Golang編程實現(xiàn)刪除字符串中出現(xiàn)次數(shù)最少字符的方法,涉及Go語言字符串遍歷與運算相關(guān)操作技巧,需要的朋友可以參考下2017-01-01Go語言中切片(slice)和數(shù)組(array)的區(qū)別詳解
Go語言中切片(slice)和數(shù)組(array)是兩種不同的數(shù)據(jù)結(jié)構(gòu),它們在用法和行為上有一些重要區(qū)別,所以本文就通過一些代碼示例給大家詳細的介紹一下Go語言中切片(slice)和數(shù)組(array)的區(qū)別,需要的朋友可以參考下2023-09-09