- RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求
服务,而不需要了解底层网络技术的协议。 - 简单来说,就是跟远程访问或者web请求差不多,都是一个client向远端服务器请求服务返回结果,但是web请求
使用的网络协议是http高层协议,而rpc所使用的协议多为TCP,是网络层协议,减少了信息的包装,加快了处理速
度。 - golang本身有rpc包,可以方便的使用,来构建自己的rpc服务,下边是一个简单是实例,可以加深我们的理解
1.调用客户端句柄;执行传送参数
2.调用本地系统内核发送网络消息
3.消息传送到远程主机
4.服务器句柄得到消息并取得参数
5.执行远程过程
6.执行的过程将结果返回服务器句柄
7.服务器句柄返回结果,调用远程系统内核
8.消息传回本地主机
9.客户句柄由内核接收消息
10.客户接收句柄返回的数据
服务端代码编写
package main
import (
"fmt"
"io"
"net"
"net/http"
"net/rpc"
)
func helloHttp(w http.ResponseWriter, r *http.Request) {
_, _ = io.WriteString(w, "hello go web !")
}
type Panda int
//函数关键字(对象) 函数名(对端发送过来的内容,返回给对端的内容) 错误返回值
func (panda *Panda) GetInfo(argType int, replyType *int) error {
fmt.Println("打印对方发送过来的内容:", argType)
//修改对端内容值并返回
*replyType = argType + 123
return nil
}
func main() {
//页面的请求
http.HandleFunc("/hello", helloHttp)
pd := new(Panda)
rpc.Register(pd)
rpc.HandleHTTP()
ln, err := net.Listen("tcp", ":80")
if err != nil {
fmt.Println("网络错误")
}
_ = http.Serve(ln, nil)
}
客户端代码编写
package main
import (
"fmt"
"net/rpc"
)
func main() {
//建立网络链接
cli, err := rpc.DialHTTP("tcp", "127.0.0.1:80")
if err != nil {
fmt.Println("网络链接失败")
return
}
var pd int
pd = 100
cli.Call("Panda.GetInfo", pd, &pd)
fmt.Println("接收到返回消息:", pd)
}
运行结果: