go RPC 实现了简单的远程调用过程

本文详细介绍了如何在Go语言中使用RPC(RemoteProcedureCall)创建服务端与客户端,通过`FoodService`结构体和`SayName`方法展示远程调用过程,包括服务端监听、客户端连接和数据传输。
摘要由CSDN通过智能技术生成

在运行go文件的地方:新建server(服务端)与client(客户端)目录,在里面都写上main.go文件

server(服务端)main.go

package main
import (
"fmt"
"net"
"net/rpc"
)
//定义了一个结构体 FoodService
/*FoodService 结构体用于定义一个远程服务,其中包含了一个名为 SayName 的远程方法。
客户端可以通过调用这个方法来请求服务端对特定任务进行处理,
比如在输入的请求字符串前面添加固定的前缀字符串。*/
type FoodService struct{
	
	
}
//SayName 方法是我们在服务端定义的远程函数,它接收一个字符串参数 request,并返回一个字符串指针 resp 和一个错误(error)。
func (f *FoodService) SayName(request string,resp *string) error{
	*resp="cyg"+request
	return nil
}
func main(){
	listener,err:=net.Listen("tcp",":9090")
	if err!=nil{
		fmt.Println(err)
		return 
	}
	//注册了FoodService结构体代表了与RPC关联起来
	err=rpc.RegisterName("FoodService",&FoodService{})
	if err != nil {
		fmt.Println(err)
		return
	}
	/*然后程序会阻塞在 listener.Accept() 上,
	等待客户端的连接请求。一旦有客户端连接进来,就会调用 rpc.ServeConn 来处理该连接上的所有 RPC 请求。*/
	conn,err:=listener.Accept()
	if err != nil {
		fmt.Println(err)
		return
	}
	rpc.ServeConn(conn)
}

client:main.go(客户端)

package main

import (
	"fmt"
	"net/rpc"
)
func main(){
	//首先通过 rpc.Dial 连接到指定的 RPC 服务端
	c,err:=rpc.Dial("tcp","localhost:9090")
	if err != nil {
		fmt.Println(err)
		return
	}
	reply:=""
	//然后调用 c.Call 来远程调用 FoodService 中的 SayName 方法,并传入参数 "cxyg"。
	err=c.Call("FoodService.SayName","cxyg",&reply)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(reply)//最后打印出从远程服务器返回的结果。
}

首先运行服务端的main.go文件

然后不要关闭服务端的main.go运行文件。然后运行客户端的main.go文件

在这里插入图片描述

什么事RPC?

服务端指的是接收客户端请求并提供相应服务的程序。当客户端发起远程调用请求时,服务端程序会接收这个请求,并执行相应的远程过程或方法,然后将结果返回给客户端。

具体来说,在RPC中:

服务端负责实现远程方法或过程,并对外提供这些方法的调用接口。
客户端发起调用请求,服务端接收请求并执行相应的方法,最终将结果返回给客户端。

rpc流程:监听并接受客户端的连接请求。
解析客户端发送的请求,确定需要执行的远程方法。
执行相应的远程方法或过程。
将执行结果返回给客户端。

Stub(存根):客户端和服务端之间的代理,用于封装和传输数据。

在 Go 中,存根通常是通过创建一个实现了特定接口的结构体来实现的。这个结构体将接口的方法进行实现

传输协议:定义客户端和服务端之间通信的规则和方式。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贵哥的编程之路(热爱分享)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值