Go語(yǔ)言net包RPC遠(yuǎn)程調(diào)用三種方式http與json-rpc及tcp
rpc有多種調(diào)用方式,http、json-rpc、tcp
一、服務(wù)端
在代碼中,啟動(dòng)了三個(gè)服務(wù)
package main
import (
"log"
"net"
"net/http"
"net/rpc"
"net/rpc/jsonrpc"
"sync"
)
//go對(duì)RPC的支持,支持三個(gè)級(jí)別:TCP、HTTP、JSONRPC
//go的RPC只支持GO開(kāi)發(fā)的服務(wù)器與客戶(hù)端之間的交互,因?yàn)椴捎昧薵ob編碼
//注意字段必須是導(dǎo)出
type Params struct {
Width, Height int
}
type Rect struct{}
//函數(shù)必須是導(dǎo)出的
//必須有兩個(gè)導(dǎo)出類(lèi)型參數(shù)
//第一個(gè)參數(shù)是接收參數(shù)
//第二個(gè)參數(shù)是返回給客戶(hù)端參數(shù),必須是指針類(lèi)型
//函數(shù)還要有一個(gè)返回值error
func (r *Rect) Area(p Params, ret *int) error {
*ret = p.Width * p.Height
return nil
}
func (r *Rect) Perimeter(p Params, ret *int) error {
*ret = (p.Width + p.Height) * 2
return nil
}
func main() {
rect := new(Rect)
//注冊(cè)一個(gè)rect服務(wù)
rpc.Register(rect)
var wg sync.WaitGroup
wg.Add(3)
go func() {
//把服務(wù)處理綁定到http協(xié)議上
rpc.HandleHTTP()
err := http.ListenAndServe(":8080", nil)
wg.Wait()
if err != nil {
log.Fatal(err)
defer wg.Done()
}
}()
log.Println("http rpc service start success addr:8080")
go func() {
tcpaddr, _ := net.ResolveTCPAddr("tcp", "127.0.0.1:8081")
tcplisten, err := net.ListenTCP("tcp", tcpaddr)
if err != nil {
log.Fatal(err)
defer wg.Done()
}
for {
conn, err3 := tcplisten.Accept()
if err3 != nil {
continue
}
go rpc.ServeConn(conn)
}
}()
log.Println("tcp rpc service start success addr:8081")
go func() {
tcpaddr, _ := net.ResolveTCPAddr("tcp", "127.0.0.1:8082")
tcplisten, err := net.ListenTCP("tcp", tcpaddr)
if err != nil {
log.Fatal(err)
defer wg.Done()
}
for {
conn, err3 := tcplisten.Accept()
if err3 != nil {
continue
}
go jsonrpc.ServeConn(conn)
}
}()
log.Println("tcp json-rpc service start success addr:8082")
wg.Wait()
}
二、http客戶(hù)端
package main
import (
"net/rpc"
"log"
"fmt"
)
type Params struct {
Width, Height int
}
func main() {
//連接遠(yuǎn)程rpc服務(wù)
rpc, err := rpc.DialHTTP("tcp", "127.0.0.1:8080")
if err != nil {
log.Fatal(err)
}
ret := 0;
//調(diào)用遠(yuǎn)程方法
//注意第三個(gè)參數(shù)是指針類(lèi)型
err2 := rpc.Call("Rect.Area", Params{50, 100}, &ret)
if err2 != nil {
log.Fatal(err2)
}
fmt.Println(ret)
err3 := rpc.Call("Rect.Perimeter", Params{50, 100}, &ret)
if err3 != nil {
log.Fatal(err3)
}
fmt.Println(ret)
}
三、TCP客戶(hù)端
package main
import (
"net/rpc"
"fmt"
"log"
)
type Params struct {
Width, Height int
}
func main() {
//連接遠(yuǎn)程rpc服務(wù)
//這里使用Dial,http方式使用DialHTTP,其他代碼都一樣
rpc, err := rpc.Dial("tcp", "127.0.0.1:8081")
if err != nil {
log.Fatal(err)
}
ret := 0
//調(diào)用遠(yuǎn)程方法
//注意第三個(gè)參數(shù)是指針類(lèi)型
err2 := rpc.Call("Rect.Area", Params{50, 100}, &ret)
if err2 != nil {
log.Fatal(err2)
}
fmt.Println(ret)
err3 := rpc.Call("Rect.Perimeter", Params{50, 100}, &ret)
if err3 != nil {
log.Fatal(err3)
}
fmt.Println(ret)
}
四、json客戶(hù)端
package main
import (
"fmt"
"log"
"net/rpc/jsonrpc"
)
type Params struct {
Width, Height int
}
func main() {
//連接遠(yuǎn)程rpc服務(wù)
rpc, err := jsonrpc.Dial("tcp", "127.0.0.1:8082")
if err != nil {
log.Fatal(err)
}
ret := 0
//調(diào)用遠(yuǎn)程方法
//注意第三個(gè)參數(shù)是指針類(lèi)型
err2 := rpc.Call("Rect.Area", Params{150, 100}, &ret)
if err2 != nil {
log.Fatal(err2)
}
fmt.Println(ret)
err3 := rpc.Call("Rect.Perimeter", Params{150, 100}, &ret)
if err3 != nil {
log.Fatal(err3)
}
fmt.Println(ret)
}
五、運(yùn)行結(jié)果




以上就是Go語(yǔ)言net包RPC遠(yuǎn)程調(diào)用三種方式http與json-rpc及tcp的詳細(xì)內(nèi)容,更多關(guān)于Go語(yǔ)言net包RPC遠(yuǎn)程調(diào)用方式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
手把手教你vscode配置golang開(kāi)發(fā)環(huán)境的步驟
這篇文章主要介紹了手把手教你vscode配置golang開(kāi)發(fā)環(huán)境的步驟,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
一文帶你使用golang手?jǐn)]一個(gè)websocket中間件
這篇文章主要為大家詳細(xì)介紹了如何使用golang手?jǐn)]一個(gè)websocket中間件,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以參考一下2023-12-12
服務(wù)器端Go程序?qū)﹂L(zhǎng)短鏈接的處理及運(yùn)行參數(shù)的保存
這篇文章主要介紹了服務(wù)器端Go程序?qū)﹂L(zhǎng)短鏈接的處理及運(yùn)行參數(shù)的保存,這里針對(duì)使用Go語(yǔ)言編寫(xiě)的Socket服務(wù)器進(jìn)行實(shí)例說(shuō)明,需要的朋友可以參考下2016-03-03
Go 語(yǔ)言 JSON 標(biāo)準(zhǔn)庫(kù)的使用
今天通過(guò)本文給大家介紹Go 語(yǔ)言 JSON 標(biāo)準(zhǔn)庫(kù)的使用小結(jié),包括序列化和反序列化的相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧2021-10-10
獲取Golang環(huán)境變量的三種方式小結(jié)
本文介紹了Golang中獲取環(huán)境變量的三種方式,包含使用Viper包、GoDotEnv包和os包,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-11-11

