温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Golang RPC的使用方法

发布时间:2021-07-05 17:25:27 来源:亿速云 阅读:139 作者:chen 栏目:编程语言

这篇文章主要介绍“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的使用方法”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI