学习RPC主要文章
声哥文章
https://blog.csdn.net/qq_40856284/category_10138756.html
PANDA文章(更易懂一些)
https://blog.csdn.net/qq_38685503/category_10794078.html
RPC八股文
下面补一些RPC八股文链接里面没有答案的部分以及修改的部分
PS:因为注册中心用的NACOS 所以没有记录zookeeper的问题
一.注册中心
4.常用的服务注册中心, 注册中心的差异
微服务:注册中心ZooKeeper、Eureka、Consul 、Nacos对比_琦彦-CSDN博客_zookeeper和nacos
5.为什么用Nacos做注册中心?
Nacos的使用比较简单
6.集群一般有几个节点,为什么?
三个,选举leader
7.socket过程中发生的系统调用
socket系统调用过程_hhhhhyyyyy8的博客-CSDN博客_socket的系统调用
补一张我照着原贴抄的笔记
19.分布式数据一致性协议都知道哪些 20.Raft了不了解
常用的分布式一致性协议_TJtulong的博客-CSDN博客_分布式一致性协议
21.分布式事务的几种解决方案
33.服务端用的哪个类监听的
这里我觉得应该是serverBootstrap
34.自己实现的定时器是啥?
定时器用的是Netty的IdleStateHandler方法
PANDA的第十三章有写
手把手实现RPC框架--简易版Dubbo构造(十三)Netty心跳机制、实现服务负载均衡_PANDA博客-CSDN博客
用法
IdleStateHandler_丶洗牙刷脸-CSDN博客_idlestatehandler使用
37.如果是你如何设计一个nacos ,rpc如何调用
照搬阿里
二、序列化与反序列化以及协议
5.有没有阅读过序列化(Java Serialization、Fastjson)之后的数据
序列化后数据的解读_weixin_30410119的博客-CSDN博客
9.序列化怎么做的(序列化怎么实现)?Kryo原理了解吗?
源码分析kryo对象序列化实现原理_库克look的博客-CSDN博客_kryo 源码分析
10.你说到你自定义了一个简单协议,自定义的协议头里包括哪些内容,多少字节,各自的作用是什么
PANDA文章有提到
首先是 4 字节魔数,表示一个协议包,用来识别是我们自定义的协议;接着是 Package Type,表示这是一个调用请求还是响应结果;Serializer Type 表示实际数据使用的序列化器编号,这个服务端和客户端应当使用统一标准;Data Length 就是实际数据的长度,设置这个字段主要防止粘包,最后就是经过序列化后的实际数据,可能是 RpcRequest 也可能是 RpcResponse 经过序列化后的字节,取决于 Package Type。
11.对象有一个属性是对象引用,怎么序列化
递归序列化类型和值
12.如何实现编解码及序列化?
手把手实现RPC框架--简易版Dubbo构造(七)netty传输与通用序列化接口实现_PANDA博客-CSDN博客
定义CommonEncoder编码器将原始数据转换为字节流,然后根据上面提到的协议格式,将各个字段写到一个字节数组中(堆外内存ByteBuf[ ]),通过构造器传进的序列化器序列化。
PS:序列化器为自定义序列化接口CommonSerializer的实现类(JSON、Kryo),与kryo原理的序列化器不同。
解码器就是将收到的字节序列还原为实际对象,主要就是进行字段的校验,比较重要的就是取出序列化器编号,以获得正确的反序列化方式,并且利用length字段来确定数据包的长度(防止粘包),读出正确长度的字节数组,然后反序列化成对应的对象。
13.那你这个序列化还是针对Java语言的,如何实现跨语言的序列化或者RPC框架?
跨语言问题在于序列化方式
由于本项目实现了两种序列化器,所以想要实现跨语言序列化使用JSON序列化器即可
三、Netty
14.Netty使用场景
15.Netty的线程模型
16.RPC过程网络上发生了什么
21.Netty解决粘包的几种方式
26.怎么实现保持长连接的
手撸架构,Netty 与 RPC面试48问_vincent-CSDN博客
1.TCP 的粘包的概念是对的吗
2.简述AIO、BIO、NIO的具体使用、区别及原理
5.说说你对Netty的认识?
3.BIO,NIO,AIO的痛点,怎么优化?
Java 性能优化之——从BIO 到 NIO,再到 AIO_vincent_wen0766的博客-CSDN博客
4.IO/NIO/AIO区别?介绍Reactor,介绍Proactor?
reactor和proactor模式_系统运维-CSDN博客
为啥要用异步IO不用多线程
异步IO和多线程的关系_Viewwuyou-CSDN博客_异步io和多线程
6.NIO中Channel的作用
7.NIO的设计架构?JDK中NIO有哪些重要组件?
Java NIO?看这一篇就够了!_u011381576的博客-CSDN博客_nio
8.为什么选Netty用来做通信框架?
12.为什么大多数rpc框架都用Netty(聊了下Netty的特点)?你为什么会用到Netty?
三大特点:高并发、传输快和封装好
9.Netty怎么实现高性能的?Netty高性能主要依赖了哪些特性?Netty为什么快?
NIO、零拷贝、线程模型
零拷贝:彻底理解Netty-----零拷贝_爱琴孩的博客-CSDN博客
10.netty bytebuf工作原理,和NIO里buffer区别?
Netty原理:ByteBuf对Nio bytebuffer做了什么导致效率提升?_doomwatcher的博客-CSDN博客
17.RPC多个请求是在一个连接完成的吗
一个长连接
19.基于Netty实现通信,使用了哪些TCP优化参数?
option(ChannelOption.SO_BACKLOG, 256)
服务端接受连接的最大队列长度,如果队列已满,客户端连接将被拒绝。
option(ChannelOption.SO_KEEPALIVE, true)
启用该功能时,TCP会主动探测空闲连接的有效性。可以将此功能视为TCP的心跳机制,默认的心跳间隔是7200s即2小时
childOption(ChannelOption.TCP_NODELAY, true)
nodelay没有延迟
20.粘包半包怎么解决的
自定义协议、设置Data Length 防止粘包
22.Netty底层原理
23.Netty中的select过程
24.Netty的两个线程池,为什么两个,有什么区别,具体说来。
Netty初始化的时候需要初始化两个线程池,你能简单说一说吗?
netty全过程图解(最详细清晰版)_PANDA博客-CSDN博客_netty
27.如何实现心跳保持
option(ChannelOption.SO_KEEPALIVE, true)
28.多少个线程
Netty 默认是 CPU 处理器数的两倍,bind 完之后启动
四、负载均衡
1.项目中负载均衡怎么实现的
2.项目中负载均衡算法用到那些
利用列表获取某个服务的所有提供者,根据选择的负载均衡策略选择其中一个提供者,实现的负载均衡策略有随机策略和轮询策略
9.如何设计负载均衡器
接收客户端请求,将请求转发给集群中的各台服务器处理,服务器将处理结果返回给负载均衡器,负载均衡器将处理结果转发给相应的客户端。
能够根据客户端的性能要求选择相应服务器
五、RPC 和 HTTP
原贴写的很清楚了这里不做补充
六、Nacos
NACOS面试题
Nacos面试题_KGyyds的博客-CSDN博客_nacos面试
因为项目本身Nacos只是作为注册中心,所以只提取其中几个题
1.为什么要将服务注册到Nacos?
为了更好的查找这些服务
2.在Nacos中服务提供者是如何向Nacos注册中心(Registry)续约的?
(5秒心跳包Nacos中的负载均衡底层是如何实现的?(通过Ribbon实现,Ribbon中定义了一些负载均衡算法,然后基于这些算法从服务实例中获取一个实例为消费方法提供服务)
Ribbon是什么?(Netflix公司提供的负载均衡客户端,一般应用于服务的消费方法)
Ribbon可以解决什么问题?(基于负载均衡策略进行服务调用,所有策略都会实现IRule接口)
)
3.对于Nacos来讲它是如何判断服务实例的状态?
(检测心跳包 ,15,30)
4.服务消费方是如何调用服务提供方的服务的?
通过本地创建的代理对象调用远程接口
5.Nacos中的负载均衡底层是如何实现的?
(通过Ribbon实现,Ribbon中定义了一些负载均衡算法,然后基于这些算法从服务实例中获取一个实例为消费方法提供服务)
6.Ribbon是什么?
(Netflix公司提供的负载均衡客户端,一般应用于服务的消费方法)
7.Ribbon可以解决什么问题?
(基于负载均衡策略进行服务调用,所有策略都会实现IRule接口)
8.Ribbon内置的负载均衡策略有哪些?
Ribbon详解与实例_JinXYan的博客-CSDN博客_ribbon
纠正:轮询策略
补一个面经
Java面试,你应该准备这些知识_程序员小灰的博客-CSDN博客_java面试需要准备什么
刷面经时如果遇到没总结到此文章的问题将会更新