go语言net包rpc远程调用的使用示例
来源:脚本之家
时间:2023-01-07 11:58:27 213浏览 收藏
本篇文章向大家介绍《go语言net包rpc远程调用的使用示例》,主要包括调用、gorpc,具有一定的参考价值,需要的朋友可以参考一下。
rpc 包提供了一个方法来通过网络或者其他的I/O连接进入对象的外部方法. 一个server注册一个对象, 标记它成为可见对象类型名字的服务。注册后,对象的外部方法就可以远程调用了。一个server可以注册多个 不同类型的对象,但是却不可以注册多个相同类型的对象。
只有满足这些标准的方法才会被远程调用视为可见;其他的方法都会被忽略:
- 方法是外部可见的。
- 方法有两个参数,参数的类型都是外部可见的。
- 方法的第二个参数是一个指针。
- 方法有返回类型错误
一、基于http的RPC
服务端:
package main; import ( "net/rpc" "net/http" "log" ) //go对RPC的支持,支持三个级别:TCP、HTTP、JSONRPC //go的RPC只支持GO开发的服务器与客户端之间的交互,因为采用了gob编码 //注意字段必须是导出 type Params struct { Width, Height int; } type Rect struct{} //函数必须是导出的 //必须有两个导出类型参数 //第一个参数是接收参数 //第二个参数是返回给客户端参数,必须是指针类型 //函数还要有一个返回值error func (r *Rect) Area(p Params, ret *int) error { *ret = p.Width * p.Height; return nil; } func (r *Rect) Perimeter(p Params, ret *int) error { *ret = (p.Width + p.Height) * 2; return nil; } func main() { rect := new(Rect); //注册一个rect服务 rpc.Register(rect); //把服务处理绑定到http协议上 rpc.HandleHTTP(); err := http.ListenAndServe(":8080", nil); if err != nil { log.Fatal(err); } }
客户端:
package main; import ( "net/rpc" "log" "fmt" ) type Params struct { Width, Height int; } func main() { //连接远程rpc服务 rpc, err := rpc.DialHTTP("tcp", "127.0.0.1:8080"); if err != nil { log.Fatal(err); } ret := 0; //调用远程方法 //注意第三个参数是指针类型 err2 := rpc.Call("Rect.Area", Params{50, 100}, &ret); if err2 != nil { log.Fatal(err2); } fmt.Println(ret); err3 := rpc.Call("Rect.Perimeter", Params{50, 100}, &ret); if err3 != nil { log.Fatal(err3); } fmt.Println(ret); }
二、基于tcp的RPC
服务端:
package main; import ( "net" "log" "net/rpc" ) //注意字段必须是导出 type Params struct { Width, Height int; } type Rect struct{} func (r *Rect) Area(p Params, ret *int) error { *ret = p.Width * p.Height; return nil; } func (r *Rect) Perimeter(p Params, ret *int) error { *ret = (p.Width + p.Height) * 2; return nil; } func chkError(err error) { if err != nil { log.Fatal(err); } } func main() { rect := new(Rect); //注册rpc服务 rpc.Register(rect); //获取tcpaddr tcpaddr, err := net.ResolveTCPAddr("tcp4", "127.0.0.1:8080"); chkError(err); //监听端口 tcplisten, err2 := net.ListenTCP("tcp", tcpaddr); chkError(err2); //死循环处理连接请求 for { conn, err3 := tcplisten.Accept(); if err3 != nil { continue; } //使用goroutine单独处理rpc连接请求 go rpc.ServeConn(conn); } }
客户端:
package main; import ( "net/rpc" "fmt" "log" ) type Params struct { Width, Height int; } func main() { //连接远程rpc服务 //这里使用Dial,http方式使用DialHTTP,其他代码都一样 rpc, err := rpc.Dial("tcp", "127.0.0.1:8080"); if err != nil { log.Fatal(err); } ret := 0; //调用远程方法 //注意第三个参数是指针类型 err2 := rpc.Call("Rect.Area", Params{50, 100}, &ret); if err2 != nil { log.Fatal(err2); } fmt.Println(ret); err3 := rpc.Call("Rect.Perimeter", Params{50, 100}, &ret); if err3 != nil { log.Fatal(err3); } fmt.Println(ret); }
三、JSON RPC 方式
jsonrpc方式是数据编码采用了json,而不是gob编码。
服务端:
package main; import ( "net" "log" "net/rpc" "net/rpc/jsonrpc" ) //注意字段必须是导出 type Params struct { Width, Height int; } type Rect struct{} func (r *Rect) Area(p Params, ret *int) error { *ret = p.Width * p.Height; return nil; } func (r *Rect) Perimeter(p Params, ret *int) error { *ret = (p.Width + p.Height) * 2; return nil; } func chkError(err error) { if err != nil { log.Fatal(err); } } func main() { rect := new(Rect); //注册rpc服务 rpc.Register(rect); //获取tcpaddr tcpaddr, err := net.ResolveTCPAddr("tcp4", "127.0.0.1:8080"); chkError(err); //监听端口 tcplisten, err2 := net.ListenTCP("tcp", tcpaddr); chkError(err2); for { conn, err3 := tcplisten.Accept(); if err3 != nil { continue; } //使用goroutine单独处理rpc连接请求 //这里使用jsonrpc进行处理 go jsonrpc.ServeConn(conn); } }
客户端:
package main; import ( "fmt" "log" "net/rpc/jsonrpc" ) type Params struct { Width, Height int; } func main() { //连接远程rpc服务 //这里使用jsonrpc.Dial rpc, err := jsonrpc.Dial("tcp", "127.0.0.1:8080"); if err != nil { log.Fatal(err); } ret := 0; //调用远程方法 //注意第三个参数是指针类型 err2 := rpc.Call("Rect.Area", Params{50, 100}, &ret); if err2 != nil { log.Fatal(err2); } fmt.Println(ret); err3 := rpc.Call("Rect.Perimeter", Params{50, 100}, &ret); if err3 != nil { log.Fatal(err3); } fmt.Println(ret); }
文中关于golang的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《go语言net包rpc远程调用的使用示例》文章吧,也可关注golang学习网公众号了解相关技术文章。
声明:本文转载于:脚本之家 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
-
326 收藏
-
357 收藏
-
106 收藏
-
298 收藏
-
235 收藏
最新阅读
更多>
-
305 收藏
-
137 收藏
-
242 收藏
-
178 收藏
-
321 收藏
-
303 收藏
课程推荐
更多>
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 507次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习
评论列表
-
- 饱满的小懒猪
- 太给力了,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢大佬分享文章内容!
- 2023-04-14 12:21:37
-
- 壮观的心锁
- 很详细,mark,感谢楼主的这篇技术贴,我会继续支持!
- 2023-03-25 00:16:02
-
- 内向的铃铛
- 这篇技术贴真是及时雨啊,太细致了,太给力了,已加入收藏夹了,关注up主了!希望up主能多写Golang相关的文章。
- 2023-02-04 05:04:30
-
- 害怕的楼房
- 这篇技术贴太及时了,太全面了,真优秀,已收藏,关注作者大大了!希望作者大大能多写Golang相关的文章。
- 2023-01-26 18:25:09
-
- 还单身的摩托
- 感谢大佬分享,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢作者大大分享技术贴!
- 2023-01-26 02:59:39
-
- 怕孤单的鸭子
- 很有用,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢楼主分享博文!
- 2023-01-22 17:01:04
-
- 要减肥的老虎
- 很详细,收藏了,感谢师傅的这篇博文,我会继续支持!
- 2023-01-22 02:46:51
-
- 高大的台灯
- 这篇技术贴出现的刚刚好,好细啊,受益颇多,码住,关注作者了!希望作者能多写Golang相关的文章。
- 2023-01-16 08:26:38
-
- 阳光的心情
- 太全面了,码起来,感谢up主的这篇博文,我会继续支持!
- 2023-01-15 22:33:28
-
- 聪慧的鼠标
- 这篇博文出现的刚刚好,细节满满,很好,码住,关注楼主了!希望楼主能多写Golang相关的文章。
- 2023-01-08 20:03:41