首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

net/rpc

  • import "net/rpc"
  • 概况
  • 索引
  • 子目录

概况

软件包 rpc 通过网络或其他 I/O 连接提供对对象的导出方法的访问。服务器注册一个对象,使其作为一个服务显示为对象类型的名称。注册后,对象的导出方法将可以远程访问。服务器可以注册多个不同类型的对象(服务),但注册多个相同类型的对象是错误的。

只有符合这些标准的方法才能用于远程访问; 其他方法将被忽略:

- the method's type is exported.
- the method is exported.
- the method has two arguments, both exported (or builtin) types.
- the method's second argument is a pointer.
- the method has return type error.

实际上,该方法必须看起来像

func (t *T) MethodName(argType T1, replyType *T2) error

T1 和 T2 可以通过 encoding/gob 进行编组。即使使用不同的编解码器,这些要求也适用。(将来,这些要求可能会因为自定义编解码器而变差。)

该方法的第一个参数表示由调用者提供的参数; 第二个参数表示要返回给调用者的结果参数。该方法的返回值如果非零(nil),会作为字符串传回,在客户端就像由 errors.New 创建的那样。如果返回错误,答复参数将不会被发送回客户端。

服务器可以通过调用 ServeConn 来处理单个连接上的请求。更典型的是,它将创建一个网络监听器并调用 Accept,或者对于 HTTP 监听器 HandleHTTP 和 http.Serve 。

客户希望使用该服务建立连接,然后在连接上调用 NewClient 。便捷功能 Dial(DialHTTP)执行原始网络连接(HTTP 连接)的两个步骤。生成的 Client 对象具有 Call 和 Go 两个方法,它们指定要调用的服务和方法,包含参数的指针以及用于接收结果参数的指针。

Call 方法等待远程调用完成,而 Go 方法异步启动调用,并使用 Call 结构的完成通道发送完成信号。

除非设置了明确的编解码器,否则使用包 encoding / gob 传输数据。

这是一个简单的例子。服务器希望导出 Arith 类型的对象:

package server

import "errors"

type Args struct {
	A, B int
}

type Quotient struct {
	Quo, Rem int
}

type Arith int

func (t *Arith) Multiply(args *Args, reply *int) error {
	*reply = args.A * args.B
	return nil
}

func (t *Arith) Divide(args *Args, quo *Quotient) error {
	if args.B == 0 {
		return errors.New("divide by zero")
	}
	quo.Quo = args.A / args.B
	quo.Rem = args.A % args.B
	return nil
}

服务器调用(对于 HTTP 服务):

arith := new(Arith)
rpc.Register(arith)
rpc.HandleHTTP()
l, e := net.Listen("tcp", ":1234")
if e != nil {
	log.Fatal("listen error:", e)
}
go http.Serve(l, nil)

此时,客户可以使用“Arith.Multiply”和“Arith.Divide”方法查看“Arith”服务。要调用它,客户端首先拨打服务器:

client, err := rpc.DialHTTP("tcp", serverAddress + ":1234")
if err != nil {
	log.Fatal("dialing:", err)
}

然后它可以进行远程调用:

// Synchronous call
args := &server.Args{7,8}
var reply int
err = client.Call("Arith.Multiply", args, &reply)
if err != nil {
	log.Fatal("arith error:", err)
}
fmt.Printf("Arith: %d*%d=%d", args.A, args.B, reply)

// Asynchronous call
quotient := new(Quotient)
divCall := client.Go("Arith.Divide", args, quotient, nil)
replyCall := <-divCall.Done	// will be equal to divCall
// check errors, print, etc.

服务器实现通常会为客户端提供一个简单的,类型安全的包装器。

net / rpc 软件包被冻结,不接受新的功能。

索引

  • 常量
  • 变量
  • func Accept(lis net.Listener)
  • func HandleHTTP()
  • func Register(rcvr interface{}) error
  • func RegisterName(name string, rcvr interface{}) error
  • func ServeCodec(codec ServerCodec)
  • func ServeConn(conn io.ReadWriteCloser)
  • func ServeRequest(codec ServerCodec) error
  • type Call
  • type Client
  • func Dial(network, address string) (*Client, error)
  • func DialHTTP(network, address string) (*Client, error)
  • func DialHTTPPath(network, address, path string) (*Client, error)
  • func NewClient(conn io.ReadWriteCloser) *Client
  • func NewClientWithCodec(codec ClientCodec) *Client
  • func (client *Client) Call(serviceMethod string, args interface{}, reply interface{}) error
  • func (client *Client) Close() error
  • func (client *Client) Go(serviceMethod string, args interface{}, reply interface{}, done chan *Call) *Call
  • type ClientCodec
  • type Request
  • type Response
  • type Server
  • func NewServer() *Server
  • func (server *Server) Accept(lis net.Listener)
  • func (server *Server) HandleHTTP(rpcPath, debugPath string)
  • func (server *Server) Register(rcvr interface{}) error
  • func (server *Server) RegisterName(name string, rcvr interface{}) error
  • func (server *Server) ServeCodec(codec ServerCodec)
  • func (server *Server) ServeConn(conn io.ReadWriteCloser)
  • func (server *Server) ServeHTTP(w http.ResponseWriter, req *http.Request)
  • func (server *Server) ServeRequest(codec ServerCodec) error
  • type ServerCodec
  • type ServerError
  • func (e ServerError) Error() string

包文件

常量

const (
        // Defaults used by HandleHTTP
        DefaultRPCPath   = "/_goRPC_"
        DefaultDebugPath = "/debug/rpc"
)

变量

DefaultServer 是 * Server 的默认实例。

var DefaultServer = NewServer()
var ErrShutdown = errors.New("connection is shut down")
func Accept(lis net.Listener)

Accept 接受监听器上的连接,并为每个传入连接向 DefaultServer 提供请求。接受块; 调用者通常在 go 语句中调用它。

func HandleHTTP(显示源文件)

func HandleHTTP()

HandleHTTP 在 DefaultRPCPath 上向 DefaultServer 注册 RPC 消息的 HTTP 处理程序,并在 DefaultDebugPath 上注册一个调试处理程序。仍然需要调用 http.Serve(),通常在 go 语句中。

func Register(rcvr interface{}) error

Register 在 DefaultServer 中发布接收者的方法。

func RegisterName(显示源文件)

func RegisterName(name string, rcvr interface{}) error

RegisterName 与 Register 类似,但使用提供的名称来代替接收者的具体类型。

func ServeCodec(显示源文件)

func ServeCodec(codec ServerCodec)

ServeCodec 就像 ServeConn,但使用指定的编解码器来解码请求并对响应进行编码。

func ServeConn(显示源文件)

func ServeConn(conn io.ReadWriteCloser)

ServeConn 在一个连接上运行 DefaultServer。ServeConn 块,服务于连接,直到客户端挂断。调用者通常在 go 语句中调用 ServeConn 。ServeConn 在连接上使用 gob wire 格式(请参阅软件包 gob)。要使用备用编解码器,请使用 ServeCodec 。

func ServeRequest(显示源文件)

func ServeRequest(codec ServerCodec) error

ServeRequest 与 ServeCodec 类似,但同步提供单个请求。完成后它不会关闭编解码器。

Call 表示一个活动的 RPC 。

type Call struct {
        ServiceMethod string      // The name of the service and method to call.
        Args          interface{} // The argument to the function (*struct).
        Reply         interface{} // The reply from the function (*struct).
        Error         error       // After completion, the error status.
        Done          chan *Call  // Strobes when call is complete.
}

Client 代表一个 RPC 客户端。可能有多个与一个客户端相关的未决呼叫,并且一个客户端可能会被多个 goroutine 同时使用。

type Client struct {
        // contains filtered or unexported fields
}
func Dial(network, address string) (*Client, error)

Dial 连接到指定网络地址的 RPC 服务器。

func DialHTTP(network, address string) (*Client, error)

DialHTTP 连接到指定网络地址的 HTTP RPC 服务器,该地址监听默认的 HTTP RPC 路径。

func DialHTTPPath(显示源文件)

func DialHTTPPath(network, address, path string) (*Client, error)

DialHTTPPath 通过指定的网络地址和路径连接到 HTTP RPC 服务器。

func NewClient(显示源文件)

func NewClient(conn io.ReadWriteCloser) *Client

NewClient 返回一个新的客户端来处理对连接另一端的一组服务的请求。它向连接的写入端添加一个缓冲区,以便将 header 和 payload 作为一个单元发送。

func NewClientWithCodec(显示源文件)

func NewClientWithCodec(codec ClientCodec) *Client

NewClientWithCodec 与 NewClient 类似,但使用指定的编解码器对请求进行编码和解码响应。

func (*Client) Call(显示源文件)

func (client *Client) Call(serviceMethod string, args interface{}, reply interface{}) error

Call 调用指定的函数,等待它完成,并返回其错误状态。

func (*Client) Close(显示源文件)

func (client *Client) Close() error

Close 调用底层编解码器的 Close 方法。如果连接已关闭,则返回 ErrShutdown 。

func (*Client) Go(显示源文件)

func (client *Client) Go(serviceMethod string, args interface{}, reply interface{}, done chan *Call) *Call

Go 异步调用该函数。它返回表示调用的 Call 结构。完成通道将通过返回相同的呼叫对象在呼叫完成时发出信号。如果完成,则 Go 将分配一个新频道。如果非零,则必须进行缓冲或 Go 会故意崩溃。

type ClientCodec(显示源文件)

ClientCodec 实现 RPC 请求的写入和读取 RPC 会话客户端的 RPC 响应。客户端调用 WriteRequest 向连接写入请求,并成对调用 ReadResponseHeader 和 ReadResponseBody 以读取响应。客户在完成连接后调用 Close 。可以使用零参数调用 ReadResponseBody,以强制读取响应主体并丢弃。

type ClientCodec interface {
        // WriteRequest must be safe for concurrent use by multiple goroutines.
        WriteRequest(*Request, interface{}) error
        ReadResponseHeader(*Response) error
        ReadResponseBody(interface{}) error

        Close() error
}

Request 是每个 RPC 调用之前写入的头文件。它在内部使用,但在此处记录为对调试的帮助,例如分析网络流量时。

type Request struct {
        ServiceMethod string // format: "Service.Method"
        Seq           uint64 // sequence number chosen by client
        // contains filtered or unexported fields
}

Response 是每个 RPC 返回之前写入的头文件。它在内部使用,但在此处记录为对调试的帮助,例如分析网络流量时。

type Response struct {
        ServiceMethod string // echoes that of the Request
        Seq           uint64 // echoes that of the request
        Error         string // error, if any.
        // contains filtered or unexported fields
}

Server 代表一个 RPC 服务器。

type Server struct {
        // contains filtered or unexported fields
}

func NewServer(显示源文件)

func NewServer() *Server

NewServer 返回一个新的服务器。

func (*Server) Accept(显示源文件)

func (server *Server) Accept(lis net.Listener)

Accept 接受侦听器上的连接并为每个传入连接提供请求。接受阻塞,直到侦听器返回非零错误。调用者通常在 go 语句中调用 Accept 。

func (*Server) HandleHTTP(显示源文件)

func (server *Server) HandleHTTP(rpcPath, debugPath string)

HandleHTTP 为 rpcPath 上的 RPC 消息注册一个 HTTP 处理程序,并在 debugPath 上注册一个调试处理程序。仍然需要调用 http.Serve(),通常在 go 语句中。

func (*Server) Register(显示源文件)

func (server *Server) Register(rcvr interface{}) error

Register 在服务器中发布满足以下条件的接收器值的方法集合:

- exported method of exported type
- two arguments, both of exported type
- the second argument is a pointer
- one return value, of type error

如果接收方不是导出类型或没有合适的方法,它将返回一个错误。它还使用包日志记录错误。客户端使用“Type.Method”形式的字符串访问每个方法,其中 Type 是接收者的具体类型。

func (*Server) RegisterName(显示源文件)

func (server *Server) RegisterName(name string, rcvr interface{}) error

RegisterName 与 Register 类似,但使用提供的名称来代替接收者的具体类型。

func (*Server) ServeCodec(显示源文件)

func (server *Server) ServeCodec(codec ServerCodec)

ServeCodec 就像 ServeConn,但使用指定的编解码器来解码请求并对响应进行编码。

func (*Server) ServeConn(显示源文件)

func (server *Server) ServeConn(conn io.ReadWriteCloser)

ServeConn 在单个连接上运行服务器。ServeConn 块,服务于连接,直到客户端挂断。调用者通常在 go 语句中调用 ServeConn 。ServeConn 在连接上使用 gob wire 格式(请参阅软件包 gob)。要使用备用编解码器,请使用 ServeCodec 。

func (*Server) ServeHTTP(显示源文件)

func (server *Server) ServeHTTP(w http.ResponseWriter, req *http.Request)

ServeHTTP 实现了一个应答 RPC 请求的 http.Handler 。

func (*Server) ServeRequest(显示源文件)

func (server *Server) ServeRequest(codec ServerCodec) error

ServeRequest 与 ServeCodec 类似,但同步提供单个请求。完成后它不会关闭编解码器。

type ServerCodec(显示源文件)

ServerCodec 实现读取 RPC 请求并为 RPC 会话的服务器端写入 RPC 响应。服务器成对调用 ReadRequestHeader 和 ReadRequestBody 来读取来自连接的请求,并且它调用 WriteResponse 来写回响应。服务器在连接完成后调用 Close 。可以使用零参数调用 ReadRequestBody 来强制请求的主体被读取和丢弃。

type ServerCodec interface {
        ReadRequestHeader(*Request) error
        ReadRequestBody(interface{}) error
        // WriteResponse must be safe for concurrent use by multiple goroutines.
        WriteResponse(*Response, interface{}) error

        Close() error
}

type ServerError(显示源文件)

ServerError 表示从 RPC 连接的远程端返回的错误。

type ServerError string

func (ServerError) Error(显示源文件)

func (e ServerError) Error() string

子目录

Name

Synopsis

jsonrpc

包 jsonrpc 为 rpc 包实现了一个 JSON-RPC 1.0 ClientCodec 和 ServerCodec

扫码关注腾讯云开发者

领取腾讯云代金券