golang使用net/rpc庫(kù)實(shí)現(xiàn)rpc
項(xiàng)目左側(cè)包結(jié)構(gòu)

rpc服務(wù)端實(shí)現(xiàn)
使用golang官方的net/rpc庫(kù)實(shí)現(xiàn)RPC方法,使用http作為RPC的載體,通過http/net包監(jiān)聽客戶端連接請(qǐng)求。
rpc服務(wù)端實(shí)現(xiàn)代碼serverrpc.go如下
package main
import (
"errors"
"fmt"
"log"
"net"
"net/http"
"net/rpc"
"os"
)
// 運(yùn)算結(jié)構(gòu)體
type Arith struct {
}
// 運(yùn)算請(qǐng)求結(jié)構(gòu)體
type ArithRequest struct {
A int
B int
}
// 運(yùn)算響應(yīng)結(jié)構(gòu)體
type ArithResponse struct {
Pro int //product 表示乘積
Quo int //quotient 表示商
Rem int //remaind 表示余數(shù)
}
/*
運(yùn)算結(jié)構(gòu)體的乘法運(yùn)算方法
第一個(gè)參數(shù)只需要拿到其里面的值只需要傳一個(gè)結(jié)構(gòu)體即可,
第二個(gè)參數(shù)需要將運(yùn)算結(jié)果存到其里面所以需要傳地址
*/
func (this *Arith) Multiply(req ArithRequest, res *ArithResponse) error {
res.Pro = req.A * req.B
return nil
}
/*
運(yùn)算結(jié)構(gòu)體的除法運(yùn)算方法
第一個(gè)參數(shù)只需要拿到其里面的值只需要傳一個(gè)結(jié)構(gòu)體即可,
第二個(gè)參數(shù)需要將運(yùn)算結(jié)果存到其里面所以需要傳地址
*/
func (this *Arith) Divide(req ArithRequest, res *ArithResponse) error {
if req.B == 0 { //除法為0,運(yùn)算不合法
return errors.New("divide by zero")
}
res.Quo = req.A / req.B
res.Rem = req.A % req.B
return nil
}
func main() {
rpc.Register(new(Arith)) //注冊(cè)rpc服務(wù)
rpc.HandleHTTP() //采用http作為rpc的載體
lis, err := net.Listen("tcp", "127.0.0.1:8090") //Listen是block(阻塞的)
if err != nil {
log.Fatalln("fatal error:", err)
}
fmt.Fprintf(os.Stdout, "%s", "start connection")
http.Serve(lis, nil) //net.Listen是阻塞的,需要通過這里進(jìn)行啟動(dòng)
}rpc客戶端實(shí)現(xiàn)
上述服務(wù)端程序運(yùn)行之后,將會(huì)監(jiān)聽本地的8090端口,我們可以實(shí)現(xiàn)一個(gè)客戶端程序,連接服務(wù)端并且實(shí)現(xiàn)RPC方法調(diào)用。
rpc客戶端實(shí)現(xiàn)代碼clientrpc.go如下
package main
import (
"fmt"
"log"
"net/rpc"
)
// 算數(shù)運(yùn)算請(qǐng)求結(jié)構(gòu)體
type ArithRequest struct {
A int
B int
}
// 算數(shù)運(yùn)算響應(yīng)結(jié)構(gòu)體
type ArithResponse struct {
Pro int //product 乘積
Quo int //quotient 商
Rem int //remain 余數(shù)
}
func main() {
//通過網(wǎng)絡(luò)實(shí)現(xiàn)rpc遠(yuǎn)程進(jìn)程調(diào)用
conn, err := rpc.DialHTTP("tcp", "127.0.0.1:8090")
if err != nil {
log.Fatalln("dailing error", err)
}
req := ArithRequest{9, 2} //請(qǐng)求結(jié)構(gòu)體
var res ArithResponse //響應(yīng)結(jié)構(gòu)體,用于存儲(chǔ)運(yùn)算結(jié)果
//實(shí)現(xiàn)rpc之后,通過Call方法在客戶端調(diào)用服務(wù)端里面算數(shù)運(yùn)算結(jié)構(gòu)體的乘法運(yùn)算方法
err = conn.Call("Arith.Multiply", req, &res)
if err != nil {
log.Fatalln("arith error", err)
}
fmt.Printf("%d * %d = %d\n", req.A, req.B, res.Pro)
//實(shí)現(xiàn)rpc之后,通過Call方法在客戶端調(diào)用服務(wù)端里面算數(shù)運(yùn)算結(jié)構(gòu)體的除法運(yùn)算方法
err = conn.Call("Arith.Divide", req, &res)
if err != nil {
log.Fatalln("arith error", err)
}
fmt.Printf("%d / %d, quo is %d, rem is %d\n", req.A, req.B, res.Quo, res.Rem)
}詳細(xì)實(shí)現(xiàn)步驟
1.首先初始化項(xiàng)目
go mod init pro01 //pro01表示項(xiàng)目名稱
2.在當(dāng)前項(xiàng)目下新建包server,并且在該包下面新建serverrpc.go實(shí)現(xiàn)rpc服務(wù)端
3.在當(dāng)前項(xiàng)目下新建包c(diǎn)lient,并且在該包下面新建clientrpc.go實(shí)現(xiàn)rpc客戶端
4.運(yùn)行rpc服務(wù)端程序 ,首先進(jìn)入server包,然后運(yùn)行serverrpc.go
cd server
go run serverrpc.go
5.運(yùn)行rpc客戶端程序,首先進(jìn)入client包,然后運(yùn)行clientrpc.go
cd client
go run clientrpc.go
6.查看輸出結(jié)果是否正確,輸出結(jié)果如下表示程序運(yùn)行結(jié)果正確,當(dāng)然我這里的結(jié)果是根據(jù)我在請(qǐng)求結(jié)構(gòu)體里面給出的倆個(gè)數(shù)值進(jìn)行計(jì)算的,具體結(jié)果是否正確根據(jù)自己的具體程序判斷。

總結(jié)
通過官方庫(kù)net/rpc實(shí)現(xiàn)rpc遠(yuǎn)程進(jìn)程調(diào)用非常方便,并且實(shí)現(xiàn)還是比較簡(jiǎn)單的,但是有一個(gè)缺點(diǎn)就是不能跨平臺(tái)。
到此這篇關(guān)于golang使用net/rpc庫(kù)實(shí)現(xiàn)rpc的文章就介紹到這了,更多相關(guān)go rpc內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go實(shí)現(xiàn)簡(jiǎn)易R(shí)PC框架的方法步驟
本文旨在講述 RPC 框架設(shè)計(jì)中的幾個(gè)核心問題及其解決方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-03-03
Sublime Text3安裝Go語(yǔ)言相關(guān)插件gosublime時(shí)搜不到gosublime的解決方法
本文主要介紹了Sublime Text3安裝Go語(yǔ)言相關(guān)插件gosublime時(shí)搜不到gosublime的解決方法,具有一定的參考價(jià)值,感興趣的可以了解一下2022-01-01
go單例實(shí)現(xiàn)雙重檢測(cè)是否安全的示例代碼
這篇文章主要介紹了go單例實(shí)現(xiàn)雙重檢測(cè)是否安全,本文給大家分享雙重檢驗(yàn)示例代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
Go?json自定義Unmarshal避免判斷nil示例詳解
這篇文章主要為大家介紹了Go?json自定義Unmarshal避免判斷nil示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
使用Go語(yǔ)言實(shí)現(xiàn)微信公眾平臺(tái)
這篇文章主要介紹了使用Go語(yǔ)言實(shí)現(xiàn)微信公眾平臺(tái),雖然不是全部代碼,但是也是給我們提供了一個(gè)非常好的思路,需要的朋友可以參考下2015-01-01
Go標(biāo)準(zhǔn)庫(kù)-ServeMux的使用與模式匹配深入探究
這篇文章主要為大家介紹了Go標(biāo)準(zhǔn)庫(kù)-ServeMux的使用與模式匹配深入探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01

