这篇文章主要介绍“Golang RPC的使用方法”,在日常操作中,相信很多人在Golang RPC的使用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Golang RPC的使用方法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

专注于为中小企业提供成都网站建设、成都做网站服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业坡头免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了数千家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。
基本概念
RPC (Remote Rrocedure Call)远程过程调用,可以理解为客户端请求服务端,客户端将要执行的函数请求发送到服务端,服务端通过计算返回结果。
RPC基本使用
通过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)
}基于JSON编码解码
由于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)
}基于HTTP协议
上面实例都是基于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的使用方法”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!
文章标题:GolangRPC的使用方法
网站路径:http://www.scyingshan.cn/article/pcjgoo.html


咨询
建站咨询
