Go的RPC实现基于net/rpc包,需定义导出方法,如Add接收Args结构并返回int指针和error;服务端注册Calculator实例并监听TCP端口;客户端通过Dial连接后调用Calculator.Add方法传参获取结果。

在Golang中实现RPC(远程过程调用)客户端和服务端非常简单,标准库net/rpc提供了完整的支持。下面以一个基础示例说明如何使用Go的RPC机制进行通信。
1. 定义服务接口和数据结构
RPC通信需要双方约定好方法签名和参数结构。我们先定义一个简单的服务,用于计算两个数的和。
创建一个公共的数据结构和方法定义,通常放在独立的包中,但为了演示方便,这里直接在主包中定义:
注意:RPC方法必须满足以下条件:方法是导出的(大写字母开头) 有两个参数,第一个是接收参数,第二个是返回结果(都是导出类型) 第二个参数是指针类型 返回值是error类型
例如:
立即学习“go语言免费学习笔记(深入)”;
type Args struct { A, B int}type Calculator intfunc (c *Calculator) Add(args Args, result *int) error { *result = args.A + args.B return nil}
2. 启动RPC服务端
服务端注册服务并监听TCP端口。
PHPShops多用户商城系统
随着电子商务模式更加多样化,企业和个人的迫切需求,PHPShops多用户商城系统正可以为其提供专业的电子商务解决方案。社区化电子商务,主要面向行业类和地方门户类站点。 PHPShops多用户商城系统(简称PHPShops)是基于电子商务的一套平台交易系统,它采用目前最流行网站建设工具PHP+MYSQL,实现模版分离技术,通过HTML交互式网页技术来实行客户端与服务器端的交流。无论在
0 查看详情
package mainimport ( "log" "net" "net/rpc")func main() { // 注册服务实例 calc := new(Calculator) rpc.Register(calc) // 监听端口 listener, err := net.Listen("tcp", ":1234") if err != nil { log.Fatal("监听端口失败:", err) } defer listener.Close() log.Println("RPC服务已启动,监听端口: 1234") for { conn, err := listener.Accept() if err != nil { continue } go rpc.ServeConn(conn) }}
3. 编写RPC客户端
客户端连接服务端并调用远程方法。
package mainimport ( "fmt" "log" "net/rpc")func main() { // 连接服务端 client, err := rpc.Dial("tcp", "localhost:1234") if err != nil { log.Fatal("连接失败:", err) } defer client.Close() // 准备参数和接收结果 args := Args{A: 5, B: 10} var reply int // 调用远程方法 err = client.Call("Calculator.Add", args, &reply) if err != nil { log.Fatal("调用失败:", err) } fmt.Printf("结果: %dn", reply) // 输出: 结果: 15}
4. 运行步骤
分别运行服务端和客户端:
先启动服务端程序:go run server.go 再运行客户端程序:go run client.go 客户端将输出计算结果
确保服务端已在运行,且网络可通。如果跨机器,需调整IP地址。
基本上就这些。Go的net/rpc设计简洁,适合内部服务通信。但要注意它默认使用Go特有的编码(gob),不支持跨语言。如需JSON或HTTP支持,可考虑net/rpc/jsonrpc或gRPC。不过对于纯Go环境,标准RPC足够高效实用。
以上就是如何在Golang中实现RPC客户端和服务端的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1111353.html
微信扫一扫
支付宝扫一扫

