【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 @   易先讯  阅读(180)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示