什么是RPC?
rpc远程过程调用协议,是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC能够使程序像访问本地资源一样去访问远程资源,简单来说,RPC就是从一台机器上通过参数传递的方式去调用另一台机器上的函数或方法并得到返回值
RPC架构组件?
1)客户端(client):服务调用方(服务消费者)
2)客户端存根(client stub):存放服务端地址信息,将客户端的请求参数数据信息打包成网络消息(字节流),在通过网络传输给服务端(序列化)
3)服务端存根(cserver stub):接受客户端发送过来的请求消息并进行解包(反序列化),然后调用本地服务进行处理
4)服务端(server):服务的真正提供者
具体调用过程:
1)服务消费者(client客户端)通过调用本地服务的方式调用需要消费的服务
2)客户端存根接受到调用请求后负责将方法,入参等信息序列化成能够进行网络传输的消息体
3)客户端存根找到远程的服务地址,并且将消息通过网络发送给服务端
4)服务端存根接收到消息后进行解码(反序列化)
6)服务端存根根据反序列化后的结果调用本地的服务进行处理
7)本地服务执行具体操作后将结果返回给服务端存根
8)服务端存根进行序列化发送给客户端存根
9)客户端存根进行反序列化发送给客户端
10)服务消费方得到最终结果
RPC则将调用,编码/解码的过程封装起来,让用户感觉是在调用本地服务一样的调用远程服务
RPC,SOA,REST的区别?
1.REST
可以看做是HTTP协议的一种直接应用,默认基于JSON作为传输格式,使用简单,但安全性较低
2.SOA
面向服务架构,可以根据需求通过网络对松散耦合的粗粒度应用组件进行分布式部署,组合和使用,服务层是SOA的基础。SOA是一种粗粒度,松耦合服务架构,服务之间通过简单,精确定义接口进行通讯,不涉及底层编程模型和通讯模型
RPC的实现基础
1)需要非常高效的网络通信,一般选择Netty作为网络通信框架
2)需要比较高效的序列化框架,谷歌的Protobuf序列化框架
3)可靠的寻址模式,使用Zookeeper来注册服务
4)如果是带会话的RPC调用,需要有会话和状态保持的功能
RPC的关键技术?
1)动态代理:生成存根时需要用到java动态代理技术(CGLib代理,javassist字节码生成技术)
2)序列化和反序列化
3)nio通信:处于并发性能的考虑,传统的阻塞IO显然不合适,因此需要异步的IO,即NIO
4)服务注册中心:Redis,Zookeeper
RPC主流框架
Dubbo使得应用可以通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成
RPC用来解决分布式系统各个服务之间的交互问题