rpc基础
- 服务端监听一个端口
nc -l 127.0.0.1 8800 - 往服务器发送数据(返回服务器响应数据)
echo -e '{"method":"hello.HelloWorld","params":["TTTT"],"id":0}' | nc 127.0.0.1 8880
golang 自带rpc通信(gob)
服务端代码
package main
import (
"fmt"
"net"
"net/rpc"
)
type Hello struct {
}
func (h *Hello) HelloWorld(name string, resp *string) error {
*resp = name + name
return nil
}
func RpcHelloServerMain() {
// 1、注册RPC服务,绑定对象方法
err := rpc.RegisterName("hello", new(Hello))
if err != nil {
fmt.Println("register name is err :", err)
return
}
// 2、设置监听
listen, err := net.Listen("tcp", "127.0.0.1:8880")
if err != nil {
fmt.Println("net listen err :", err)
return
}
defer listen.Close()
fmt.Println("start listen")
// 3、建立连接
conn, err := listen.Accept()
if err != nil {
fmt.Println("Accept() err :", err)
return
}
defer conn.Close()
fmt.Println("connected!")
// 4、绑定服务
rpc.ServeConn(conn)
}
客户端代码
package main
import (
"fmt"
"net/rpc"
)
func main() {
// 1、用RPC链接服务器
conn, err := rpc.Dial("tcp", "127.0.0.1:8080")
if err := nil {
fmt.Println("dial localhost:8080 error :", err)
return
}
defer conn.close()
// 2、调用远程函数
var reply string //接收返回值。。。。
err = conn.Call("hello.HelloWorld", "hello world ", &reply)
if err != nil {
fmt.Println("call error:", err)
return
}
fmt.Println(reply)
}
golang 自带jsonrpc通信
jsonrpc服务端代码
package main
import (
"fmt"
"net"
"net/rpc"
"net/rpc/jsonrpc"
)
type Hello struct {
}
func (h *Hello) HelloWorld(name string, resp *string) error {
*resp = name + name
return nil
}
func RpcHelloServerMain() {
// 1、注册RPC服务,绑定对象方法
err := rpc.RegisterName("hello", new(Hello))
if err != nil {
fmt.Println("register name is err :", err)
return
}
// 2、设置监听
listen, err := net.Listen("tcp", "127.0.0.1:8880")
if err != nil {
fmt.Println("net listen err :", err)
return
}
defer listen.Close()
fmt.Println("start listen")
// 3、建立连接
conn, err := listen.Accept()
if err != nil {
fmt.Println("Accept() err :", err)
return
}
defer conn.Close()
fmt.Println("connected!")
// 4、绑定服务
jsonrpc.ServeConn(conn)
}
jsonrpc客户端代码
package main
import (
"fmt"
"net/rpc/jsonrpc"
)
func main() {
// 1、用RPC链接服务器
conn, err := jsonrpc.Dial("tcp", "127.0.0.1:8080")
if err := nil {
fmt.Println("dial localhost:8080 error :", err)
return
}
defer conn.close()
// 2、调用远程函数
var reply string //接收返回值。。。。
err = conn.Call("hello.HelloWorld", "hello world ", &reply)
if err != nil {
fmt.Println("call error:", err)
return
}
fmt.Println(reply)
}
golang 自带jsonrpc通信(封装)
jsonrpc服务端代码(封装)
package main
import (
"fmt"
"net"
"net/rpc"
"net/rpc/jsonrpc"
)
type MyInterface interface {
HelloWorld(string, *string) error
}
type Hello struct {
}
func (h *Hello) HelloWorld(name string, resp *string) error {
*resp = name + name
return nil
}
func RegisterService(i MyInterface) {
rpc.RegisterName("hello", i)
}
func RpcHelloServerMain() {
// 1、注册RPC服务,绑定对象方法
RegisterService(&Hello{})
// 2、设置监听
listen, err := net.Listen("tcp", "127.0.0.1:8880")
if err != nil {
fmt.Println("net listen err :", err)
return
}
defer listen.Close()
fmt.Println("start listen")
// 3、建立连接
conn, err := listen.Accept()
if err != nil {
fmt.Println("Accept() err :", err)
return
}
defer conn.Close()
fmt.Println("connected!")
// 4、绑定服务
jsonrpc.ServeConn(conn)
}
jsonrpc客户端代码(封装)
package main
import (
"fmt"
"net/rpc/jsonrpc"
)
type MyClient struct {
c *rpc.Client
}
func InitClient(addr string) MyClient{
conn, _ := jsonrpc.Dial("tcp", addr)
return MyClient{
c:conn,
}
}
func (this* MyClient) HelleWorld(a string, b *string) error {
// a是传入参数, b 是传出参数
this.c.Call("hello.HelloWorld", a, b)
return nil
}
func main() {
// 1、用RPC链接服务器
client := InitClient("127.0.0.1:8880")
// 2、调用远程函数
var reply string //接收返回值。。。。
client.HelleWorld("lei lei", &reply)
fmt.Println(reply)
}
golang protobuf rpc通信
有疑问加站长微信联系(非本文作者)