NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
# RPC ## 简介 远程过程调用(Remote Procedure Call,RPC)是一个计算机通信协议; 该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外为这个交互作用编程; 如果涉及的软件采用面向对象编程,那么远程过程调用亦可成为远程调用或远程方法调用 ## Golang中实现RPC Golang中实现RPC非常简单,官方提供了封装好的库,还有一些第三方的库,官方的net/rpc库使用encoding/gob进行编码,所以Golang的RPC只支持Golang开发的服务器和客户端之间交互。 官方还提供了net/rpc/jsonrpc库来实现RPC方法,jsonrpc采用了JSON进行数据编码解码,因而支持跨语言调用,目前jsonrpc库是基于tcp协议实现的,暂不支持http传输方式。 Golang的RPC必须符合四个条件才可以: 结构体首字母必须大写,要跨域访问,所以大写 函数名首字母必须大写 函数第一个参数是接收参数,第二个参数是返回个客户端的参数,必须是指针类型 函数有一个返回值error ## 示例 #### 服务器 实现求矩形面积和周长 ```go package main import ( "fmt" "net/http" "net/rpc" ) type Rect struct { } type Params struct { Width int Height int } // 求面积 func (r *Rect)Area(p Params, ret *int) error { *ret = p.Width * p.Height return nil } // 求周长 func (r *Rect)Perimeter(p Params, ret *int) error { *ret = (p.Width + p.Height) * 2 return nil } func main() { rect := new(Rect) rpc.Register(rect) rpc.HandleHTTP() if err := http.ListenAndServe(":8080", nil); err != nil { fmt.Println(err) } } ``` ### 客户端 ```go package main import ( "fmt" "log" "net/rpc" ) type Params struct { Width int Height int } func main() { client, err := rpc.DialHTTP("tcp", "127.0.0.1:8080") if err != nil { fmt.Println(err) return } var ret int if err = client.Call("Rect.Area", Params{Width: 4, Height: 5}, &ret); err != nil { log.Fatal(err) } fmt.Println("area:", ret) if err = client.Call("Rect.Perimeter", Params{Width: 4, Height: 5}, &ret); err != nil { log.Fatal(err) } fmt.Println("Perimeter:", ret) } ``` ## 运行结果 分别运行服务器和客户端 ``` area: 20 Perimeter: 18 ```