前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go语言 RPC 极速入门指南

Go语言 RPC 极速入门指南

作者头像
微客鸟窝
发布2021-11-12 11:20:40
5220
发布2021-11-12 11:20:40
举报
文章被收录于专栏:Go语言指北

RPC是远程过程调用(Remote Procedure Call)的缩写形式,是分布式系统中不同节点间流行的通信方式。

一个完整的RPC架构里面包含了四个核心的组件,分别是Client ,Server,Client Stub以及Server Stub,这个Stub大家可以理解为存根。分别说说这几个组件:

  • 客户端(Client),服务的调用方。
  • 服务端(Server),真正的服务提供者。
  • 客户端存根,存放服务端的地址消息,再将客户端的请求参数打包成网络消息,然后通过网络远程发送给服务方。
  • 服务端存根,接收客户端发送过来的消息,将消息解包,并调用本地的方法。

Hello, World

Go 语言的 RPC 包的路径为 net/rpc,可以猜测该RPC包是建立在 net 包基础之上的。下面我们尝试基于 rpc 实现一个打印的例子。

服务端 server

先构造一个 HelloService 类型,其中的 Hello 方法用于实现打印功能:

server

代码语言:javascript
复制
package main

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

// HelloService is rpc server obj
type HelloService struct {}

func (p *HelloService) Hello(request string, reply *string) error {
 *reply = "hello:" + request
 return nil
}

//将HelloService类型的对象注册为一个RPC服务
func main(){
 rpc.RegisterName("HelloService", new(HelloService))

 listener, err := net.Listen("tcp", ":1234")
 if err != nil {
  log.Fatal("ListenTCP error:", err)
 }

 conn, err := listener.Accept()
 if err != nil {
  log.Fatal("Accept error", err)
 }

 rpc.ServeConn(conn)
  
}

❝其中Hello方法必须满足Go语言的RPC规则:

  • 方法只能有两个可序列化的参数,其中第二个参数是指针 类型
  • 并且返回一个error类型,同时必须是公开的方法。

rpc.Register 函数调用会将对象类型中所有满足 RPC 规则的对象方法注册为 RPC 函数,所有注册 的方法会放在 “HelloService” 服务空间之下。 建立一个唯一的TCP链接,并且通过 rpc.ServeConn 函数在该 TCP 链接上为对方提供 RPC 服务。

客户端 clinet

客户端请求HelloService服务的代码:

代码语言:javascript
复制
package main

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

func main() {
 client, err := rpc.Dial("tcp", "localhost:1234")
 if err != nil {
  log.Fatal("dialing err:", err)
 }

 var reply string
 err = client.Call("HelloService.Hello", "test_rpc", &reply)
 if err != nil {
  log.Fatal(err)
 }

 fmt.Println(reply)
}

❝通过rpc.Dial拨号RPC服务,然后通过client.Call调用具体的RPC方法。在调用 client.Call时,第一个参数是用点号链接的RPC服务名字和方法名字,第二和第三个参数分别我们定 义RPC方法的两个参数。

开启服务器端,开启客户端。客户端的执行结果如下:

代码语言:javascript
复制
$ go run client.go
hello:test_rpc

图片及部分相关技术知识点来源于网络搜索,侵权删!

参考资料:

https://www.cnblogs.com/zs-notes/p/9334935.html

https://blog.csdn.net/jacky128256/article/details/104746334

《Go语言高级编程》

https://www.cnblogs.com/pangqianjin/p/14616076.html

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微客鸟窝 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Hello, World
    • 服务端 server
      • 客户端 clinet
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档