【RPC和Protobuf】之RPC入门

一,概念

RPCRemote 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

}

posted @ 2022-07-08 10:45  易先讯  阅读(166)  评论(0编辑  收藏  举报