成都网站建设设计

将想法与焦点和您一起共享

GolangRPC的使用方法

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

专注于为中小企业提供成都网站建设、成都做网站服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业坡头免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了数千家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。

基本概念

RPC (Remote Rrocedure Call)远程过程调用,可以理解为客户端请求服务端,客户端将要执行的函数请求发送到服务端,服务端通过计算返回结果。

RPC基本使用

通过TCP协议传输,默认使用GOB编码解码, GOB不支持其他语言,所以只能Golang使用

server端

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的使用方法
URL分享:http://chengdu.cdxwcx.cn/article/pcjgoo.html