Go语言net包RPC远程调用三种方式http与json-rpc及tcp
程序员文章站
2022-03-10 08:09:00
目录一、服务端二、http客户端三、tcp客户端四、json客户端五、运行结果rpc有多种调用方式,http、json-rpc、tcp一、服务端在代码中,启动了三个服务package mainimpo...
rpc有多种调用方式,http、json-rpc、tcp
一、服务端
在代码中,启动了三个服务
package main import ( "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{} //函数必须是导出的 //必须有两个导出类型参数 //第一个参数是接收参数 //第二个参数是返回给客户端参数,必须是指针类型 //函数还要有一个返回值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) 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 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客户端
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远程调用三种方式http与json-rpc及tcp的详细内容,更多关于go语言net包rpc远程调用方式的资料请关注其它相关文章!
上一篇: Python 敏感词过滤的实现示例
下一篇: 火锅配菜有哪些 火锅配菜大全轻松吃火锅