Go语言中net包RPC远程调用方式有哪些
发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,这篇文章主要介绍Go语言中net包RPC远程调用方式有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、服务端在代码中,启动了三个服务package mainimport
千家信息网最后更新 2025年01月19日Go语言中net包RPC远程调用方式有哪些
这篇文章主要介绍Go语言中net包RPC远程调用方式有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
一、服务端
在代码中,启动了三个服务
package mainimport ( "log" "net" "net/http" "net/rpc" "net/rpc/jsonrpc" "sync") //go对RPC的支持,支持三个级别:TCP、HTTP、JSONRPC//go的RPC只支持GO开发的服务器与客户端之间的交互,因为采用了gob编码 //注意字段必须是导出type Params struct { Width, Height int} type Rect struct{} //函数必须是导出的//必须有两个导出类型参数//第一个参数是接收参数//第二个参数是返回给客户端参数,必须是指针类型//函数还要有一个返回值errorfunc (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) var wg sync.WaitGroup wg.Add(3) go func() { //把服务处理绑定到http协议上 rpc.HandleHTTP() err := http.ListenAndServe(":8080", nil) wg.Wait() if err != nil { log.Fatal(err) defer wg.Done() } }() log.Println("http rpc service start success addr:8080") go func() { tcpaddr, _ := net.ResolveTCPAddr("tcp", "127.0.0.1:8081") tcplisten, err := net.ListenTCP("tcp", tcpaddr) if err != nil { log.Fatal(err) defer wg.Done() } for { conn, err3 := tcplisten.Accept() if err3 != nil { continue } go rpc.ServeConn(conn) } }() log.Println("tcp rpc service start success addr:8081") go func() { tcpaddr, _ := net.ResolveTCPAddr("tcp", "127.0.0.1:8082") tcplisten, err := net.ListenTCP("tcp", tcpaddr) if err != nil { log.Fatal(err) defer wg.Done() } for { conn, err3 := tcplisten.Accept() if err3 != nil { continue } go jsonrpc.ServeConn(conn) } }() log.Println("tcp json-rpc service start success addr:8082") wg.Wait()}
二、http客户端
package mainimport ( "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客户端
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:8081") 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客户端
package main import ( "fmt" "log" "net/rpc/jsonrpc") type Params struct { Width, Height int} func main() { //连接远程rpc服务 rpc, err := jsonrpc.Dial("tcp", "127.0.0.1:8082") if err != nil { log.Fatal(err) } ret := 0 //调用远程方法 //注意第三个参数是指针类型 err2 := rpc.Call("Rect.Area", Params{150, 100}, &ret) if err2 != nil { log.Fatal(err2) } fmt.Println(ret) err3 := rpc.Call("Rect.Perimeter", Params{150, 100}, &ret) if err3 != nil { log.Fatal(err3) } fmt.Println(ret)}
五、运行结果
以上是"Go语言中net包RPC远程调用方式有哪些"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!
参数
服务
三个
客户
客户端
类型
指针
方式
方法
支持
语言
代码
内容
函数
篇文章
两个
之间
价值
兴趣
字段
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
中国软件开发者报告
郑州市网络安全协会会员
网络安全趣味书籍
ibm流媒体服务器
浙江网络时间同步服务器云空间
蛮王柯南选什么服务器
印度网络技术视频
为什么要有mysql数据库
魔兽世界怀旧赛季服平衡服务器
国药局唯一标识数据库
磁盘服务器的效率由多种因素
亚信服务器深度安全防护价格
合肥软件开发驻场需要多少钱
电脑上加密服务器地址怎么设置
网络安全快车
云服务器租用服务价格
我国网络安全的治理重点
西安理工网络安全研究生就业咋样
中小学 网络安全意识
服务器性能最好的手机
网络安全宣传知识竞赛标语
佛山金融软件开发招聘信息
两会提到多少次网络安全
车载网络技术lin
网络技术计算机三级视频教程
如何下载网站的数据库
部队网络安全宣传周样板
滁州回收服务器在线咨询
邯郸安卓软件开发服务费
mc服务器给钱