golang实现简单rpc调用
Posted 神技圈子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang实现简单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)
以上是关于golang实现简单rpc调用的主要内容,如果未能解决你的问题,请参考以下文章