`
vsong
  • 浏览: 9049 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

使用Go进行RPC编程

 
阅读更多

官方提供的 net/rpc 包中提供了远程服务调用(RPC)功能。通过这个包,我们可以发布出服务,供远程调用;同时,客户端通过这个包访问服务端的方法。

 

和其他服务端应用程序一样,我们需要开启一个监听程序,来接收客户端发起的网络请求。

//启动服务器
func Start(protocal string, port string){

	rpc.HandleHTTP()

	l, e:= net.Listen(protocal, port)

	if e != nil{
		log.Panic("listen error: ", e)
	}

	http.Serve(l, nil)
}

 

服务端可以注册对象,暴露出该对象提供的方法,供客户端使用

//注册服务
func Register(v interface{}){

	rpc.Register(v)
}

 我们可以定义自己的服务端对象,通过上述方式发布服务。

	//注册服务
	server.Register(new(MyService))

	//启动服务器
	go server.Start("tcp", ":8086")

 这样,通过新建一个goroutine,发布好了自己定义的服务MyService。客户端则可以指定服务端的地址进行访问。

 

//根据地址调用服务,传入参数,获得结果
func CallTarget(address string, service string, args interface{}, reply interface{}) error{

	client , err := rpc.DialHTTP("tcp", address)

	if err != nil{
		log.Fatal("dialing ", err)
	}

	err = client.Call(service, args, reply)

	return err
}

 

通过进一步的代码封装,可以隐藏调用细节。

 

const(
	Address = "127.0.0.1:8086"
)

func (myService *MyService) SayHello(name string) string{
	var result string
	err := client.Call(Address, &name, &result)
	if err != nil{
		panic(err)
	}
	return result
}

 这样客户端就可以简便的使用rpc服务调用了

 

func main(){

	var myService MyService

	log.Println(myService.SayHello("liusongwei"))
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics