RPC框架与其他框架的不同
传统的形式是所有的需求都集成在一起,各部分连接紧密,而RPC则是强调一种分布式的感觉,各个部分的需求分散处理,耦合性更低。
func getSum(a int, b int) int{
return a+b
}
func main() {
var a int = 10
var b int = 20
fmt.Println(getSum(a, b))
}
比如上面这段代码,本地的main函数直接调用本地同一个文件内的getSum函数,而RPC则是如将getSum这个函数放在某一个服务器上,客户端的主函数可能想调用服务端的getSum函数从而发出请求并传输参数达到调用的效果。
RPC简介
RPC: Remote Procedure Call Protocol缩写,简称RPC,即远程过程调用协议
特点:这种调用的过程跨越了物理服务器的限制,在网络中完成,在调用远端服务器上的程序的过程中,本地程序等待返回调用结果,直到远端程序执行完毕,将结果进行返回到本地,最终完成一次完整的调用。
所以远程过程调用就是调用远程服务器上的程序的方法整个过程。
RPC技术架构
先说一下两种结构
CS结构:即client和sever,客户端和服务端结构。
BS结构:即bownser和sever,浏览器与服务器结构,即基于浏览器访问。
RPC技术架构的组成部分:
客户端:服务调用发起方,即服务消费方
服务器:远端计算机机器上运行的程序,其中包含客户端调用和访问的方法。
客户端存根:存访服务端的地址、端口消息,将客户端的请求参数打包成网络消息,发给服务方,接受服务方返回的数据包,该段程序运行在客户端。
服务端存根:接收客户端发送的数据包,解析数据包,调用具体的服务方法,将调用结果打包发送给客户端一方,该程序运行在服务端。
如对图一中的需求进行举例:
比如订单程序这边想要调用支付那边的pay方法,那么订单程序部分就是请求发起端,即客户端角色,然后订单程序这端将要调用的方法和要传的参数通过网络发到支付这一端,支付将这些数据进行解析,在配置相应的参数与方法,将结果以同样的方式进行返回。
那么在订单这一端提供一段代码工具来组装想要调用的方法与参数,打包对应的数据然后通过发给支付这一端,所以支付这一端就是服务提供方。
然而实际中的RPC架构都会采用已经成熟通用的HTTP协议来进行调用所以实际的RPC架构原理图应该如下
涉及到的技术
- 动态代理技术:提到的client stub和Server stub程序在具体的编码和开发实践过程中,都是使用的动态代理技术自动生成的一段程序
- 序列化和反序列化:在rpc调用过程中,我们可以阿卡难道程序需要在一台机器上传输到另外一台机器上,所有的数据都是以字节的形式进行传输的,在编码过程中,往往使用的数据对象,因此想在网络上将数据对象和相关变量进行传输,需要对数据对象进行序列化和反序列化操作。
序列化:把对象转换为字节序列的过程称为对象的序列化,也就是编码的过程
反序列化:把字节序列恢复为对象的过程称为对象的反序列化,也就是解码的过程。
Json xml等相关框架都可以对数据进行序列化和反序列化编码操作