• 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
    
    • 1

    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)
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    客户端:

    • 连接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)
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

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


  • 相关阅读:
    Python【多分支练习】
    JAVA访问SFTP
    三分钟带你了解内网穿透的什么
    TinyWebServer学习笔记-Config
    Outlook如何删除邮箱账户
    navicate安装教程
    Carina 全新版本 v0.11.0 上线!重磅升级不可错过
    华为设备小型园区网方案(有线+无线+防火墙)
    LeetCode13——罗马数字转整数
    【leetcode】三数之和
  • 原文地址:https://blog.csdn.net/m0_53157173/article/details/126407234