golang中的RPC调用服务器方法
来源:互联网 发布:ubuntu网卡驱动 编辑:程序博客网 时间:2024/05/24 06:45
原文链接,参考Golang中文文档:http://docscn.studygolang.com/pkg/net/rpc/#NewServer
rpc 包提供了一个方法来通过网络或者其他的I/O连接进入对象的外部方法. 一个server注册一个对象, 标记它成为可见对象类型名字的服务。注册后,对象的外部方法就可以远程调用了。一个server可以注册多个 不同类型的对象,但是却不可以注册多个相同类型的对象。
只有满足这些标准的方法才会被远程调用视为可见;其他的方法都会被忽略:
- 方法是外部可见的。- 方法有两个参数,参数的类型都是外部可见的。- 方法的第二个参数是一个指针。- 方法有返回类型错误
事实上,方法必须看起来类似这样
func (t *T) MethodName(argType T1, replyType *T2) error
T,T1和T2可以被encoding/gob序列化。 不管使用什么编解码,这些要求都要满足。 (在未来,这些要求可能对自定义的编解码会放宽)
方法的第一个参数代表调用者提供的参数;第二个参数代表返回给调用者的参数。方法的返回值,如果是非空的话 就会被作为一个string返回,客户端会error像是被errors.New调用返回的一样。如果error返回的话, 返回的参数将会被送回给客户端。
服务断可以使用ServeConn来处理单个连接上的请求。更通用的方法,服务器可以制造一个网络监听,然后调用 Accept,或者对一个HTTP监听,处理HandleHTTP和http.Serve。
客户端希望使用服务来建立连接,然后在连接上调用NewClient来建立连接。更方便的方法就是调用Dial(DialHTTP) 来建立一个新的网络连接(一个HTTP连接)。客户端获得到的对象有两个方法,Call和Go,指定的参数有:服务和方法 指向参数的指针,接受返回结果的指针。
call方法等待远程调用完成,但Go方法是异步调用call方法,使用Call通道来标志调用完成。
除非有明确制定编解码器,否则默认使用encoding/gob来传输数据。
这是个简单的例子,服务器希望对外服务出Arith对象:
package servertype Args struct {A, B int}type Quotient struct {Quo, Rem int}type Arith intfunc (t *Arith) Multiply(args *Args, reply *int) error {*reply = args.A * args.Breturn 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.Bquo.Rem = args.A % args.Breturn 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)
- golang中的RPC调用服务器方法
- golang中的rpc包用法
- Golang RPC
- xml-rpc简单服务器调用
- Golang RPC调用例子程序(实现超时机制)
- golang与java间的json-rpc跨语言调用
- Hadoop中的RPC调用原理
- golang 包中的init调用
- JavaScript中远程级联调用(RPC)java对象中的方法并返回结果
- 用golang系统包中的处理方法获取goroutine的调用栈
- golang RPC使用
- golang rpc http
- golang rpc tcp
- Golang RPC性能测试
- golang rpc实例分析
- golang--net/rpc
- Openstack虚拟机创建中的RPC调用
- go/golang main() init()方法的调用
- 获取客户端IP地址
- Session小记
- 【1】【二分搜索】CodeForces 492D Vanya and Computer Game
- (NYoj 311) 完全背包 --完全背包模板题
- HDU 1850 Being a Good Boy in Spring Festival (Nim博弈求第一步选择数)
- golang中的RPC调用服务器方法
- POJ 1988 并查集 妙用deep数组
- Hive SQL的编译过程及生命周期
- uva 1395 Slim Span 最小生成树
- 初学者都应该看的 --- Activity的生命周期
- Android Studio中的Gradle介绍
- Codeforces Round #365 (Div. 2) B. Mishka and trip
- 瓦力模型主体完工
- linux下select编程学习