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.Breturn 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.Bquo.Rem = args.A % args.Breturn 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 callargs := Args{17, 8}var reply interr = 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 Quotienterr = client.Call("Arith.Divide", args, &quot)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实现相当的简单,方便。

RPC(远程过程调用协议)相关推荐

  1. RPC(远程过程调用协议)介绍

    RPC框架解释 谁能用通俗的语言解释一下什么是RPC框架? -远程过程调用协议RPC(Remote Procedure Call Protocol) 首先了解什么叫RPC,为什么要RPC,RPC是指远 ...

  2. RPC 远程过程调用协议

    RPC(Remote Procedure Call Protocol)--远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. RPC协议假定某些传输协议的存 ...

  3. RPC简介(远程过程调用协议)

    RPC RPC在rfc 1831中收录 ,RPC(Remote Procedure Call) 远程过程调用协议 RPC协议规定允许互联网中一台主机程序调用另一台主机程序,而程序员无需对这个交互过程进 ...

  4. 微服务之RPC(远程过程调用)的四种方式

    微服务思想 微服务思想-注册中心zookeeper 微服务: 架构设计采用分布式思想,当服务器发生故障时,可以实现自动化的故障迁移.无需人为干预. 注册中心实现原理: ZK工作原理说明 Zookeep ...

  5. rpc远程过程调用_什么是远程过程调用(RPC)?

    rpc远程过程调用 Remote Procedure Call (RPC) is a protocol or architecture which is used to run programmes ...

  6. RPC远程过程调用简介

    1. 什么是RPC 远程过程调用(英语:Remote Procedure Call,缩写为 RPC,也叫远程程序调用)是一个计算机通信协议.该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而 ...

  7. spring-boot重头再来 6 分布式理论 RPC远程过程调用 Zookeeper安装 Dubbo SpringBoot + Dubbo + zookeeper Spring Security

    spring-boot重头再来 6 文章目录 spring-boot重头再来 6 分布式理论 RPC远程过程调用 Zookeeper安装 Dubbo dubbo-admin安装 dubbo-admin ...

  8. 为什么redis在陌陌上使用的这么广泛?当NoSQL数据库,微服务的注册中心,RPC的调用协议都能用

    前言 说到redis,可能大家的脑海中蹦出的关键词是:NoSQL.KV.高性能.缓存等.但今天的文章从另一个角度--微服务来展开. 这篇文章的起因也是源自一次面试经历,在面试一位来自陌陌的候选人(就是 ...

  9. RPC通信基本原理 -- 浅析RPC远程过程调用基本原理

    一.RPC基本概念 1.1.RPC简介 RPC 的全称是 Remote Procedure Call是一种进程间通信方式. RPC只是一个概念 而不是具体的协议或框架. 它允许程序调用另一个地址空间( ...

最新文章

  1. 2022年AI芯片场景
  2. 科技城|从专利布局看人工智能领域全球竞争与中国面临的挑战
  3. Unicode的前世今生
  4. P1991 无线通讯网
  5. 前端学习(3153):react-hello-react之脚手架文件介绍
  6. 日常计算机操作知识试题,关于2017计算机一级考试试题操作题
  7. blockquote 和 q 标签 css样式
  8. 平面三自由度机器人动力学建模与仿真
  9. 至强E5系列CPU后面的数字含义
  10. android 短信接口收拦截,闪修侠科普 | 双11垃圾短信没停过,教你一键屏蔽~
  11. MySQL8免安装版安装教程
  12. 解密:腾讯如何打造一款实时对战手游
  13. 互联网日报 | 1月19日 星期二 | 腾讯音乐全资收购懒人听书;字节跳动整合硬件业务专注教育硬件;PSA与FCA正式完成合并...
  14. Java语言有哪些特点?
  15. curl:Failed connect to github-production-release-asset-2e65be.s3...; Connection refused解决办法
  16. Linux运行安卓应用
  17. 1056 Mice and Rice (25分)
  18. Google Earth Engine(GEE)——Error: Exported bands must have compatible data types; found inconsistent
  19. 给大家分享个文件安全扫描软件VirusTotal Smart Scanner
  20. 云平台的成本优化-提升资源利用率

热门文章

  1. Shiro(三) 身份认证源码分析与 MD5 盐值加密
  2. Python保留字与标识符
  3. css设置四个圆角,css怎么设置4个圆角?css设置4个圆角方法
  4. 分布式缓存Redis Cluster在华泰证券的探索与实践
  5. Hadoop3.0时代,怎么能不懂EC技术纠删码? 个推为你解读
  6. 长时间佩戴耳机的后果有多严重?选购适合的耳机太重要了
  7. php死循环代码怎么写,详解PHP死循环写法和作用
  8. python做事务所审计收费标准_会计师事务所收费标准
  9. Thymelef命名空间引入
  10. Python脚本编写的学习