如何在Golang中开发RPC客户端与服务端

来源:前端技术作者:澳门程序员头衔:程序员
导读:本期聚焦于小伙伴创作的《如何在Golang中开发RPC客户端与服务端》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何在Golang中开发RPC客户端与服务端》有用,将其分享出去将是对创作者最好的鼓励。

在Golang中开发RPC客户端与服务端可以借助标准库的net/rpc包实现,该包封装了RPC通信的基础逻辑,开发者只需要按照规范定义服务方法和注册服务即可完成开发。

如何在Golang中开发RPC客户端与服务端

Golang RPC开发的基础要求

使用net/rpc包开发RPC服务时,需要遵循以下几个基础规则,否则服务无法正常注册和调用:

  • 服务方法必须是可导出的,也就是方法名首字母大写
  • 方法需要有两个参数,两个参数都必须是可导出的类型或者内建类型
  • 方法的第二个参数用来接收返回值,必须是指针类型
  • 方法需要返回一个error类型的值

RPC服务端开发步骤

定义服务结构体和方法

首先定义服务对应的结构体,结构体本身不需要包含任何字段,只是作为方法载体,然后定义符合规范的服务方法。

package main

import (
    "net"
    "net/rpc"
)

// 定义服务结构体
type MathService struct{}

// 定义加法请求参数结构体
type AddRequest struct {
    A int
    B int
}

// 定义加法响应结构体
type AddResponse struct {
    Result int
}

// 实现加法方法,符合RPC方法规范
func (m *MathService) Add(req *AddRequest, resp *AddResponse) error {
    resp.Result = req.A + req.B
    return nil
}

注册服务并启动监听

完成服务方法定义后,需要将服务注册到RPC服务中,然后启动网络监听等待客户端连接。

func main() {
    // 注册MathService服务
    err := rpc.Register(&MathService{})
    if err != nil {
        panic("注册服务失败: " + err.Error())
    }
    // 监听TCP端口
    listener, err := net.Listen("tcp", ":1234")
    if err != nil {
        panic("监听端口失败: " + err.Error())
    }
    defer listener.Close()
    // 启动RPC服务,接受客户端连接
    rpc.Accept(listener)
}

RPC客户端开发步骤

客户端需要先与服务端建立连接,然后通过rpc.ClientCall方法调用远程服务。

package main

import (
    "fmt"
    "net/rpc"
)

// 定义与服务端一致的请求参数结构体
type AddRequest struct {
    A int
    B int
}

// 定义与服务端一致的响应结构体
type AddResponse struct {
    Result int
}

func main() {
    // 连接RPC服务端
    client, err := rpc.Dial("tcp", "127.0.0.1:1234")
    if err != nil {
        panic("连接服务端失败: " + err.Error())
    }
    defer client.Close()

    // 构造请求参数
    req := &AddRequest{A: 10, B: 20}
    resp := &AddResponse{}
    // 调用远程Add方法,第一个参数是服务名.方法名
    err = client.Call("MathService.Add", req, resp)
    if err != nil {
        panic("调用服务失败: " + err.Error())
    }
    fmt.Printf("计算结果: %dn", resp.Result)
}

开发注意事项

  • 客户端和服务端的请求、响应结构体字段名称和类型必须完全一致,否则参数解析会出错
  • 如果服务部署在其他机器,需要将连接地址中的127.0.0.1替换为对应的服务器IP
  • RPC默认使用Gob编码,如果需要跨语言调用,可以自定义编码方式,比如替换为JSON编码
  • 生产环境中需要添加超时控制、错误重试等逻辑,提升服务调用的稳定性

常见问题说明

如果调用时出现rpc: can't find method MathService.Add错误,通常是服务没有正确注册,或者方法名拼写错误。如果返回unexpected EOF错误,一般是客户端和服务端的编码方式不匹配,或者网络连接异常。

注意:net/rpc包在Go 1.21版本之后被标记为废弃,官方推荐使用google.golang.org/grpc等第三方RPC框架,但是net/rpc依然可以正常使用,适合简单的内部服务通信场景。

GolangRPC客户端服务端net_rpc修改时间:2026-07-23 01:21:26

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。