8.8. RPC-模拟远程过程调用

服务器开发中会使用RPC(Remote Procedure Call,远程过程调用)简化进程间通信的过程。 RPC能有效地封装通信过程,让远程的数据收发通信过程看起来就像本地的函数调用一样。

本例中,使用通道代替Socket实现RPC的过程。 客户端与服务器运行在同一个进程,服务器和客户端在两个goroutine中运行。

package main
import (
    "errors"
    "fmt"
    "time"
)
// 模拟RPC客户端的请求和接收消息封装
func RPCClient(ch chan string, req string) (string, error) {
    // 向服务器发送请求
    ch <- req
    // 等待服务器返回
    select {
    case ack := <-ch: // 接收到服务器返回数据
        return ack, nil
    case <-time.After(time.Second): // 超时
        return "", errors.New("Time out")
    }
}
// 模拟RPC服务器端接收客户端请求和回应
func RPCServer(ch chan string) {
    for {
        // 接收客户端请求
        data := <-ch
        // 打印接收到的数据
        fmt.Println("server received:", data)
        // 反馈给客户端收到
        ch <- "roger"
    }
}
func main() {
    // 创建一个无缓冲字符串通道
    ch := make(chan string)
    // 并发执行服务器逻辑
    go RPCServer(ch)
    // 客户端请求数据和接收数据
    recv, err := RPCClient(ch, "hi")
    if err != nil {
        // 发生错误打印
        fmt.Println(err)
    } else {
        // 正常接收到数据
        fmt.Println("client received", recv)
    }
}

/*
server received: hi
client received roger
 */

参考文献

http://c.biancheng.net/view/102.html