开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情
今天紧接着上一篇文章的内容,来介绍下服务端和客户端开发的一些操作步骤,上一篇文章是一个快速入门案例,今天详细介绍下其中涉及的内容
Server端
提供服务的任务,首先需要定一个服务,通过rpcx可以支持导出methods方法,作为服务的函数,这个函数必须满足以下四个要求:
- 必须是可导出类型的方法
- 接受3个参数,第一个
context.Context类型,剩余的是可导出(或内置)的类型。 - 第3个参数是一个指针
- 有一个 error 类型的返回值
import "context"
type Args struct {
A int
B int
}
type Reply struct {
C int
}
type YYQQ int
func (t *YYQQ) Mul(ctx context.Context, args *Args, reply *Reply) error {
reply.C = args.A * args.B
return nil
}
定义服务之后,需要将服务暴露给客户端调用,通过启动TCP或者UDP服务器来监听请求,服务器可以通过以下函数方法来启动监听请求和关闭
func NewServer(options ...OptionFn) *Server
func (s *Server) Close() error
func (s *Server) RegisterOnShutdown(f func())
func (s *Server) Serve(network, address string) (err error)
func (s *Server) ServeHTTP(w http.ResponseWriter, req *http.Request)
第一步使用NewServer()来创建一个服务器实例,接着调用Serve()或者ServeHTTP来监听请求,Server有些字段不能导出的
type Server struct {
Plugins PluginContainer //包含了服务器上所有的插件
// AuthFunc 可以用来鉴权
AuthFunc func(ctx context.Context, req *protocol.Message, token string) error
//可以检查客户端是否被授权了的鉴权函数
// 包含过滤后或者不可导出的字段
}
Client端
客户端使用和服务端一样的通信协议进行数据传输
type Client struct {
Conn net.Conn //代表客户端与服务端之间的连接
Plugins PluginContainer //包含客户端启动的插件
// 包含过滤后的或者不可导出的字段
}
包含以下这些方法
func (client *Client) Call(ctx context.Context, servicePath, serviceMethod string, args interface{}, reply interface{}) error
func (client *Client) Close() error
func (c *Client) Connect(network, address string) error
func (client *Client) Go(ctx context.Context, servicePath, serviceMethod string, args interface{}, reply interface{}, done chan *Call) *Call
func (client *Client) IsClosing() bool
func (client *Client) IsShutdown() bool
Call方法代表对服务同步调用,客户端在收到响应或错误前一直是阻塞的Go是异步调用,它返回一个指向Call的指针, 通过判断*Call的值来获取返回的结果或错Close会关闭所有与服务的连接,直接关闭连接,不会等待未完成的请求结束IsClosing返回客户端是否关闭着,不会接受新的调用IsShutdown返回客户端是否不会接受服务返回的响应
总结
今天浅谈了Go与RPC(三),这章介绍了客户端和服务端的内容,接下来会继续深入了解RPC的相关知识,对于一个刚入门的我来说,还有许多地方需要学习,有错误的地方欢迎大家指出,共同进步!!