什么是RPC

  • Remote Procedure Call,远程调用另外一台服务器上面的一个函数;
  • 是一种协议,Rest API,Web Service都属于RPC

RPC架构

  • sever端
    • Listener
    • ServerNames、Method
    • Register
  • customer端
    • Conn
    • Call

示例

package rpc

type HelloService struct{}

func (p *HelloService) Hello(request string, replay *string) error {
	*replay = "hello" + request
	return nil
}

Server

package rpc

import (
	"log"
	"net"
	"net/rpc"
	"testing"
)

func TestServerStart(t *testing.T) {
	_ = rpc.RegisterName("HelloService", new(HelloService))

	listener, err := net.Listen("tcp", ":1234")
	if err != nil {
		log.Fatal(err)
	}

	conn, err := listener.Accept()
	if err != nil {
		log.Fatal(err)
	}

	rpc.ServeConn(conn)
}

Customer

package rpc

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

func TestCustomer(t *testing.T) {
	client, err := rpc.Dial("tcp4", ":1234")

	if err != nil {
		t.Error(err)
	}

	var replay string
	if err := client.Call("HelloService.Hello", " world", &replay); err != nil {
		t.Error(err)
	}

	fmt.Println(replay)
}

说明

  • go里面的rpc函数方法必须是两个入参,第二个入参是指针对象,返回一个error;这是由于go内置的rpc实现