demo結(jié)構(gòu)如下怀浆,基于標(biāo)準(zhǔn)庫構(gòu)建
rpc.png
測試:
啟動(dòng)server端
go run server/server.go
客戶端調(diào)用
go run client/client.go
client.go
package main
import (
"fmt"
"net/rpc"
"rpc/consts"
"rpc/params"
)
// 客戶端調(diào)用
func main() {
client, err := rpc.DialHTTP("tcp", consts.Address)
if err != nil {
panic(err.Error())
}
req := params.Req{
Radius: 3,
Desc: "我的圓",
}
var resp *params.Rep
err = client.Call("MathUtil.CalculateCircleArea", req, &resp)
if err != nil {
panic(err.Error())
}
// rcp resp {28.274334 [我的圓]的半徑為:3.000000夸楣,其面積為:28.274334}
fmt.Println("rcp resp", *resp)
}
consts.go
package consts
const Address = "127.0.0.1:8082"
params.go
package params
// 請求參數(shù)
type Req struct {
Radius float32
Desc string
}
// 響應(yīng)參數(shù)
type Rep struct {
Area float32
Desc string
}
server.go
package main
import (
"fmt"
"math"
"net"
"net/http"
"net/rpc"
"rpc/consts"
"rpc/params"
)
type MathUtil struct{
}
//該方法向外暴露:提供計(jì)算圓形面積的服務(wù)
func (mu *MathUtil) CalculateCircleArea(req params.Req, resp *params.Rep) error {
resp.Area = math.Pi * req.Radius * req.Radius //圓形的面積 s = π * r * r
resp.Desc = fmt.Sprintf("[%s]的半徑為:%f,其面積為:%f", req.Desc, req.Radius, resp.Area)
return nil //返回類型
}
func main() {
//1、初始化指針數(shù)據(jù)類型
mathUtil := new(MathUtil) //初始化指針數(shù)據(jù)類型
//2呀洲、調(diào)用net/rpc包的功能將服務(wù)對象進(jìn)行注冊
err := rpc.Register(mathUtil)
if err != nil {
panic(err.Error())
}
//3审胸、通過該函數(shù)把mathUtil中提供的服務(wù)注冊到HTTP協(xié)議上,方便調(diào)用者可以利用http的方式進(jìn)行數(shù)據(jù)傳遞
rpc.HandleHTTP()
//4利凑、在特定的端口進(jìn)行監(jiān)聽
listen, err := net.Listen("tcp", consts.Address)
if err != nil {
panic(err.Error())
}
fmt.Println("rpc tcp in " + consts.Address)
http.Serve(listen, nil)
}
go.mod
module rpc
go 1.17