server端,提供远程计算服务:
package main
import "context"
import "github.com/smallnest/rpcx/server"
type Args struct {
A int
B int
}
type Reply struct {
C int
}
type Arith int
func (t *Arith) Mul(ctx context.Context, args *Args, reply *Reply) error {
reply.C = args.A * args.B
return nil
}
func main() {
s := server.NewServer()
s.RegisterName("Arith", new(Arith), "") //注册服务函数
s.Serve("tcp", ":8972")
}
客户端,请求计算服务:
package main
import (
"context"
"flag"
"log"
"time"
"github.com/smallnest/rpcx/client"
)
type Args struct {
A int
B int
}
type Reply struct {
C int
}
type Arith int
var (
addr = flag.String("addr", "localhost:8972", "server address")
)
func main() {
flag.Parse()
d := client.NewPeer2PeerDiscovery("tcp@"+*addr, "")
xclient := client.NewXClient("Arith", client.Failtry, client.RandomSelect, d, client.DefaultOption)
defer xclient.Close()
args := &Args{
A: 10,
B: 20,
}
for {
reply := &Reply{}
err := xclient.Call(context.Background(), "Mul", args, reply) //请求服务函数
if err != nil {
log.Fatalf("failed to call: %v", err)
}
log.Printf("%d * %d = %d", args.A, args.B, reply.C)
time.Sleep(1e9)
}
}
更多细节请参考:
https://smallnest.gitbooks.io/go-rpc-programming-guide/content/