Go语言net包RPC远程调用有什么方式
导读:相信很多人对“Go语言net包RPC远程调用有什么方式”都不太了解,下面小编为你详细解释一下这个问题,希望对你有一定的帮助 rpc有多种调用方式,http、json-rpc、tcp 一、服务端 在代码中,启动了三个...
相信很多人对“Go语言net包RPC远程调用有什么方式”都不太了解,下面小编为你详细解释一下这个问题,希望对你有一定的帮助
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远程调用有什么方式”的内容就介绍到这,感谢各位的阅读,相信大家对Go语言net包RPC远程调用有什么方式已经有了进一步的了解。大家如果还想学习更多知识,欢迎关注网络,小编将为大家输出更多高质量的实用文章!
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Go语言net包RPC远程调用有什么方式
本文地址: https://pptw.com/jishu/653670.html
