【RPC和Protobuf】之RPC入门
一,概念
RPC:Remote procedure call(远程过程调用),分布式系统中不同节点之间流行的通信方式
服务端:
注:
1、执行下面的代码之后,会相应的启动一个tcp进程
C:\Users\lWX1011939>netstat -aon|findstr 1234 1234是代码中指定的端口号
TCP 127.0.0.1:1234 0.0.0.0:0 LISTENING 10960
2、终止进程:C:\Users\lWX1011939>taskkill /F /pid 10960 /F:表示强制终止
成功: 已终止 PID 为 10960 的进程。
package main
import (
"log"
"net"
"net/rpc"
)
type HelloService struct {
//构造一个HelloService类型
}
//一个满足rpc规则的方法(方法只能有两个可序列化的参数,第二个参数是指针类型,方法返回error类型)
func (p *HelloService) Hello(request string, reply *string) error {
*reply = "hello " + request
return nil
}
func main() {
//rpc.RegisterName会将传入的对象类型中所有满足RPC规则的方法注册为RPC函,比如这里的Hello函数
rpc.RegisterName("HelloService", new(HelloService))
//建立唯一的tcp链接
listener, listenErrInfo := net.Listen("tcp", "localhost:1234")
if listenErrInfo != nil {
log.Fatal("Listen tcp error by: ", listenErrInfo)
}
connector, acceptErrInfo := listener.Accept()
if acceptErrInfo != nil {
log.Fatal("Accept error : ", acceptErrInfo)
}
//通过rpc.ServeConn函数在该TCP链接上为对方提供RPC服务
rpc.ServeConn(connector)
}
客户端:
package main
import (
"fmt"
"log"
"net/rpc"
)
func main() {
//客户端请求HelloService服务。首先通过rpc.Dial拨号RPC服务
client, dialErrInfo := rpc.Dial("tcp", "localhost:1234")
if dialErrInfo != nil {
log.Fatal("Dial error: ", dialErrInfo)
}
var reply string
//通过client.Call调用具体的RPC方法, 第一个参数是用点号链接的RPC服务名字和方法名字,第二和第三个参数分别我们定义RPC方法的两个参数
callErrInfo := client.Call("HelloService.Hello", "hello", &reply)
if callErrInfo != nil {
log.Fatal("Call error info: ", callErrInfo)
}
fmt.Println("reply: ", reply) 这里会打印出reply: hello hello
}
本文来自博客园,作者:易先讯,转载请注明原文链接:https://www.cnblogs.com/gongxianjin/p/16457451.html