RPC是什么?
在分布式计算,远程过程调用(英语:Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一个地址空间(通常为一个开放网络的一台计算机)的子程序,而程序员就像调用本地程序一样,无需额外地为这个交互作用编程(无需关注细节)。RPC是一种服务器-客户端(Client/Server)模式,经典实现是一个通过发送请求-接受回应进行信息交互的系统。
编写Server端代码
package main
import(
"math"
"net/rpc"
"net"
"net/http"
)
type MathNum struct{
}
//求圆面积
func (m *MathNum) Computed (req float32,resp *float32)error{
*resp = math.Pi * req * req
return nil
}
func main(){
//初始化指针数据类型
num := new(MathNum)
//调用net/rpc包对服务对象进行注册
err := rpc.Register(num)
if err != nil {
panic(err.Error())
}
//通过该函数将MathNum所提供对服务注册到http协议上,方便调用者利用http到方式进行数据传输
rpc.HandleHTTP()
//在指定端口进行监听
listen,err:= net.Listen("tcp",":8006")
if err != nil {
panic(err.Error())
}
http.Serve(listen,nil)
}
编写Client端代码
package main
import(
"net/rpc"
"fmt"
)
func main(){
client,err := rpc.DialHTTP("tcp","localhost:8006")
if err != nil {
panic(err.Error())
}
var req float32
req = 2
//同步调用
// var resp *float32
// err = client.Call("MathNum.Computed",req,&resp)
// if err != nil {
// panic(err.Error())
// }
// fmt.Println(*resp)
//异步调用
var asyncResp *float32
async := client.Go("MathNum.Computed",req,&asyncResp,nil)
replay := <-async.Done
fmt.Println(replay)
fmt.Println(*asyncResp)
}
tips:
需要先将server端启动,client端才能正常运行