章节

17.5 RPC 服务端

本篇学习 net/rpc 服务端的注册与连接处理流程,并能暴露一个基础远程方法。

RPC 服务端

概念说明

RPC 是远程过程调用。
调用方像调用本地方法一样发起请求,底层通过网络把参数传给服务端,再把结果返回给客户端。

Go 标准库提供了 net/rpc
它适合学习 RPC 基础概念,现代项目也常见 gRPC 等更完整的 RPC 框架。

语法/规则

  1. RPC 服务对象通常是导出类型。
  2. 可被调用的方法必须是导出方法。
  3. 方法通常接收两个参数:请求参数和响应指针。
  4. 方法返回值必须是 error
  5. 使用 rpc.Register 注册服务。
  6. 使用 rpc.ServeConn 处理连接。

RPC 服务端示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package main

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

type Args struct {
	A int
	B int
}

type Calculator struct{}

func (Calculator) Add(args Args, reply *int) error {
	*reply = args.A + args.B // 结果通过 reply 指针写回
	return nil
}

func main() {
	err := rpc.Register(Calculator{}) // 注册 RPC 服务对象
	if err != nil {
		panic(err)
	}

	listener, err := net.Listen("tcp", "127.0.0.1:9001")
	if err != nil {
		panic(err)
	}
	defer listener.Close()

	fmt.Println("rpc server listen on 127.0.0.1:9001")
	for {
		conn, err := listener.Accept()
		if err != nil {
			fmt.Println("accept error:", err)
			continue
		}
		go rpc.ServeConn(conn) // 把当前连接交给 RPC 框架处理
	}
}

运行结果:

1
rpc server listen on 127.0.0.1:9001

常见错误

  1. RPC 方法没有导出,客户端无法调用。
  2. 第二个参数不是指针,导致不符合 net/rpc 方法要求。
  3. 方法没有返回 error,注册服务时会失败。
  4. 忘记先启动服务端,客户端连接会失败。
本文禁止转载
使用 Hugo 构建
主题 StackJimmy 设计 由 Hobin 魔改
最近构建时间:2026-04-17 19:07:48 CST
载入天数...载入时分秒...
发表了 1 篇文章 · 发表了 152 篇笔记 · 总计 18 万 0 千字