RPC框架 | 青训营笔记

72 阅读2分钟

RPC框架

RPC(Remote Procedure Call,远程过程调用)是一种计算机通信协议,它允许客户端程序通过网络调用服务端程序中定义的过程或方法。这种方式使客户端程序就像本地程序一样,可以轻易地调用远程服务,极大地简化了分布式系统的开发。Go语言提供了内置的RPC框架——net/rpc包和net/rpc/jsonrpc包。

其中,net/rpc 提供了传统的二进制协议,支持Go语言内置的数据类型;而 net/rpc/jsonrpc 基于JSON数据格式,支持跨语言的互操作性,可用于与其它语言实现的RPC服务通信。

使用RPC框架的基本步骤如下:

1.定义一个结构体作为RPC服务的对象,该结构体中包含具体的函数或方法,并添加net/rpc中的方法标签。

type SimpleMath struct{}

func (s *SimpleMath) Add(args *Args, reply *int) error {
    *reply = args.A + args.B
    return nil
}

2.注册RPC服务对象,并开始监听客户端请求。

// 注册RPC服务对象
simpleMath := new(SimpleMath)
rpc.Register(simpleMath)

// 只监听TCP链接,127.0.0.1:1234为监听地址
listener, err := net.Listen("tcp", "127.0.0.1:1234")
if err != nil {
    log.Fatal("ListenTCP error:", err)
}

// 循环等待客户端请求
for {
    conn, err := listener.Accept()
    if err != nil {
        log.Fatal("Accept error:", err)
    }
    go rpc.ServeConn(conn)
}

3.客户端调用RPC服务并获取结果。

client, err := rpc.Dial("tcp", "127.0.0.1:1234")
if err != nil {
    log.Fatal("DialTCP error:", err)
}

args := &Args{A: 1, B: 2}
var reply int
err = client.Call("SimpleMath.Add", args, &reply)
if err != nil {
    log.Fatal("Error:", err)
}
fmt.Printf("SimpleMath.Add:ddd\n", args.A, args.B, reply)

上述代码演示了如何使用 Go语言内置的 net/rpc 包实现RPC服务的定义及调用。其中,服务端注册了一个 SimpleMath 结构体作为RPC服务对象,并在其上注册了 Add 方法;客户端则通过 rpc.Dial 方法连接到RPC服务并调用 Add 方法,实现了远程过程调用。

除了 net/rpc 包,Go语言还提供了其它第三方RPC框架,比如gorilla、gRPC等。不同的框架在功能、性能、易用性等方面有所区别,可根据具体需求选择。

总结

RPC的好处在于:

1.函数职责单一,有利于分工协作和运维开发;

2.可扩展性强,可以独立扩充资源,资源使用率更优秀;

3.故障隔离,单个服务故障不影响整体,服务的整体可用性更高。