前
面试的时候有时候会有一种很混沌的状态 不知道说啥 不知道在想啥 ,可能是气场问题 多见于特别想去的公司 有压力导致的,这时候当面试官问我一个问题的时候,脑子里会冒出很多个点,很多印象概念一涌而显,可当我调一个拿出来说的时候,高度概括的语句一句结束(面试官:就这? 我 啊…shi),
想说点什么吧 又不知到该扩展什么(rpc 就是远程过程调用 那时候真的想不起来要把他是个协议而且跨语言这事拿出来说 虽然这事显而易见) 要么不是说了上句就是忘了下句,再回去补上一句,下语句又没承接住 磕磕巴巴,最后把一个知识点解释的稀烂,事后凄然离场
理解和表达还是不太一样 ,看的懂能表达和扩展解释出来,中间差了理解,整理,记忆。特开始整理面试相关的东西,给不善言辞和有很多不足的我。
概念:
远程过程调用
通过网络从远程计算机程序中请求服务 他是一种协议 (dubbo Thrift Grpc)不需要了解底层网络通信细节 不需要了解对端服务器使用什么语言(*当然并不是真的不需要 开始巴拉编解码框架 使用通信框架(可能深问) rpc协议传输的过程 (可能再问) *)
应用:
用作进程间通信 (业界中实现系统间通信方式 消息队列,HTTP 请求调用、数据库和分布式缓存)
为什么使用rpc
其实也是的他应用场景存在的原因 扩展单机硬件资源限制 透明化网络底层
rpc几个要素 或者调用过程
1 rpc协议 发送的时候把用户自定义协议和id包装成一个rpc协议 rpc经过编码 加密 添加长度头后变成一个字节数组
2编解码过程 协议(下文所说的协议都是用户自定义协议)映射关系 协议包从远端到达之后 需要解析到指定处理方法的解码器 这个过程需要使用协议号来指定 这个映射关系通常预先编写好 协议和协议id的映射关系文件"temp"
协议byte-》协议handler -》handler(协议) 里面涉及两个映射
a:协议到指定handler的查找
b:协议byte 的解析器查找
手写handler的时候 可以定义个基类指定id 和定义个泛型(协议类型)完整映射,但是每次扩展协议的时候 写起来麻烦还容易出错,而且发送协议的时候还有指定协议id ,
那么就可以把temp利用起来,映射关系使用name和id 接收的时候通过id找到找到协议name 反射找到协议handler 这个映射关系在起服的时候提前映射好 反射有性能问题;
同样这样也能解决协议id到协议的映射 发送的时候通过构建的发送协议 找到并填充协议id发送到对端
3加解密 协议除了基本解析之外一般还需要包一成加密 解密过程 (tea对称加密)
4添加长度头 协议长度 用于解决粘包拆包(还有定长 分隔符等解决方法)
5网络通信(基于http应用层的通信协议) (直接基于tcp 传输层通信 netty)
io网络模型选择
将前4步导出的字节数组通过网络传输给对端