首页 > 其他分享 >go rpc原生用法

go rpc原生用法

时间:2023-11-17 15:36:41浏览次数:26  
标签:原生 调用 err fmt args RPC rpc go


Go 先锋

读完需要

7分钟

速读仅需 3 分钟

   

概述

在分布式系统中,远程过程调用(RPC)是一种关键的通信方式,而 Go 语言提供了强大的 RPC 支持,使得在网络间实现函数调用变得更加便捷。

本文将探讨 Go 语言中 RPC 的基础概念、实现方式,并通过示例代码演示如何模拟远程过程调用系统。

 

   

1. RPC 基础概念

1.1 什么是 RPC

RPC 是一种远程过程调用的协议,允许程序调用其他地址空间(通常是网络上的另一台机器)的过程。

它隐藏了底层通信的复杂性,使得远程调用就像本地调用一样简单。

1.2 Go 语言中的 RPC

Go 语言通过 net/rpc 包提供了原生的 RPC 支持,通过该包可以轻松构建分布式系统。

RPC 在 Go 语言中的实现方式主要基于 Gob(Go 二进制对象)编码,可以方便地传递 Go 语言结构体。

 

   

2. 基本的 RPC 示例

2.1 服务定义

package rpcdemo
import ( "errors")
// Arith 远程对象,必须首字母大写type Arith struct{}
// Args 参数结构体,字段首字母也必须大写type Args struct { A, B int}
// Multiply 乘法方法,需要满足RPC规范func (t *Arith) Multiply(args *Args, reply *int) error { *reply = args.A * args.B return nil}

2.2 服务注册

package main
import ( "fmt" "net" "net/rpc" "rpcdemo")
func main() { arith := new(rpcdemo.Arith) rpc.Register(arith)
listener, err := net.Listen("tcp", ":1234") if err != nil { fmt.Println("Listen error:", err) return }
fmt.Println("RPC Server is listening on port 1234...") for { conn, err := listener.Accept() if err != nil { fmt.Println("Accept error:", err) continue }
go rpc.ServeConn(conn) }}

2.3 客户端调用

package main
import ( "fmt" "net/rpc" "rpcdemo")
func main() { client, err := rpc.Dial("tcp", "127.0.0.1:1234") if err != nil { fmt.Println("Dial error:", err) return } defer client.Close()
args := &rpcdemo.Args{7, 8} var reply int err = client.Call("Arith.Multiply", args, &reply) if err != nil { fmt.Println("Call error:", err) return }
fmt.Printf("Arith: %d*%d=%d\n", args.A, args.B, reply)}

 

   

3. 模拟 RPC 系统

3.1 服务注册与调用

package main
import ( "fmt" "net" "net/rpc")
// Math 远程对象type Math struct{}
// Args 参数结构体type Args struct { A, B int}
// Multiply 乘法方法func (m *Math) Multiply(args *Args, reply *int) error { *reply = args.A * args.B return nil}
func main() { math := new(Math) rpc.Register(math)
listener, err := net.Listen("tcp", ":1234") if err != nil { fmt.Println("Listen error:", err) return }
fmt.Println("RPC Server is listening on port 1234...") for { conn, err := listener.Accept() if err != nil { fmt.Println("Accept error:", err) continue }
go rpc.ServeConn(conn) }}

3.2 客户端调用

package main
import ( "fmt" "net/rpc")
// Args 参数结构体type Args struct { A, B int}
func main() { client, err := rpc.Dial("tcp", "127.0.0.1:1234") if err != nil { fmt.Println("Dial error:", err) return } defer client.Close()
args := &Args{7, 8} var reply int err = client.Call("Math.Multiply", args, &reply) if err != nil { fmt.Println("Call error:", err) return }
fmt.Printf("Math: %d*%d=%d\n", args.A, args.B, reply)}

 

   

4. 实现详解

4.1 服务定义

在 RPC 服务中,定义了一个 Arith 结构体作为远程对象,以及一个 Args 结构体作为参数传递。

服务端的 Multiply 方法用于实现具体的远程调用操作。

4.2 服务注册与监听

在服务端,用 rpc.Register 注册了的远程对象,并通过 net.Listen 监听指定端口。

接着使用 rpc.ServeConn 处理客户端的连接请求。

4.3 客户端调用

在客户端,用 rpc.Dial 连接到服务端,通过 client.Call 方法调用具体的远程方法。

需要注意的是,调用方法时需要使用"远程对象.方法"的形式。

 

   

5. 模拟 RPC 系统实战

5.1 服务注册与调用

在模拟 RPC 系统中,定义了一个 Math 结构体作为远程对象,并实现了 Multiply 方法。

服务端与客户端的代码结构与基本 RPC 示例相似,只是使用了不同的远程对象和方法。

5.2 客户端调用

客户端调用时,同样需要使用 rpc.Dial 连接到服务端,然后通过 client.Call 方法调用具体的远程方法。

用 Math.Multiply 来调用服务端的乘法方法。

 

   

6. 总结

通过本文的详细介绍,了解了 Go 语言中 RPC 的基本概念和实现方式,用示例代码演示了如何构建简单的 RPC 系统。

模拟 RPC 系统的实战部分更是展示了如何使用 RPC ,在分布式系统中实现远程调用。

标签:原生,调用,err,fmt,args,RPC,rpc,go
From: https://www.cnblogs.com/cheyunhua/p/17838851.html

相关文章

  • 更快更省更好用!天翼云云原生一体机iStack打通物云最后一公里!
    近年来,随着企业数字化转型的深入,从传统IT架构向云原生架构转型,已经成为企业谋求更高质量发展的必由之路。然而,云原生技术复杂度高,运维成本高,且技术工具间的集成度不足。打破云原生技术应用门槛,以端到端软硬一体的方式为企业提供服务,成为云服务商加速云原生规模化落地的重点。作......
  • GoldenGate高可用管理组件-XAG部署与管理
    适用范围适用于OracleRAC集群环境,并在创建ACFS共享文件系统中部署GoldenGate软件前提下,部署xag高可用组件对GoldenGate进行高可用管理。实施步骤1.安装XAG#在安装OGG的节点安装xag#使用grid用户安装unzipxagpack_7b.zip-d/tmpcd/tmp/xag./xagsetup.sh--install--directo......
  • 更快更省更好用!天翼云云原生一体机iStack打通物云最后一公里!
    近年来,随着企业数字化转型的深入,从传统IT架构向云原生架构转型,已经成为企业谋求更高质量发展的必由之路。然而,云原生技术复杂度高,运维成本高,且技术工具间的集成度不足。打破云原生技术应用门槛,以端到端软硬一体的方式为企业提供服务,成为云服务商加速云原生规模化落地的重点。作为......
  • 学习笔记426—keras中to_categorical函数解析
    keras中to_categorical函数解析1.to_categorical的功能简单来说,to_categorical就是将类别向量转换为二进制(只有0和1)的矩阵类型表示。其表现为将原有的类别向量转换为独热编码的形式。先上代码看一下效果:fromkeras.utils.np_utilsimport*#类别向量定义b=[0,1,2,3,4,5,6,7,8]......
  • go语言解决跨域的问题图片显示问题
    来源:http://www.shanhubei.com/archives/2838.html直接上代码packagemainimport("fmt""io/ioutil""net/http")//获取C的图片数据funcReadImgData(urlstring)[]byte{resp,err:=http.Get(url)iferr!=nil{......
  • Go标准库学习:builtin
    Builtin模块最近在学Go,但感觉标准库中文资料不是很多,直接看官网文档又没有循序渐进的过程,所以自己在边看边记录,如有谬误还请指出,感谢。这部分总结了Go中内置的模块,不需要导包。来自Go的标准文档,版本是1.21.4。在类型方面是我自己的总结和理解。类型(types)Go语言提供的类型......
  • Django2.0以上版本path方法——路由层使用的转换器(五种)
    str#匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式int#匹配正整数,包含0。slug#匹配字母、数字以及横杠、下划线组成的字符串。uuid#匹配格式化的uuid,如075194d3-6885-417e-a8a8-6c931e272f00。path#匹配任何非空字符串,包含了路径分隔符(/)使用方式:p......
  • golang channel
    ”不要以共享内存的方式来通信,相反,要通过通信来共享内存“golang的一个思想,不整文的,整点武的,具体来看channel怎么做的有一个很关键的golangMPG模型再单独分析,这篇先只分析channel定义//runtim/chan.gotypehchanstruct{ qcountuint//通道里的元素......
  • Django07
    多表查询(跨表查询)子查询链表查询正反向查询概念聚合查询分组查询F查询和Q查询模型层中常见字段类型和参数Django中如何开启事务——————————————————————————————————————————————————————————————————......
  • 微软发布.NET云原生开发框架——.NET Aspire
    众所周知,微软于2023-11-14日发布了.NET8的正式版。伴随着这个重要.NET版本的发布,微软也发布了一个全新的.NET云原生开发框架——.NETAspire。.NETAspire提供了如下3个方面的能力,来帮助我们使用.NET开发分层、云就绪的可观测、本地与生产环境一致的分布式云原生应用程序:微服......