Golang使用RPC实现程序远程调用详解

 更新时间:2026年03月15日 09:57:45   作者:我叫黑大帅  
RPC 让你在写代码时,调用另一台远程机器上的函数,就像调用本地的函数一样简单,下面小编就和大家详细介绍一下Golang如何使用RPC实现程序远程调用吧

net/rpc 则是为了让两个 Go 程序之间直接对话

RPC 让你在写代码时,调用另一台远程机器上的函数,就像调用本地的函数一样简单。

Go 标准库中的 net/rpc 目前处于冻结状态(不再增加新功能)。在现代的实际工程中,大家通常会使用 gRPCKratos 等更强大的框架。

RPC 的核心规则

net/rpc 要求你的函数必须遵守特定的签名格式,才能被远程调用。

  • 方法所属的类型必须是导出的(首字母大写)。
  • 方法本身必须是导出的(首字母大写)。
  • 方法必须有两个参数,且都必须是导出类型或内置类型。
  • 方法的第二个参数必须是指针(因为服务器要把结果写回这个指针里)。
  • 方法必须返回一个 error 类型。
func (t *T) MethodName(args T1, reply *T2) error

常用 API

服务端 API

  • rpc.Register(rcvr any): 将你的结构体注册为 RPC 服务。结构体名默认就是服务名。
  • rpc.HandleHTTP(): 如果你想让 RPC 走 HTTP 协议,调用这个注册路由。
  • rpc.Accept(lis net.Listener): 如果你想走纯 TCP 协议,用这个接收连接。

客户端 API

  • rpc.Dial(network, address string): 连接远程 RPC 服务器(比如传 "tcp", "localhost:1234")。
  • rpc.DialHTTP(network, address string): 连接走 HTTP 协议的 RPC 服务器。
  • client.Call(serviceMethod string, args any, reply any): 同步调用远程函数。程序会在这里等待结果返回。

实例:实现一个远程乘法计算器

提供方

package main

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

// 1. 定义传入的参数结构体
type Args struct {
	A, B int
}

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

// 3. 实现服务方法(严格遵守 5 条规则)
func (m *MathService) Multiply(args Args, reply *int) error {
	*reply = args.A * args.B
	fmt.Printf("服务端执行:计算 %d * %d\n", args.A, args.B)
	return nil
}

func main() {
	// 实例化服务
	math := new(MathService)

	// 注册 RPC 服务,客户端就可以通过 "MathService.Multiply" 来调用了
	rpc.Register(math)

	// 启动 TCP 监听
	listener, err := net.Listen("tcp", ":1234")
	if err != nil {
		panic(err)
	}
	fmt.Println("RPC 服务端已启动,监听端口 1234...")

	// 接收请求并处理
	rpc.Accept(listener)
}

调用方

package main

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

// 客户端 需要定义一样的参数结构体
type Args struct {
	A, B int
}

func main() {
	// 1. 拨号连接 RPC 服务器
	client, err := rpc.Dial("tcp", "localhost:1234")
	if err != nil {
		log.Fatal("拨号失败:", err)
	}
	defer client.Close()

	// 2. 准备参数和接收结果的变量
	args := Args{A: 10, B: 20}
	var reply int

	// 3. 发起调用! 第一个参数是 "结构体名.方法名"
	err = client.Call("MathService.Multiply", args, &reply)
	if err != nil {
		log.Fatal("调用失败:", err)
	}

	fmt.Printf("调用成功!结果是: %d\n", reply)
}

到此这篇关于Golang使用RPC实现程序远程调用详解的文章就介绍到这了,更多相关Go RPC远程调用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Golang中json和jsoniter的区别使用示例

    Golang中json和jsoniter的区别使用示例

    这篇文章主要介绍了Golang中json和jsoniter的区别使用示例,本文给大家分享两种区别,结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2023-12-12
  • GoLang 中的随机数的示例代码

    GoLang 中的随机数的示例代码

    本篇文章主要介绍了GoLang 中的随机数的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • 一文详解Go语言中对象池的正确打开方式

    一文详解Go语言中对象池的正确打开方式

    对象池是一种设计模式,它维护一组已经创建好的对象,当需要使用对象时,直接从对象池中获取,使用完毕后再放回对象池,而不是频繁地创建和销毁对象,下面我们就来看看Go语言中对象池的具体使用吧
    2025-02-02
  • 基于Golang实现Redis协议解析器

    基于Golang实现Redis协议解析器

    这篇文章主要为大家详细介绍了如何通过GO语言编写简单的Redis协议解析器,文中的示例代码讲解详细,对我们深入了解Go语言有一定的帮助,需要的可以参考一下
    2023-03-03
  • golang中time包之时间间隔格式化和秒、毫秒、纳秒等时间戳格式输出的方法实例

    golang中time包之时间间隔格式化和秒、毫秒、纳秒等时间戳格式输出的方法实例

    时间和日期是我们编程中经常会用到的,下面这篇文章主要给大家介绍了关于golang中time包之时间间隔格式化和秒、毫秒、纳秒等时间戳格式输出的方法实例,需要的朋友可以参考下
    2022-08-08
  • Go语言实现RSA加解密算法详解

    Go语言实现RSA加解密算法详解

    随着互联网的高速发展,人们对安全的要求也越来越高,加解密也变得越来越重要,本文主要为大家介绍了Go语言中实现RSA加解密与签名验证算法,希望对大家有所帮助
    2023-06-06
  • go语言实现聊天服务器的示例代码

    go语言实现聊天服务器的示例代码

    这篇文章主要介绍了go语言实现聊天服务器的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • Go简单实现协程池的实现示例

    Go简单实现协程池的实现示例

    本文主要介绍了Go简单实现协程池的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Go基础教程系列之defer、panic和recover详解

    Go基础教程系列之defer、panic和recover详解

    这篇文章主要介绍了Go基础教程系列之defer、panic和recover,需要的朋友可以参考下
    2022-04-04
  • Golang实践之Error创建和处理详解

    Golang实践之Error创建和处理详解

    在 C#、Java 等语言中常常使用 try...catch的方式来捕获异常,但是在Golang 对于错误处理有不同的方式,像网上也有很多对 error 处理的最佳实践的文章,其中很多其实就是对 error 的统一封装,使用规范进行约束,本文主要是记录自己对处理 Error 的一些认识和学习
    2023-09-09

最新评论