Go实现RPC客户端和服务端代码
时间: 2023-09-05 14:10:09 浏览: 47
RPC(Remote Procedure Call,远程过程调用)是一种通信协议,它允许程序调用远程计算机上的服务,就像调用本地服务一样。下面是使用Go实现RPC客户端和服务端的代码示例。
### 1. 定义RPC服务
定义一个名为`HelloService`的RPC服务,该服务提供一个名为`Hello`的方法,该方法接受一个字符串类型的参数,并返回一个字符串类型的结果。
```go
type HelloService struct {}
func (s *HelloService) Hello(request string, reply *string) error {
*reply = "Hello, " + request
return nil
}
```
### 2. 注册RPC服务
在服务端,我们需要将`HelloService`注册到RPC服务中。
```go
func main() {
// 创建RPC服务器
rpcServer := rpc.NewServer()
// 注册HelloService服务
err := rpcServer.RegisterName("HelloService", new(HelloService))
if err != nil {
log.Fatal("RegisterName error:", err)
}
// 启动监听
listener, err := net.Listen("tcp", ":1234")
if err != nil {
log.Fatal("ListenTCP error:", err)
}
// 接收连接并为每个连接创建一个goroutine处理RPC请求
for {
conn, err := listener.Accept()
if err != nil {
log.Fatal("Accept error:", err)
}
go rpcServer.ServeConn(conn)
}
}
```
### 3. 调用RPC服务
在客户端,我们需要创建一个RPC客户端,连接到RPC服务,并调用`HelloService`的`Hello`方法。
```go
func main() {
// 连接RPC服务器
client, err := rpc.Dial("tcp", "localhost:1234")
if err != nil {
log.Fatal("Dial error:", err)
}
defer client.Close()
// 调用HelloService的Hello方法
var reply string
err = client.Call("HelloService.Hello", "world", &reply)
if err != nil {
log.Fatal("Call error:", err)
}
fmt.Println(reply)
}
```
这里我们通过`rpc.Dial`方法连接到RPC服务,然后通过`client.Call`方法调用`HelloService`的`Hello`方法,并将字符串`"world"`作为参数传递给该方法。最后打印`reply`变量的值。
注意:以上代码示例中省略了错误处理,实际使用时需要加上相关的错误处理代码。