更多個人筆記:(僅供參考,非盈利)
gitee: https://gitee.com/harryhack/it_note
github: https://github.com/ZHLOVEYY/IT_note
文章目錄
- rpc基礎概念
- GO的rpc應用
- 簡單編寫
- json編寫rpc
rpc基礎概念
電商系統迅速發展后,有很多服務需要拆分,比如用戶服務,商品服務,支付服務,訂單服務,售后服務等 這些服務之間的相互調用就需要使用rpc
rpc框架:
服務注冊中心:負責本地服務發布為遠程服務,管理提供給消費者
消費者:通過遠程代理對象調用遠程服務
服務提供者:提供接口和相關服務
rpc框架可以跨語言,協議私密,傳輸效率也很高
GO的rpc應用
官方的net/rpc包對于方法有定義要求符合:
func (t *T) MethodName (argType T1, replyType *T2) error
其中T,T1,T2需要被encoding/gob包序列化(就是說不同編碼器都需要適用)
第一個參數是調用者需要傳遞的參數
第二個是會以字符串方式返回的結果
簡單編寫
服務端: go run server.go運行就行
package mainimport ("fmt""net/http""net/rpc"
)type Args struct { //定義傳入參數結構X, Y int
}type Algorithm int //就是一個輔助的定義func (t *Algorithm) Sum(args *Args, reply *int) error { //定義方法*reply = args.X + args.Yfmt.Println("Exec Sum ", reply)return nil
}func main() {algorithm := new(Algorithm) //分配內存空間指針同時分配內存初始化為0值fmt.Println("algorithm start", algorithm)//注冊服務rpc.Register(algorithm)rpc.HandleHTTP() //將 RPC 服務掛載到 HTTP 服務器err := http.ListenAndServe(":8081", nil)if err != nil {fmt.Println("err=====", err.Error())}
}
- 定義傳入的結構體參數
- 為了調用方法,定義相關結構體承載
- 實例化對應的承載結構體
- 注冊服務,并注冊到HTTP上
- 啟動端口監聽
客戶端: 終端開啟運行 go run xxx.go 1 2
(后面的1和2是制定的參數傳入)
package mainimport ("fmt""log""net/rpc""os""strconv"
)type Args struct { //定義傳入參數結構X, Y int
}type Algorithm int //就是一個輔助的定義func (t *Algorithm) Sum(args *Args, reply *int) error {*reply = args.X + args.Yfmt.Println("Exec Sum ", reply)return nil
}func main() {//連接服務器client, err := rpc.DialHTTP("tcp", "127.0.0.1:8081")if err != nil {log.Fatal("dailHTTP發生錯誤", err)}//獲取第一個輸入i1, _ := strconv.Atoi(os.Args[1])//獲取第二個輸入i2, _ := strconv.Atoi(os.Args[2])args := Args{i1, i2}var reply int//調用遠程方法err = client.Call("Algorithm.Sum", args, &reply) //調用對應的方法if err!= nil {log.Fatal("調用遠程方法發生錯誤", err)}fmt.Printf("Arith: %d+%d=%d\n", args.X, args.Y, reply)
}
- 連接對應的服務
- 輸入,組成結構體
- 通過Call 調用對應的方法并進行傳遞
json編寫rpc
- 標準 RPC:主要用于 Go 程序之間通信,用Gob進行二進制編碼
- JSON-RPC:適合跨語言通信(因為 JSON 是通用格式),用json進行編碼
jsonrpc更加通用,,二者的實際使用其實就是啟動方式時函數調用上的區別,先不重復展開