RPC(Remote Rrocedure Call),远程过程调用
RPC是一个通信协议,为通信程序之间携带信息数据。RPC是分布式系统中不同节点之间流行的通信方式
RPC采用C/S模式,请求程序就是一个客户机,而服务提供程序就是一个服务器。
Server:在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息。
Client:客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息,获得进程结果。
下面介绍go-RPC。官方的net/rpc库实现的RPC方法
统一协议为tcp,本机启动两个程序,实现server端返回hello world字符串:
1 client
2 server(端口为8086)
主要通信参数:
tcpStr := "tcp"
serverUrl := "127.0.0.1:8086"
2.1 RPC Server
首先定义接口数据struct:
type Response struct {
Data []byte
}
定义接口struct(函数):
type LhServer struct {
}
func (s *LhServer) Rec(nul *struct{}, res *Response) error{
*res = Response{Data: []byte("hello world!")}
return nil
}
这里的Rec就是serviceMethod函数,返回hello world字符串。
第1步:rpc注册接口struct(函数):
err:=rpc.Register(new(server.LhServer))
if err!=nil{
fmt.Println("register publisher failed :",err.Error())
}else{
fmt.Println("register publisher sucessed:")
}
第2步: 启动server listen连接:
listenCon,err:=net.Listen(tcpStr,serverUrl)
if err!=nil{
fmt.Println("listern tcp failed:",err.Error())
}else{
fmt.Println("listern tcp sucessed:", serverUrl)
}
defer listenCon.Close()
第3步:启动rpc server listen连接:
rpc.Accept(listenCon)
fmt.Println("rpc accept listern:")
启动函数,运行结果如下:
首先定义接口数据struct:
type Response struct {
Data []byte
}
定义接口函数的字符串:
serviceMethod:="LhServer.Rec"
注意:接口数据struct、接口函数的字符串和server端一定要一致。
第1步: 建立服务器端的连接:
clientCon, err := rpc.Dial(tcpStr, serverUrl)
if err != nil {
fmt.Println("dial failed..", err.Error())
}else{
fmt.Println("dial successed..", serverUrl)
}
第2步:调用服务器端的接口struct(函数):
var res client.Response
err = clientCon.Call(serviceMethod, &struct{}{}, &res)
if err != nil {
fmt.Println("failed to Call..", err.Error())
}else{
resStr := string(res.Data)
fmt.Println("rpc调用结果:", resStr)
}
clientCon.Close()
启动函数,运行结果如下:
代码详见:
https://gitee.com/alifeidao/go-mircroservice-simple
chapter1-client
chapter1-server
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)