重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章主要介绍“Golang RPC的使用方法”,在日常操作中,相信很多人在Golang RPC的使用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Golang RPC的使用方法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
专注于为中小企业提供成都网站建设、成都做网站服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业坡头免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了数千家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。
RPC (Remote Rrocedure Call)远程过程调用,可以理解为客户端请求服务端,客户端将要执行的函数请求发送到服务端,服务端通过计算返回结果。
通过TCP协议传输,默认使用GOB编码解码, GOB不支持其他语言,所以只能Golang使用
package main import ( "fmt" "net" "net/rpc" ) type HelloService struct { } func (s *HelloService) Hello(request string, reply *string) error { *reply = fmt.Sprintf("Hello %s", request) return nil } func main() { listener, err := net.Listen("tcp", ":1234") if err != nil { fmt.Println(err) return } err = rpc.RegisterName("HelloService", &HelloService{}) if err != nil { fmt.Println(err) } conn, err := listener.Accept() if err != nil { fmt.Println(err) } rpc.ServeConn(conn) }
package main import ( "fmt" "net/rpc" ) func main() { client, err := rpc.Dial("tcp", "localhost:1234") if err != nil { fmt.Println(err) } var body string err = client.Call("HelloService.Hello", "World", &body) if err != nil { fmt.Println(err) } fmt.Println(body) }
由于GOB解码编码不支持其他所以可以改成JSON编码解码 服务端使用rpc.ServerCodec(jsonrpc.NewServerCodec(conn))
改变编码解码为JSON
需要修改的代码rpc.ServeConn(conn)
改为rpc.ServerCodec(jsonrpc.NewServerCodec(conn))
.... conn, _ := listener.Accept() rpc.ServerCodec(jsonrpc.NewServerCodec(conn)) ....
主要代码实现rpc.NewClientWithCodec(jsonrpc.NewClientCodec(conn))
package main import ( "fmt" "net" "net/rpc" "net/rpc/jsonrpc" ) func main() { conn, err :=net.Dial("tcp", "localhost:1234") if err != nil { fmt.Println(err) return } var reply string client := rpc.NewClientWithCodec(jsonrpc.NewClientCodec(conn)) err = client.Call("HelloService.Hello", "body", &reply) if err != nil { fmt.Println(err) } fmt.Println(reply) }
上面实例都是基于TCP协议传输,RPC也可以使用HTTP协议进行传输
package main import ( "fmt" "io" "net/http" "net/rpc" "net/rpc/jsonrpc" ) type HelloServer struct {} func (h *HelloServer) Hello(request string, reply *string) error { *reply = fmt.Sprintf("Hello %s", request) return nil } func main() { err := rpc.RegisterName("HelloService", &HelloServer{}) if err != nil { fmt.Println(err) } http.HandleFunc("/jsonrpc", func(writer http.ResponseWriter, request *http.Request) { var conn io.ReadWriteCloser = struct { io.Writer io.ReadCloser }{ ReadCloser: request.Body, Writer: writer, } err = rpc.ServeRequest(jsonrpc.NewServerCodec(conn)) if err != nil { fmt.Println(err) } }) http.ListenAndServe(":1234", nil) }
package main import ( "bytes" "encoding/json" "fmt" "io" "io/ioutil" "net/http" ) func main() { d := map[string]interface{}{ "id": 0, "params": []string{"body"}, "method": "HelloService.Hello", } b, err := json.Marshal(d) if err != nil { fmt.Println(err) } resp, err := http.Post("http://localhost:1234/jsonrpc", "", bytes.NewBuffer(b)) if err != nil { fmt.Println(err) } defer func(Body io.ReadCloser) { err := Body.Close() if err != nil { fmt.Println(err) } }(resp.Body) bData, _ := ioutil.ReadAll(resp.Body) fmt.Println(string(bData)) }
到此,关于“Golang RPC的使用方法”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!