面试笔记9.22 面试官:聊聊你对RPC的理解
RPC 说明:单体架构到分布式架构的演进,必不可少的会使用到rps,rpc是远程调用协议,随着系统体谅主键增大,各个系统部署在不同的机器上, 致使服务间的调用需要依赖到网络通信,使用rpc服务,消费方每次调用远程服务,客户端不用关心底层网络的交互问题, 大大提高了系统的可靠性。 rpc的架构包含四个核心组件 1、客户端(Client):服务调用方(服务消费者) 2、客户端存根(Client Stub):存放服务端地址信息,将客户端的请求参数数据信息打包成网络消息,再通过网络传输发送给服务端 3、服务端存根(Server Stub):接收客户端发送过来的请求消息并进行解包,然后再调用本地服务进行处理 4、服务端(Server):服务的真正提供者 rpc调用过程 1、服务消费者(client客户端)通过本地调用的方式调用服务 2、客户端存根(client stub)接收到调用请求后负责将方法、入参等信息序列化(组装)成能够进行网络传输的消息体 3、客户端存根(client stub)找到远程的服务地址,并且将消息通过网络发送给服务端 4、服务端存根(server stub)收到消息后进行解码(反序列化操作) 5、服务端存根(server stub)根据解码结果调用本地的服务进行相关处理 6、本地服务执行具体业务逻辑并将处理结果返回给服务端存根(server stub) 7、服务端存根(server stub)将返回结果重新打包成消息(序列化)并通过网络发送至消费方 8、客户端存根(client stub)接收到消息,并进行解码(反序列化) 9、服务消费方得到最终结果 rpc用到的关键技术点 动态代理 通过rpc调用服务,如果要实现类似于调本地service的效果,需要基于接口获取动态代理,就是在接口的本地存在这个代理, 代理会找到服务对应机器地址,高并发还需要考虑负载均衡问题 均衡的策略 随机 权重 一致性哈希 轮询 序列化,反序列化 NIO通信 服务注册中心 如何设计一个RPC框架 rpc交互协议 请求头header 请求体body 服务注册与发现的流程 1:服务提供方绑定指定端口并启动服务,连接服务注册中心,将本机ip,端口,应用信息发送到过去并保存, 状态变更时会推送到注册中心,再由注册中心推送给消费者 2:消费者连接注册中心,发送应用信息请求服务信息到注册中心,注册中心根据消息内容匹配相应的服务列表发送到消费者应用缓存, 消费者基于列表选择并发起调用 微服务带来哪些问题 客户端的调用会受到网络问题的影响 注册中心网络异常需要服务治理 Redis 为什么Redis单线程模型效率却很高 基于纯内存的操作 非阻塞的IO多路复用机制 避免多线程频繁切换上下文的额外消耗 Redis线程模型 IO 多路复用程序 文件事件处理器 文件事件分派器 多个 Socket 缓存与数据库一致性问题 幻读:写入没成功,但被其他线程读到 高并发读,并有少量更新 解决办法 1:先读缓存,不存在则请求数据库,取出后存入缓存,并响应数据 2:更新时,先删除缓存,在更新数据库 3:高并发时使用异步串行化方案,通过队列实现
下一篇:
服务端架构中的“网关服务器”