Go Web---RPC

Posted 大忽悠爱忽悠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go Web---RPC相关的知识,希望对你有一定的参考价值。

Go Web---RPC


用 rpc 实现远程过程调用

Go 程序之间可以使用 net/rpc 包实现相互通信,这是另一种客户端-服务器应用场景。它提供了一种方便的途径,通过网络连接调用远程函数。当然,仅当程序运行在不同机器上时,这项技术才实用。rpc 包建立在 gob 包之上,实现了自动编码/解码传输的跨网络方法调用。

服务器端需要注册一个对象实例,与其类型名一起,使之成为一项可见的服务:它允许远程客户端跨越网络或其他 I/O 连接访问此对象已导出的方法。总之就是在网络上暴露类型的方法。

rpc 包使用了 http 和 tcp 协议,以及用于数据传输的 gob 包。服务器端可以注册多个不同类型的对象(服务),但同一类型的多个对象会产生错误。

小结:

  • Golang 提供RPC标准包,支持开发 RPC 服务端和客户端,采用 gob 编码。
  • 支持三种请求方式:HTTP、TCP 和 JSONRPC
  • Golang RPC 函数必须特定的格式写法才能被远程调用,格式如下:
func (t *T) MethodName(argType T1, replyType *T2) error

T1 和 T2 必须能被 encoding/gob 包编码和解码


实例演示

服务端:

  • 新增rpc服务 func (p *HelloService) Hello(request string, reply *string) error
  • 注册rpc服务 rpc.Register(HelloService)
  • 开启服务监听 net.Listen(“tcp”, “:5200”)
package main

import (
	"fmt"
	"log"
	"net"
	"net/rpc"
)

type HelloService struct

func (p *HelloService) Hello(request string, reply *string) error 
	*reply = "hello: " + request
	fmt.Println("hello方法被调用,返回给客户端的结果为: ", *reply)
	return nil


func main() 
	rpc.RegisterName("HelloService", new(HelloService))

	listener, err := net.Listen("tcp", ":5200")

	if err != nil 
		log.Fatal(err)
	

	conn, err := listener.Accept()

	if err != nil 
		log.Fatal(err)
	

	rpc.ServeConn(conn)



客户端:

  • 连接rpc服务器 rpc.Dail(“tcp”, “localhost:5200”)
  • 调用rpc服务 client.Call(“HelloService.Hello”, “chloe”, &reply)
package main

import (
	"fmt"
	"log"
	"net/rpc"
)

func main() 
	client, err := rpc.Dial("tcp", "localhost:5200")

	if err != nil 
		log.Fatal(err)
	

	var reply string

	err = client.Call("HelloService.Hello", "chloe", &reply)

	if err != nil 
		log.Fatal(err)
	

	fmt.Println("远程调用,响应结果为: " + reply)


更多go rpc细节可以参考此文


以上是关于Go Web---RPC的主要内容,如果未能解决你的问题,请参考以下文章

Web | RPC 的结构流程

flask-web ——RPC实际项目业务简析

flask-web —— RPC定义结构gRPCProtocol Buffers

Go1.18 新特性:编译后的二进制文件,将包含更多信息

Go语言入门篇-高级数据类型

golang 转到SSH服务器完整示例 - 在此处阅读更多内容https://blog.gopheracademy.com/go-and-ssh/