jsonrpc

定义rpc方法:

  1. type DemoService struct{}
  2. type Args struct {
  3. A, B int
  4. }
  5. // go要求的RPC调用方法必须为两个参数:一个args, 一个result。返回error
  6. func (DemoService) Div(args Args, result *float64) error {
  7. if args.B == 0 {
  8. return errors.New("division by zero")
  9. }
  10. *result = float64(args.A) / float64(args.B)
  11. return nil
  12. }

server

  1. func main() {
  2. // 登记rpc接收方的方法
  3. rpc.Register(rpcdemo.DemoService{})
  4. // 创建一个tcp socket来监听1234端口,该端口用来监听rpc请求
  5. listener, err := net.Listen("tcp", ":1234")
  6. if err != nil {
  7. panic(err)
  8. }
  9. defer listener.Close()
  10. for {
  11. // 接收rpc
  12. conn, err := listener.Accept()
  13. if err != nil {
  14. log.Printf("accept error: %v", err)
  15. continue
  16. }
  17. // 处理当前rpc
  18. go jsonrpc.ServeConn(conn)
  19. }
  20. }

client

  1. func main() {
  2. // 建立tcp连接
  3. conn, err := net.Dial("tcp", ":1234")
  4. if err != nil {
  5. panic(err)
  6. }
  7. client := jsonrpc.NewClient(conn)
  8. var result float64
  9. err = client.Call("DemoService.Div", rpcdemo.Args{10, 3}, &result)
  10. if err != nil {
  11. fmt.Println(err)
  12. } else {
  13. fmt.Println(result)
  14. }
  15. err = client.Call("DemoService.Div", rpcdemo.Args{10, 0}, &result)
  16. if err != nil {
  17. fmt.Println(err)
  18. } else {
  19. fmt.Println(result)
  20. }
  21. }

rpc序列化和反序列化

image.png