【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
}
最新文章
- Windows 双网卡指定网络出口
- 在android studio 中使用applicationid的问题
- NFinal中增加生成页面自动带入js和css
- C8051 PCA实现红外遥控接收
- SQL Server中,Numric,Decimal,Money三种字段类型的区别
- codeforces Round #263(div2) D. Appleman and Tree 树形dp
- PCL 1.6.0 VS2010 Configuration
- OSPF(Open Shortest Path First开放式最短路径优先 -链路状态路由协议
- (原创)优酷androidclient 下载中 bug 解决
- iKcamp团队制作|基于Koa2搭建Node.js实战(含视频)☞ 中间件用法
- Python——各类库的安装(持续更新)
- io 的一些简单说明及使用
- 【转】消除代码中的 if-else/switch-case
- windows使用笔记-google-chrome下载地址
- 20145127 《Java程序设计》第四次实验报告
- JPEG Camer 图片上传
- (转)同步IO 异步IO 阻塞IO 非阻塞IO
- resin的几个常用配置
- VMware虚拟机下载与安装(内附密钥)
- what is feeding and what is 读扩散 and 写扩散?
热门文章
- Java第一篇:为什么是接口?
- KingbaseES V8R3集群运维案例之---主库系统down failover切换过程分析
- KingbaseES V8R3 集群专用机网关失败分析案例
- KingbaseES 如何实现Oracle pipelined 功能
- C语言的几个入门关于函数调用练习
- 洛谷P7112 行列式求值
- winfrom杀死进程及关闭进程
- G&;GH02 储存库创建/同步
- 聊聊计算机之Intel CPU的MESI协议
- 2020-2021 Winter Petrozavodsk Camp, Belarusian SU Contest (XXI Open Cup, Grand Prix of Belarus) 题解