Go   发布时间:2022-04-09  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了golang中的RPC调用服务器方法大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

原文链接,参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监听,处理Handlehttphttp.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",quotient,nil)
replyCall := <-divCall.Done	// will be equal to divCall
// check errors,print,etc.

服务端的实现需要为客户端提供一个简单的,类型安全服务。

也就是当服务端register了某个对象,就可以调用在这个对象上的所有方法

大佬总结

以上是大佬教程为你收集整理的golang中的RPC调用服务器方法全部内容,希望文章能够帮你解决golang中的RPC调用服务器方法所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。