首页>>后端>>Golang->Go语言 RPC 极速入门指南

Go语言 RPC 极速入门指南

时间:2023-12-01 本站 点击:0

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

packagemainimport("log""net""net/rpc")//HelloServiceisrpcserverobjtypeHelloServicestruct{}func(p*HelloService)Hello(requeststring,reply*string)error{*reply="hello:"+requestreturnnil}//将HelloService类型的对象注册为一个RPC服务funcmain(){rpc.RegisterName("HelloService",new(HelloService))listener,err:=net.Listen("tcp",":1234")iferr!=nil{log.Fatal("ListenTCPerror:",err)}conn,err:=listener.Accept()iferr!=nil{log.Fatal("Accepterror",err)}rpc.ServeConn(conn)}

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

方法只能有两个可序列化的参数,其中第二个参数是指针 类型

并且返回一个error类型,同时必须是公开的方法。

rpc.Register 函数调用会将对象类型中所有满足 RPC 规则的对象方法注册为 RPC 函数,所有注册 的方法会放在 “HelloService” 服务空间之下。

建立一个唯一的TCP链接,并且通过 rpc.ServeConn 函数在该 TCP 链接上为对方提供 RPC 服务。

客户端 clinet

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

packagemainimport("fmt""log""net/rpc")funcmain(){client,err:=rpc.Dial("tcp","localhost:1234")iferr!=nil{log.Fatal("dialingerr:",err)}varreplystringerr=client.Call("HelloService.Hello","test_rpc",&reply)iferr!=nil{log.Fatal(err)}fmt.Println(reply)}

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

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

$gorunclient.gohello:test_rpc


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/Golang/5847.html