go grpc

package rpc

import "net/rpc"

rpc包提供了通过网络或其他I/O连接对一个对象的导出方法的访问。服务端注册一个对象,使它作为一个服务被暴露,服务的名字是该对象的类型名。注册之后,对象的导出方法就可以被远程访问。服务端可以注册多个不同类型的对象(服务),但注册具有相同类型的多个对象是错误的。

只有满足如下标准的方法才能用于远程访问,其余方法会被忽略:

- 方法是导出的
- 方法有两个参数,都是导出类型或内建类型
- 方法的第二个参数是指针
- 方法只有一个error接口类型的返回值

事实上,方法必须看起来像这样:

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

其中T、T1和T2都能被encoding/gob包序列化。这些限制即使使用不同的编解码器也适用。(未来,对定制的编解码器可能会使用较宽松一点的限制)

方法的第一个参数代表调用者提供的参数;第二个参数代表返回给调用者的参数。方法的返回值,如果非nil,将被作为字符串回传,在客户端看来就和errors.New创建的一样。如果返回了错误,回复的参数将不会被发送给客户端。

服务端可能会单个连接上调用ServeConn管理请求。更典型地,它会创建一个网络监听器然后调用Accept;或者,对于HTTP监听器,调用HandleHTTP和http.Serve。

想要使用服务的客户端会创建一个连接,然后用该连接调用NewClient。

更方便的函数Dial(DialHTTP)会在一个原始的连接(或HTTP连接)上依次执行这两个步骤。

生成的Client类型值有两个方法,Call和Go,它们的参数为要调用的服务和方法、一个包含参数的指针、一个用于接收接个的指针。

Call方法会等待远端调用完成,而Go方法异步的发送调用请求并使用返回的Call结构体类型的Done通道字段传递完成信号。

除非设置了显式的编解码器,本包默认使用encoding/gob包来传输数据。

call

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ntEFoAbx-1595164137557)(go–rpc.assets/1588562999206.png)]

client

type Client

type Client struct {
    // 内含隐藏或非导出字段
}

Client类型代表RPC客户端。同一个客户端可能有多个未返回的调用,也可能被多个go程同时使用。

返回一个 *Client

func NewClient 建立一个client

func NewClient(conn io.ReadWriteCloser) *Client

NewClient返回一个新的Client,以管理对连接另一端的服务的请求。它添加缓冲到连接的写入侧,以便将回复的头域和有效负载作为一个单元发送。

func NewClientWithCodec 使用指定编码格式

func NewClientWithCodec(codec ClientCodec) *Client

NewClientWithCodec类似NewClient,但使用指定的编解码器,以编码请求主体和解码回复主体。

func Dial 建立RPC连接

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

Dial在指定的网络和地址与RPC服务端连接。

func DialHTTP 建立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 (*Client) Call 调用执行方法

调用的方法名称 传递的参数 返回的参数,返回的error

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

Call调用指定的方法,等待调用返回,将结果写入reply,然后返回执行的错误状态。

func (*Client) Go 异步调用,返回Done字段

和Call 差不多,只不多返回的是*Call

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

Go异步的调用函数。本方法Call结构体类型指针的返回值代表该次远程调用。通道类型的参数done会在本次调用完成时发出信号(通过返回本次Go方法的返回值)。如果done为nil,Go会申请一个新的通道(写入返回值的Done字段);如果done非nil,done必须有缓冲,否则Go方法会故意崩溃。

func (*Client) Close 关闭连接

func (client *Client) Close() erro

server

type Server

type Server struct {
    // 内含隐藏或非导出字段
}

Server代表RPC服务端。

func NewServer 创建RPC服务端

func NewServer() *Server

NewServer创建并返回一个*Server。

func (*Server) Register 注册RPC服务

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

Register在server注册并公布rcvr的方法集中满足如下要求的方法:

- 方法是导出的
- 方法有两个参数,都是导出类型或内建类型
- 方法的第二个参数是指针
- 方法只有一个error接口类型的返回值

如果rcvr不是一个导出类型的值,或者该类型没有满足要求的方法,Register会返回错误。Register也会使用log包将错误写入日志。客户端可以使用格式为"Type.Method"的字符串访问这些方法,其中Type是rcvr的具体类型。

func (*Server) RegisterName 注册RPC服务

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

RegisterName类似Register,但使用提供的name代替rcvr的具体类型名作为服务名。

func (*Server) Accept 阻塞服务

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

Accept接收监听器l获取的连接,然后服务每一个连接。Accept会阻塞,调用者应另开线程:“go server.Accept(l)”

func (*Server) ServeConn 阻塞执行服务

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

ServeConn在单个连接上执行server。ServeConn会阻塞,服务该连接直到客户端挂起。调用者一般应另开线程调用本函数:“go server.ServeConn(conn)”。ServeConn在该连接使用gob(参见encoding/gob包)有线格式。要使用其他的编解码器,可调用ServeCodec方法。

func (*Server) ServeCodec 使用指定的编码器回复

func (server *Server) ServeCodec(codec ServerCodec)

ServeCodec类似ServeConn,但使用指定的编解码器,以编码请求主体和解码回复主体。

func (*Server) ServeRequest 异步服务

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

ServeRequest类似ServeCodec,但异步的服务单个请求。它不会在调用结束后关闭codec。

func (*Server) ServeHTTP 创建服务回调服务

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

ServeHTTP实现了回应RPC请求的http.Handler接口。

func (*Server) HandleHTTP

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

HandleHTTP注册server的RPC信息HTTP处理器对应到rpcPath,注册server的debug信息HTTP处理器对应到debugPath。HandleHTTP会注册到http.DefaultServeMux。之后,仍需要调用http.Serve(),一般会另开线程:“go http.Serve(l, nil)”

func Register 注册服务方法

func Register(rcvr interface{}) error

Register在DefaultServer注册并公布rcvr的方法。

func RegisterName 注册服务方法

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

RegisterName函数类似Register函数,但使用提供的name代替rcvr的具体类型名作为服务名。

func Accept 阻塞监听服务

func Accept(lis net.Listener)

Accept接收监听器l获取的连接,然后将每一个连接交给DefaultServer服务。Accept会阻塞,调用者应另开线程:“go server.Accept(l)”

func ServeConn 阻塞服务

func ServeConn(conn io.ReadWriteCloser)

ServeConn在单个连接上执行DefaultServer。ServeConn会阻塞,服务该连接直到客户端挂起。调用者一般应另开线程调用本函数:“go ServeConn(conn)”。ServeConn在该连接使用gob(参见encoding/gob包)有线格式。要使用其他的编解码器,可调用ServeCodec方法。

func ServeCodec 指定编码处理

func ServeCodec(codec ServerCodec)

ServeCodec类似ServeConn,但使用指定的编解码器,以编码请求主体和解码回复主体。

func ServeRequest 异步单请求处理

func ServeRequest(codec ServerCodec) error

ServeRequest类似ServeCodec,但异步的服务单个请求。它不会在调用结束后关闭codec。

func HandleHTTP 服务转发

func HandleHTTP()

HandleHTTP函数注册DefaultServer的RPC信息HTTP处理器对应到DefaultRPCPath,和DefaultServer的debug处理器对应到DefaultDebugPath。HandleHTTP函数会注册到http.DefaultServeMux。之后,仍需要调用http.Serve(),一般会另开线程:“go http.Serve(l, nil)”

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

a...Z

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

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

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

打赏作者

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

抵扣说明:

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

余额充值