码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Go Web---RPC


    Go Web---RPC

    • 用 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细节可以参考此文


  • 相关阅读:
    Nginx | nginx配置https
    MFC C++ split函数切割字符串示例
    Qt-OpenCV学习笔记--自适应阈值--adaptiveThreshold()
    Python环境的搭建+第一个Python程序的运行
    企微SCRM在私域流量运营中的痛点解决之道
    nginx的安装及使用
    cdh 6.3.2 离线部署
    【Redis学习笔记二】三种特殊数据类型、事务的基本操作、锁、持久化、发布订阅、主从复制、哨兵模式
    一键下载慕课网/网易云课堂/中国大学/学习通/爱课程/学堂在线等课程视频和课件
    实时流处理与分布式存储过程中对文件的操作
  • 原文地址:https://blog.csdn.net/m0_53157173/article/details/126407234
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号