这篇文章主要介绍“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的使用方法”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/2002927/blog/5034065