golang实现简单rpc调用过程解析
时间:2022-06-16 09:47:48|栏目:Golang|点击: 次
基本概念
RPC(Remote Procedure Call)远程过程调用,简单的理解是一个节点请求另一个节点提供的服务,该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程,RPC最直接的作用就是微服务。
RPC通信过程
RPC的通信过程网上介绍很多,这里就不在单独介绍了,具体过程如下:
1.Client以本地调用的方式发起调用;
2.Client stub收到调用后负责将被调用的方法名、参数等打包编码成特定格式成网络传输的消息体;
3.Client stub将消息体通过网络发送给服务端;
4.Server stub收到通过网络接收到消息后按照相应格式进行拆包解码,获取方法名和参数;
5.Server stub根据方法名和参数进行本地调用;
6.被调用者(Server)本地调用执行后将结果返回给Server stub;
7.Server stub将返回值打包编码成消息;
8.通过网络发送给Client;
9.Client stub收到消息后,进行拆包解码,返回给Client;
10.Client得到本次RPC调用的最终结果.
RPC 具体实现
server端
package main import ( "net" "net/http" "net/rpc" "strings" ) type EchoUtil struct { } func (echo *EchoUtil) CountString(str string, rsp *int) error { *rsp = strings.Count(str, "s") return nil } func main() { echoUtil := new(EchoUtil) /*将服务对象进行注册*/ err := rpc.Register(echoUtil) if err != nil { err.Error() } rpc.HandleHTTP() /* 固定端口进行监听*/ listen, err := net.Listen("tcp", ":9999") if err != nil { panic(err.Error()) } http.Serve(listen, nil) }
客户端
package main import ( "fmt" "net/rpc" ) func main() { cli, err := rpc.DialHTTP("tcp", "localhost:9999") if err != nil { panic(err.Error()) } var resp *int /*采用同步调用的方式*/ err = cli.Call("EchoUtil.CountString", "this is test", &resp) if err != nil { panic(err.Error()) } fmt.Println(*resp) }