RPC系列之基本概念及go语言使用实现
1、基本使用
1.1、概念梳理
TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。
什么是RPC?
远程过程调用(Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。如果涉及的软件采用面向对象编程,那么远程过程调用亦可称作远程调用或远程方法调用。
web3 和 http , RPC 之间的关系。
HttpProvider should be used to send rpc calls over http
web3有两种Provider, 一种是HttpProvider, 一种是IpcProvider
web3是通过http, ws, 发送Rpc调用,然后把Rpc调用的结果通过http,或者WS返回回来。
RPC主要是基于TCP/IP协议,而http服务则是基于HTTP协议
RPC(即Remote Procedure Call,远程过程调用)和HTTP(HyperText Transfer Protocol,超文本传输协议)他们最本质的区别,就是RPC主要工作在TCP协议之上,而HTTP服务主要是工作在HTTP协议之上,我们都知道HTTP协议是在传输层协议TCP之上的,所以效率来看的话,RPC当然是要更胜一筹。
HTTP与RPC存在重大不同的是:请求是使用具有标准语义的通用的接口定向到资源的,这些语义能够被中间组件和提供服务的来源机器进行解释。结果是使得一个应用支持分层的转换(layers of transformation)和间接层(indirection),并且独立于消息的来源,这对于一个Internet规模、多个组织、无法控制的可伸缩性的信息系统来说,是非常有用的。与之相比较,RPC的机制是根据语言的API(language API)来定义的,而不是根据基于网络的应用来定义的。
调用远程机器上的一个过程(procedure)的观念,是RPC与其他形式的基于网络的应用通信的区别所在。
RPC(Remote Procedure Call,远程过程调用)是建立在Socket之上的,出于一种类比的愿望,在一台机器上运行的主程序,可以调用另一台机器上准备好的子程序,就像 LPC(本地过程调用).RPC带来了开发C/S程序的简单可靠的手段,它通过一种叫XDR的数据表达方法描述数据,程序员书写伪代码,然后由 rpcgen程序翻译为真正的可编译的C语言源代码,再编译成真正的Client端和Server端程序。
RPC是在Socket的基础上实现的,它比socket需要更多的网络和系统资源.另外,在对程序优化时,程序员虽然可以直接修改由rpcgen产生的令人费解的源程序,但对于追求程序设计高效率的RPC而言,获得的简单性则被大大削弱.
1.2、go 语言 RPC实现方式
1. net/rpc库
rpc.server
[p][p]
package main import ( "net/rpc" "net" "log" "net/http" ) //自己的数据类 type MyMath struct{ } //加法--只能两个参数--方法名第一个字母必须大写 func (mm *MyMath) Add(num map[string]int,reply *int) error { *reply = num["num1"] + num["num2"] return nil } func main() { //注册MyMath类,以代客户端调用 rpc.Register(new(MyMath)) rpc.HandleHTTP() l, e := net.Listen("tcp", ":1215") if e != nil { log.Fatal("listen error:", e) } http.Serve(l, nil) }
syntax = "proto3";
package pb;
// 算术运算请求结构
message ArithRequest {
int32 a = 1;
int32 b = 2;
}
// 算术运算响应结构
message ArithResponse {
int32 pro = 1; // 乘积
int32 quo = 2; // 商
int32 rem = 3; // 余数
}
// rpc方法
service ArithService {
rpc multiply (ArithRequest) returns (ArithResponse); // 乘法运算方法
rpc divide (ArithRequest) returns (ArithResponse); // 除法运算方法
}[/code]
[p]
- Go语言中协程的概念和基本使用
- 【Objective-C】OC中自定义对象的归档基本概念和使用方法(实现NSCoding协议)
- GO语言学习笔记1(基本概念,条件循环语句)
- 使用 Go 语言实现优雅的服务器重启
- SpringCloud系列九:SpringCloudConfig 基础配置(SpringCloudConfig 的基本概念、配置 SpringCloudConfig 服务端、抓取配置文件信息、客户端使用 SpringCloudConfig 进行配置、单仓库目录匹配、应用仓库自动选择、仓库匹配模式)
- 浅析Go语言编程当中映射和方法的基本使用
- J2EE项目系列(四)--SSM框架构建积分系统和基本商品检索系统(Spring+SpringMVC+MyBatis)(3)Ajax使用详解(级联列表)以及企业级报表Excel导入导出实现
- Go语言中使用 buffered channel 实现线程安全的 pool
- js-js实现,在HTML中使用JavaScript,基本概念
- 熟悉java语言的基本使用:简单存款取款机制java实现
- [How to] 使用HBase协处理器---基本概念和regionObserver的简单实现
- SpringCloud系列五:Ribbon 负载均衡(Ribbon 基本使用、Ribbon 负载均衡、自定义 Ribbon 配置、禁用 Eureka 实现 Ribbon 调用)
- OpenGL ES系列 一 :GLSurfaceView基本使用配合理解OpenGL常用概念
- Go语言实现的简单TCP服务及使用MySql
- Go语言内部rpc简单实例,实现python调用go的jsonrpc小实例
- 熟悉java语言的基本使用:简单存款取款机制java实现
- RxJava系列2(基本概念及使用介绍)
- Go语言的素数对象编程实现及其使用
- 使用纯java基本语言实现泰勒展开的sin和cos计算