golang中的RPC调用服务器方法
2016-08-05 20:29
225 查看
原文链接,参考Golang中文文档:http://docscn.studygolang.com/pkg/net/rpc/#NewServer
rpc 包提供了一个方法来通过网络或者其他的I/O连接进入对象的外部方法. 一个server注册一个对象, 标记它成为可见对象类型名字的服务。注册后,对象的外部方法就可以远程调用了。一个server可以注册多个 不同类型的对象,但是却不可以注册多个相同类型的对象。
只有满足这些标准的方法才会被远程调用视为可见;其他的方法都会被忽略:
事实上,方法必须看起来类似这样
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对象:
服务端调用(使用HTTP服务):
在这个时候,客户端可以看见服务“Arith”,并且有“Arith.Multiply”方法和“Arith.Divide”方法。 调用其中一个,客户端首先连接服务:
当它要调用远程服务的时候:
or
服务端的实现需要为客户端提供一个简单的,类型安全服务。
也就是当服务端register了某个对象,就可以调用挂在这个对象上的所有方法
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 server 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”,并且有“Arith.Multiply”方法和“Arith.Divide”方法。 调用其中一个,客户端首先连接服务:
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)
or
// 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.
服务端的实现需要为客户端提供一个简单的,类型安全服务。
也就是当服务端register了某个对象,就可以调用挂在这个对象上的所有方法
相关文章推荐
- golang rpc的两种调用方法
- golang两种调用rpc的方法
- javascript 调用服务器方法
- ASP.net AJAX 调用PageMethods实例(javascript调用服务器页面方法)
- xml-rpc简单服务器调用
- MSSQL 中存储过程跨服务器调用存储过程的时候,编辑Link server 的RPC的时候报错
- AJAXRPC: javascript直接调用服务端方法
- JavaScript调用Applet方法,Applet异步调用远程RPC。
- ASPX页面的button服务器控件调用JS方法
- 安卓客户端连接服务器调用数据库方法
- 提供一个在测试环境中,监控应用服务器的外部接口调用的方法(高峰)
- ajax调用服务器c#方法步骤
- ASP.net AJAX 调用PageMethods实例(javascript调用服务器页面方法)
- 自定义服务器控件通过反射调用页面方法
- 用服务器控件在后台调用前台客户端JS方法
- JavaScript中远程级联调用(RPC)java对象中的方法并返回结果
- Blue框架的基本教程二:客户端调用服务器的方法
- ASP.net AJAX 调用PageMethods实例(javascript调用服务器页面方法)
- Axis2 的 RPC 和 AXIOM 服务端方法的两种调用方式
- js调用.NET服务器控件及C#后台方法