Golang实现RPC
net/rpc库
server:
package main
import (
"fmt"
"log"
"net/http"
"net/rpc"
)
//net/rpc库使用encoding/gob进行编解码,只支持golang调用
type Params struct {
Name string
}
type Love struct {
}
//函数名首字母大写
//第一个参数为接收参数,第二个参数是返回结果,必须是指针类型
//函数结果必须返回一个error
func (l *Love) Confession(p Params, result *string) error {
*result = "I love you, " + p.Name
return nil
}
func main() {
//注册服务
love := new(Love)
rpc.Register(love)
//绑定http协议
rpc.HandleHTTP()
//监听服务
fmt.Println("开始监听8888端口...")
err := http.ListenAndServe(":8888", nil)
if err != nil {
log.Fatal(err)
}
}
client:
package main
import (
"fmt"
"log"
"net/rpc"
)
type Params struct {
Name string
}
func main() {
//连接远程rpc服务
conn, err := rpc.DialHTTP("tcp", ":8888")
if err != nil {
log.Fatal(err)
}
//调用方法
result := ""
err = conn.Call("Love.Confession", Params{"BaoBao"}, &result)
if err != nil {
log.Fatal(err)
}
fmt.Println(result)
}
net/rpc/jsonrpc库
server:
package main
import (
"fmt"
"log"
"net"
"net/rpc"
"net/rpc/jsonrpc"
)
//net/rpc/jsonrpc库通过json格式编解码,支持跨语言调用
type Params struct {
Name string
}
type Love struct {
}
//函数名首字母大写
//第一个参数为接收参数,第二个参数是返回结果,必须是指针类型
//函数结果必须返回一个error
func (l *Love) Confession(p Params, result *string) error {
*result = "I love you, " + p.Name
return nil
}
func main() {
//注册服务
love := new(Love)
rpc.Register(love)
//监听服务
fmt.Println("开始监听8888端口...")
lis, err := net.Listen("tcp", ":8888")
if err != nil {
log.Fatal(err)
}
for {
//等待客户端请求
conn, err := lis.Accept()
if err != nil {
continue
}
go func(conn net.Conn) {
fmt.Println("new client request")
jsonrpc.ServeConn(conn)
}(conn)
}
}
client:
package main
import (
"fmt"
"log"
"net/rpc/jsonrpc"
)
type Params struct {
Name string
}
func main() {
//连接远程jsonrpc服务
conn, err := jsonrpc.Dial("tcp", ":8888")
if err != nil {
log.Fatal(err)
}
//调用方法
result := ""
err = conn.Call("Love.Confession", Params{"BaoBao"}, &result)
if err != nil {
log.Fatal(err)
}
fmt.Println(result)
}
公众号:李田路口