Go微服务

编程 · 02-27 · 371 人浏览

RPC协议

Remote Procedure Call Protocol,远程过程调用协议,IPC是进程间通信,RPC是远程进程通信。

服务端和客户端编码实现

服务端:

package main

import (
  "fmt"
  "net"
  "net/rpc"
)

// 定义类对象
type World struct {
}

// 绑定类方法
func (this *World) SayHello(name string, resp *string) error {
  *resp = name + " 你好!"
  return nil
}

func main() {
  // 1. 注册RPC服务,绑定对象方法
  err := rpc.RegisterName("hello", new(World))
  if err != nil {
    fmt.Println("注册RPC服务失败:", err)
    return
  }

  // 2. 创建RPC服务器,监听端口
  listen, err := net.Listen("tcp", "127.0.0.1:8080")
  if err != nil {
    fmt.Println("net.Listen err:", err)
  }
  defer listen.Close()
  fmt.Println("开始监听...")

  // 3. 建立连接
  conn, err := listen.Accept()
  if err != nil {
    fmt.Println("Accept err:", err)
  }
  defer conn.Close()
  fmt.Println("连接成功...")

  // 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 err:", err)
    return
  }
  defer conn.Close()

  // 2. 调用远程函数
  var reply string
  err = conn.Call("hello.SayHello", "张三", &reply)
  if err != nil {
    fmt.Println("Call err:", err)
    return
  }

  fmt.Println("Reply:", reply)
}

JSON版RPC

修改服务端代码:jsonrpc.ServeConn(conn)

修改客户端代码:conn, err := jsonrpc.Dial("tcp", "127.0.0.1:8080")

Go
Theme Jasmine by Kent Liao