当前位置:网站首页>RPC(远程过程调用协议)
RPC(远程过程调用协议)
2022-06-21 12:00:00 【attempt_to_do】
RPC(Remote Procedure Call Protocol)——远程过程调用协议,是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。它假定某些传输协议的存在,如TCP或UDP,以便为通信程序之间携带信息数据。通过它可以使函数调用模式网络化。在OSI网络通信模型中,RPC跨越了传输层和应用层。
RPC工作原理

运行时,一次客户机对服务器的RPC调用,其内部操作大致有如下十步:
1.调用客户端句柄;执行传送参数
2.调用本地系统内核发送网络消息
3.消息传送到远程主机
4.服务器句柄得到消息并取得参数
5.执行远程过程
6.执行的过程将结果返回服务器句柄
7.服务器句柄返回结果,调用远程系统内核
8.消息传回本地主机
9.客户句柄由内核接收消息
10.客户接收句柄返回的数据
Go RPC
Go RPC的函数只有符合下面的条件才能被远程访问,不然会被忽略,详细的要求如下:
- 函数必须是导出的(首字母大写)
- 必须有两个导出类型的参数,
- 第一个参数是接收的参数,第二个参数是返回给客户端的参数,第二个参数必须是指针类型的
- 函数还要有一个返回值error
举个例子,正确的RPC函数格式如下:
func (t *T) MethodName(argType T1, replyType *T2) error
T、T1和T2类型必须能被encoding/gob包编解码。
任何的RPC都需要通过网络来传递数据,Go RPC可以利用HTTP和TCP来传递数据,利用HTTP的好处是可以直接复用net/http里面的一些函数。详细的例子请看下面的实现
HTTP RPC
服务器代码
package main
import (
"errors"
"fmt"
"net/http"
"net/rpc"
)
type Args struct {
A, B int
}
type Quotient struct {
Quo, Rem int
}
type Arith int
func (t *Arith) Multiply(args *Args, reply *int) error {
*reply = args.A * args.B
return nil
}
func (t *Arith) Divide(args *Args, quo *Quotient) error {
if args.B == 0 {
return errors.New("divide by zero")
}
quo.Quo = args.A / args.B
quo.Rem = args.A % args.B
return nil
}
func main() {
arith := new(Arith)
rpc.Register(arith)
rpc.HandleHTTP()
err := http.ListenAndServe(":1234", nil)
if err != nil {
fmt.Println(err.Error())
}
}
通过上面的例子可以看到,我们注册了一个Arith的RPC服务,然后通过rpc.HandleHTTP函数把该服务注册到了HTTP协议上,然后我们就可以利用http的方式来传递数据了。
客户端代码
package main
import (
"fmt"
"log"
"net/rpc"
"os"
)
type Args struct {
A, B int
}
type Quotient struct {
Quo, Rem int
}
func main() {
if len(os.Args) != 2 {
fmt.Println("Usage: ", os.Args[0], "server")
os.Exit(1)
}
serverAddress := os.Args[1]
client, err := rpc.DialHTTP("tcp", serverAddress+":1234")
if err != nil {
log.Fatal("dialing:", err)
}
// Synchronous call
args := Args{
17, 8}
var reply int
err = client.Call("Arith.Multiply", args, &reply)
if err != nil {
log.Fatal("arith error:", err)
}
fmt.Printf("Arith: %d*%d=%d\n", args.A, args.B, reply)
var quot Quotient
err = client.Call("Arith.Divide", args, ")
if err != nil {
log.Fatal("arith error:", err)
}
fmt.Printf("Arith: %d/%d=%d remainder %d\n", args.A, args.B, quot.Quo, quot.Rem)
}
我们把上面的服务端和客户端的代码分别编译,然后先把服务端开启,然后开启客户端,输入代码,就会输出如下信息:
$ ./http_c localhost
Arith: 17*8=136
Arith: 17/8=2 remainder 1
通过上面的调用可以看到参数和返回值是我们定义的struct类型,在服务端我们把它们当做调用函数的参数的类型,在客户端作为client.Call的第2,3两个参数的类型。客户端最重要的就是这个Call函数,它有3个参数,第1个要调用的函数的名字,第2个是要传递的参数,第3个要返回的参数(注意是指针类型),通过上面的代码例子我们可以发现,使用Go的RPC实现相当的简单,方便。
边栏推荐
- 使用赞美提高绩效
- Hands on data analysis data reconstruction
- 2022 safety officer-c certificate title and answer
- ThinkPHP security development specification
- Ansible operating instructions for configuring SSH authentication free for the first time
- Jenkins configures scheduled tasks through build periodically
- 【综合笔试题】剑指 Offer II 114. 外星文字典
- STL basic container test
- 马斯克的“好朋友”,冲击2022港股最大IPO
- harmonyOS第二次培训
猜你喜欢

i.MX - RT1052输入输出(GPIO)
Golang implements redis (9): use geohash to search people nearby

SDCC编译器 + VSCode开发 8位微控制器

1108. IP address invalidation

电源老化测试系统定制|充电桩自动化测试系统NSAT-8000概述

华为是如何从0到1打造以项目为中心运作的项目管理体系的?

MySQL 5.6.49 企业版设置密码复杂度策略

100w的数据表比1000w的数据表查询更快吗?

Ansible operating instructions for configuring SSH authentication free for the first time

Customization of power aging test system | overview of charging pile automatic test system nsat-8000
随机推荐
Guangdong issues product testing coupons, and consumers also share
南京大学 静态软件分析(static program analyzes)-- Intermediate Representation 学习笔记
版本号命名规范
Broken knowledge
typora免费版,无需破解,安装直接使用
Customization of power aging test system | overview of charging pile automatic test system nsat-8000
Introduction to the upper computer software ns-scope of Tektronix oscilloscope
How does Huawei build a project centered project management system from 0 to 1?
【综合笔试题】难度 2.5/5 :「树状数组」与「双树状数组优化」
Anchor of SSD_ Box calculation
Use praise to improve performance 
Jenkins configures scheduled tasks through build periodically
STL basic container test
1108. IP address invalidation
STM32开发之 VS Code + GDB下载调试
【无标题】
记一次Vmware虚拟机升级GLIBC导致系统瘫痪的恢复解决方法
i.MX - RT1052 SDCard操作(SDIO接口)
I would like to ask you guys, the flick CDC will add a table level exclusive lock before extracting the full amount of Oracle data
SSD【目标检测篇】