使用golang的net/rpc构建rpc服务的关键步骤是:1. 定义符合func (t t) methodname(args args, reply *reply) error签名的服务方法;2. 服务端通过rpc.register注册服务实例并监听tcp连接,使用rpc.serveconn处理每个连接;3. 客户端通过rpc.dial连接服务端,并使用client.call同步调用或client.go异步调用远程方法;4. 注意数据结构和字段需导出、方法名和服务名需匹配;5. 在分布式应用中需自行实现超时控制、服务发现、负载均衡和错误处理机制;6. 可通过rpc.handlehttp将rpc服务绑定到http上,便于调试和监控。该方案适用于go语言内部服务通信,若需跨语言或高级功能应选用grpc。

用 Golang 的
net/rpc
net/rpc
下面从零讲清楚如何使用
net/rpc
一个完整的 RPC 系统包含两个部分:
立即学习“go语言免费学习笔记(深入)”;
net/rpc
func (t *T) MethodName(args *Args, reply *Reply) error
其中:
error
假设我们要实现一个简单的算术服务,支持加法。
// service/arithmetic.go
package service
type Args struct {
A, B int
}
type Arith int
func (t *Arith) Add(args *Args, reply *int) error {
*reply = args.A + args.B
return nil
}这个
Add
net/rpc
服务端需要注册服务并监听 TCP 端口。
// server/main.go
package main
import (
"log"
"net"
"net/rpc"
"your-module/service"
)
func main() {
arith := new(service.Arith)
// 注册服务
err := rpc.Register(arith)
if err != nil {
log.Fatal("Register error:", err)
}
// 监听端口
listener, err := net.Listen("tcp", ":1234")
if err != nil {
log.Fatal("Listen error:", err)
}
defer listener.Close()
log.Println("RPC server running on :1234...")
// 接受客户端连接
for {
conn, err := listener.Accept()
if err != nil {
log.Println("Accept error:", err)
continue
}
// 为每个连接启动一个 RPC 服务
go rpc.ServeConn(conn)
}
}注意:rpc.ServeConn 是阻塞的,所以要用 go 启动协程处理每个连接。
客户端连接服务端,调用远程方法。
// client/main.go
package main
import (
"fmt"
"log"
"net/rpc"
"your-module/service"
)
func main() {
// 连接服务端
client, err := rpc.Dial("tcp", "localhost:1234")
if err != nil {
log.Fatal("Dial error:", err)
}
defer client.Close()
// 准备参数
args := &service.Args{A: 7, B: 8}
var reply int
// 同步调用
err = client.Call("Arith.Add", args, &reply)
if err != nil {
log.Fatal("Call error:", err)
}
fmt.Printf("Result: %d\n", reply) // 输出: 15
}"Arith.Add"
client.Call
net/rpc
call := client.Go("Arith.Add", args, &reply, nil)
// 做其他事...
<-call.Done // 等待完成
if call.Error != nil {
log.Fatal("Async call error:", call.Error)
}
fmt.Printf("Async result: %d\n", reply)虽然
net/rpc
编码格式:默认使用 Go 的
gob
服务发现:
net/rpc
负载均衡:客户端需自己维护多个服务端地址,实现简单的轮询或随机选择。
超时控制:标准库不支持调用超时,可通过
DialTimeout
select + channel
client, err := rpc.DialTimeout("tcp", "localhost:1234", 3*time.Second)错误处理:网络异常、序列化失败、服务未注册等都要有兜底逻辑。
并发安全:服务对象的方法要保证并发安全(如涉及共享状态)。
net/rpc
// 服务端修改部分
rpc.HandleHTTP() // 自动注册到 /rpc 和 /debug/rpc
log.Fatal(http.ListenAndServe(":1234", nil))然后客户端可以通过 HTTP 连接:
client, err := rpc.DialHTTP("tcp", "localhost:1234")同时访问
http://localhost:1234/debug/rpc
使用
net/rpc
Dial
Call
Go
虽然
net/rpc
基本上就这些,不复杂但容易忽略细节。
以上就是Golang实现RPC服务怎么做 使用net/rpc构建分布式系统的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号