浅谈Go与RPC(三)

98 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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的相关知识,对于一个刚入门的我来说,还有许多地方需要学习,有错误的地方欢迎大家指出,共同进步!!