go 基于tcp的RPC远程调用

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

server(服务端)main.go

package main

import (
	"fmt"
	"net"
	"net/rpc"
	"net/rpc/jsonrpc"
)
/*创建一个 FoodService 结构体,其中包含了一个 SayName 方法,用于处理客户端发送过来的请求,并返回相应的响应。*/
type FoodService struct {
}

func (f *FoodService) SayName(request string, resp *string) error {
	*resp = "您点的菜是" + request
	return nil

}

func main() {
	//在 main 函数中,通过 net.Listen 方法监听本地 9090 端口的 TCP 连接。
	listen, err := net.Listen("tcp", "localhost:9090")
	if err != nil {
		fmt.Println(err)
		return
	}
	//使用 rpc.RegisterName 注册了一个名为 "FoodService" 的 RPC 服务,并将其与 FoodService 结构体关联起来。
	err = rpc.RegisterName("FoodService", &FoodService{})
	if err != nil {
		fmt.Println(err)
		return
	}
	/*进入一个无限循环,不断等待客户端的连接请求,一旦有客户端连接进来,就会创建一个新的协程(goroutine)来处理该连接。*/
	for {
		// 等待请求,然后接受处理 , wait request and conncetion, 返回下一个 请求者。
		conn, err := listen.Accept()
		if err != nil {
			fmt.Println(err)
			return
		}

	
		go rpc.ServeCodec(jsonrpc.NewServerCodec(conn))
//jsonrpc.NewServerCodec 和 rpc.ServeCodec 的组合使得服务端能够处理 JSON-RPC 格式的请求和响应,实现了基于 JSON 格式的远程过程调用(RPC)功能。这样,客户端和服务端之间就可以通过 JSON 格式进行数据交换,实现远程方法调用。	}

}
}

client:main.go(客户端)

package main

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

func main() {
	/*在 main 函数中,通过 net.Dial 方法连接到本地 9090 端口的 TCP 服务端。*/
	c, err := net.Dial("tcp", "localhost:9090")
	if err != nil {
		fmt.Println(err)
		return
	}

	reply := ""
//创建一个使用 JSON-RPC 编解码器的客户端。
	client := rpc.NewClientWithCodec(jsonrpc.NewClientCodec(c))
	//client.Call 方法的作用是向远程服务端发送一个请求,并等待服务端处理完请求后返回结果。其基本语法通常为:
	err = client.Call("FoodService.SayName", "cy666g", &reply)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(reply)

}

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

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

在这里插入图片描述

什么事RPC?

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

具体来说,在RPC中:

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

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

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

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

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

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

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

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

打赏作者

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

抵扣说明:

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

余额充值