1、rpc包

rpc包提供了通过网络或其他I/O连接对一个对象的导出方法的访问。

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

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

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

其中T、T1和T2都能被encoding/gob包序列化。

方法的第一个参数代表调用者提供的参数;第二个参数代表返回给调用者的参数。

方法的返回值,如果非nil,将被作为字符串回传,在客户端看来就和errors.New创建的一样。

如果返回了错误,回复的参数将不会被发送给客户端。

代码示例:

package mainimport ("errors""fmt""log""net""net/http""net/rpc"
)// Args 参数
type Args struct {A, B int
}// Quotient 商、余数
type Quotient struct {Quo, Rem int
}// Arith 算术服务
type Arith int// Multiply 乘法服务
func (*Arith) Multiply(args *Args, reply *int) error {*reply = args.A * args.Breturn nil
}// Divide 除法服务
func (*Arith) Divide(args *Args, quo *Quotient) error {if args.B == 0 {return errors.New("除数不能为零")}quo.Quo = args.A / args.Bquo.Rem = args.A % args.Breturn nil
}// 错误检查
func checkErr(err error) {if err != nil {log.Fatalln(err)}
}func main() {//开启服务arith := new(Arith)//使用默认服务对象err := rpc.Register(arith)checkErr(err)//默认路径// const (//    DefaultRPCPath   = "/_goRPC_"//  DefaultDebugPath = "/debug/rpc"// )rpc.HandleHTTP()//设置监听lis, err := net.Listen("tcp", ":1234")checkErr(err)go http.Serve(lis, nil)//客户端请求服务client, err := rpc.DialHTTP("tcp", ":1234")checkErr(err)defer client.Close()//乘法args := &Args{A: 17, B: 3}var reply interr = client.Call("Arith.Multiply", args, &reply)checkErr(err)fmt.Printf("Arith.Multiply:%d * %d = %d\n", args.A, args.B, reply)//除法quotient := new(Quotient)call := client.Go("Arith.Divide", args, quotient, nil)<-call.Donefmt.Printf("Arith.Divide:%d / %d = %d .... %d\n", args.A, args.B, quotient.Quo, quotient.Rem)
}//输出
//Arith.Multiply:17 * 3 = 51
// Arith.Divide:17 / 3 = 5 .... 2

2、客户端

2.1、type Client struct{}

Client类型代表RPC客户端。

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

2.2、常用方法

(1)func NewClient(conn io.ReadWriteCloser) *Client

NewClient返回一个新的Client,以管理对连接另一端的服务的请求。

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

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

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

DialHTTP在指定的网络和地址与在默认HTTP RPC路径监听的HTTP RPC服务端连接。

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

DialHTTPPath在指定的网络、地址和路径与HTTP RPC服务端连接。

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

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

(6)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方法会故意崩溃。

(7)func (client *Client) Close() error

关闭客户端。

3、服务端

3.1、type Server struct{}

rpc包提供默认的服务对象,可直接通过“rpc.”进行使用。

3.2、常用方法

(1)func NewServer() *Server

创建并返回一个*Server。

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

注册服务。

如果rcvr不是一个导出类型的值,或者该类型没有满足要求的方法,Register会返回错误。

Register也会使用log包将错误写入日志。

客户端可以使用格式为"Type.Method"的字符串访问这些方法,其中Type是rcvr的具体类型。

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

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

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

Accept接收监听器l获取的连接,然后服务每一个连接。

Accept会阻塞,调用者应另开线程。

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

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

(6)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)"

转载于:https://www.cnblogs.com/dzhy/p/11086905.html

golang——net/rpc包学习相关推荐

  1. golang中的包管理工具——govendor和godep简单学习

    为什么用vendor目录 依赖问题 我们知道,一个工程稍大一点,通常会依赖各种各样的包.而Go使用统一的GOPATH管理依赖包,且每个包仅保留一个版本.而不同的依赖包由各自的版本工具独立管理,所以当所 ...

  2. golang之RPC学习

    rpc 什么是rpc 我们知道Socket和HTTP采用的是类似"信息交换"模式,即客户端发送一条信息到服务端,然后(一般来说)服务器端都会返回一定的信息以表示响应.客户端和服务端 ...

  3. golang 关于golang.org/x包问题

    关于golang.org/x包问题 由于谷歌被墙,跟谷歌相关的模块无法通过go get来下载,解决方法: git clone https://github.com/golang/net.git $GO ...

  4. golang实现RPC的几种方式

    golang实现RPC的几种方式 https://studygolang.com/articles/14336 什么是RPC 远程过程调用(Remote Procedure Call,缩写为 RPC) ...

  5. 关于golang的time包总结

    目录 前言 time包详解 总结 前言 各种编程语言都少不了与时间有关的操作,因为很多判断都是基于时间,因此正确和方便的使用时间库就很重要额. golang提供了import "time&q ...

  6. Commons BeanUtils包学习2

    2019独角兽企业重金招聘Python工程师标准>>> Commons BeanUtils包学习2 博客分类: 中间件 java 一.简介: BeanUtils提供对 Java反射和 ...

  7. golang 导入自定义包_goLang引入自定义包的方法

    看完golang的基本语法后,为了模块化编程,试用了下golang的包管理,结果真踩了几个坑,总结一下吧. 一. 设置$GOPATH环境变量 golang和C或php不一样,不会自动查找当前路径下的文 ...

  8. 包学习(一款安卓端小学到高中全部课程精讲APP)

    简介 [包学习]是一款拥有小学至高中九个学年的全套学习资料的APP,名校名师重点.难点精讲 软件简单介绍 软件分为首页.必刷课.动态教辅.在学.我的五大模块. 进入软件会让你选择对应的年级,小编这里就 ...

  9. base64 golang 图片_golang基础学习-base64使用

    在近期的项目开发中对图片进行base64编码,简单使用了golang的base64包. 1.使用方法 1.1 引入包 import "encoding/base64" 1.2 ba ...

最新文章

  1. Express应用配置端口
  2. 中国电信制定物联网策略:规模市场自主经营 长尾市场集成
  3. 自定义编译gdal库
  4. Python subprocess模块
  5. 小工匠聊架构-布隆过滤器在亿级流量的电商系统中的应用
  6. google us web
  7. 关于在页面中针对不同版本的IE浏览器实现不同的JS或者CSS样式
  8. sap bom递归_SAP软件之化工行业特点01
  9. C#表格文字多收缩样式
  10. 下载虚拟化的mac 系统
  11. 我在暴躁同事小张的胁迫下学会了Go的交叉编译和条件编译
  12. 盘点2018:数据和云最受欢迎的十大精品文章
  13. Redis学习笔记三:Redis的数据类型
  14. 这几个私藏的在线工具网站!真是相见恨晚!让码农彻底解放双手!
  15. 安国主控,U盘量产,起死回生
  16. WordPress自动采集发布文章02-软件批量伪原创
  17. 苹果android投屏,iphone怎么投屏到mac?苹果手机投屏到苹果电脑方法
  18. 利用矩阵特征值求解多项式的根
  19. 投票 java_Java基础之简单投票程序
  20. 4键电子手表说明书_迪士尼手表四键说明书

热门文章

  1. SpringBatch读文件(FlatFileItemReader)写据库(MyBatisBatchItemWriter)(四)
  2. linux deepin安装virtualbox 6.1命令
  3. k8s kustomize 简明教程:安装 kustomization.yml常用字段解读
  4. CDH6.3.2默认管理端口是7180,HDFS相关端口
  5. CDH6.3.2之YARN生产环境调优(yarn 生产必做优化项)
  6. spark task和stage划分原理
  7. win10 docker desktop无法拉取镜像解决办法
  8. Golang协程goroutine和管道channel结合案例
  9. python笔试编程题_python_编程面试题
  10. prometheus接入mysqld_exporter