当前位置: 首页 > news >正文

golang学习笔记27——golang 实现 RPC 模块

  • 推荐学习文档
    • golang应用级os框架,欢迎star
    • golang应用级os框架使用案例,欢迎star
    • 案例:基于golang开发的一款超有个性的旅游计划app经历
    • golang实战大纲
    • golang优秀开发常用开源库汇总
    • 想学习更多golang知识,这里有免费的golang学习笔记专栏

文章目录

    • 引言
    • Go 中 RPC 的基础知识
      • 1.RPC 服务端
      • 2.RPC 客户端
    • 代码示例
      • 1.定义 RPC 服务
      • 2.实现 RPC 客户端
    • 使用 JSON-RPC
    • 总结

引言

RPC(Remote Procedure Call)远程过程调用,它允许不同的进程在网络上进行通信,就像调用本地函数一样。在 Go 语言中,实现 RPC 模块相对简洁且高效。本文将详细介绍在 Go 语言中如何实现 RPC 模块。

Go 中 RPC 的基础知识

Go 标准库中的net/rpc包提供了对 RPC 的基本支持。

1.RPC 服务端

在服务端,我们需要定义一个对象,该对象的方法可以被远程调用。这些方法必须满足特定的规则:它们必须是公开的方法(首字母大写),并且必须有两个参数,第一个参数是接收请求的结构体指针,第二个参数是用于返回结果的结构体指针。

2.RPC 客户端

客户端可以像调用本地方法一样调用远程服务端的方法,只需要通过rpc.Dial建立连接后调用Call方法即可。

代码示例

1.定义 RPC 服务

首先,我们定义一个简单的服务,用于执行数学运算。

package mainimport ("errors""net/http""net/rpc"
)// Args 用于传递请求参数
type Args struct {A, B int
}// MathService 数学运算服务
type MathService struct{}// Add 加法运算
func (m *MathService) Add(args *Args, reply *int) error {if args == nil {return errors.New("invalid arguments")}*reply = args.A + args.Breturn nil
}func main() {// 注册服务mathService := new(MathService)rpc.Register(mathService)// 开启 HTTP 服务rpc.HandleHTTP()err := http.ListenAndServe(":1234", nil)if err!= nil {panic(err)}
}

在上述代码中,我们定义了一个MathService结构体,其中Add方法用于执行加法运算。这个方法接收一个Args结构体指针作为参数,将运算结果通过reply指针返回。在main函数中,我们注册了这个服务,并开启了一个 HTTP 服务来处理 RPC 请求。

2.实现 RPC 客户端

package mainimport ("fmt""log""net/rpc"
)func main() {// 连接到 RPC 服务端client, err := rpc.DialHTTP("tcp", "localhost:1234")if err!= nil {log.Fatal("dialing:", err)}// 准备请求参数args := Args{A: 3, B: 4}var reply int// 调用远程方法err = client.Call("MathService.Add", &args, &reply)if err!= nil {log.Fatal("arith error:", err)}// 输出结果fmt.Printf("The result of addition is: %d\n", reply)
}

在客户端代码中,我们首先通过rpc.DialHTTP连接到服务端。然后创建了一个Args结构体并设置了参数值。接着,我们调用client.Call方法来执行远程的Add方法,并将结果存储在reply变量中。

使用 JSON-RPC

除了使用 Go 标准的 RPC 编码,我们还可以使用 JSON-RPC。只需要将rpc.Register替换为rpc.RegisterName并指定编码为jsonrpc。

package mainimport ("errors""log""net/http""net/rpc""net/rpc/jsonrpc"
)// Args 用于传递请求参数
type Args struct {A, B int
}// MathService 数学运算服务
type MathService struct{}// Add 加法运算
func (m *MathService) Add(args *Args, reply *int) error {if args == nil {return errors.New("invalid arguments")}*reply = args.A + args.Breturn nil
}func main() {// 注册服务mathService := new(MathService)rpc.RegisterName("MathService", mathService)// 开启 HTTP 服务http.HandleFunc("/rpc", func(w http.ResponseWriter, r *http.Request) {jsonrpc.ServeRequest(rpc.DefaultServer, w, r)})// 启动服务log.Fatal(http.ListenAndServe(":1234", nil))
}

客户端的调用方式需要稍作修改:

package mainimport ("fmt""log""net/rpc/jsonrpc"
)func main() {// 连接到 RPC 服务端client, err := jsonrpc.Dial("tcp", "localhost:1234")if err!= nil {log.Fatal("dialing:", err)}// 准备请求参数args := Args{A: 3, B: 4}var reply int// 调用远程方法err = client.Call("MathService.Add", &args, &reply)if err!= nil {log.Fatal("arith error:", err)}// 输出结果fmt.Printf("The result of addition is: %d\n", reply)
}

总结

在 Go 语言中实现 RPC 模块非常方便,无论是使用标准的 RPC 编码还是 JSON-RPC。通过简单的几步:定义服务、注册服务、开启服务端以及在客户端进行调用,我们可以轻松地实现跨进程的远程过程调用。在实际应用中,可以根据具体的业务需求选择合适的 RPC 实现方式。

关注我看更多有意思的文章哦!👉👉


http://www.mrgr.cn/news/29152.html

相关文章:

  • 「QT」文件类 之 QDir 目录类
  • VTK知识学习(8)-坐标系统
  • Vue前端开发,组件及组件的使用
  • 如何快速定位并解决 Linux 系统性能瓶颈:终极全攻略
  • Linux软件包管理与Vim编辑器使用指南
  • 基于Spring Boot与Redis的令牌主动失效机制实现
  • Golang | Leetcode Golang题解之第414题第三大的数
  • JavaScript:驱动现代Web应用的关键引擎及其与HTML/CSS的集成
  • 一天认识一个硬件之显示器
  • 如何在Java服务中实现数据一致性:事务与锁机制的综合应用
  • 【技术分享】走进Docker的世界:从基础到实战全面解析(Docker全流程)
  • golang学习笔记26——golang 实现节点筛选与负载均衡
  • Windows目录监控部署
  • Qt容器类控件——QGroupBox和QTabWidget
  • pythonnet python图像 C# .NET图像 互转
  • C++ 类的默认成员函数-构造函数
  • 操作系统----操作系统引导
  • 71、Python之函数式编程:不能定义常量,Python如何支持不可变性?
  • 每日学习一个数据结构-FST数据结构与算法
  • rust快速创建Tauri App ——基于create-tauri-app
  • 变电站缺陷数据集8307张,带xml标注和txt标注,可以直接用于yolo训练
  • 《珠江水运》
  • C++ 类的默认成员函数-析构函数
  • C++使用Socket编程实现一个简单的HTTP服务器
  • NISP 一级 | 6.2 移动智能终端安全威胁
  • AG32 MCU与内置FPGA的FLASH空间如何划分