1. RPC问题汇总

一、注册中心

策略:服务注册原理、注册中心结构、zookeeper的原理、几个注册中心的区别、分布式算法、分布式事务。

项目细节:服务注册、服务发现、服务注销、监听机制

  1. 介绍一下服务注册中心怎么做的?
    (1)服务发现:

    • 服务注册/反注册:保存服务提供者和服务调用者的信息
    • 服务订阅/取消订阅:服务调用者订阅服务提供者的信息,最好有实时推送的功能
    • 服务路由(可选):具有筛选整合服务提供者的能力。

    • 配置订阅:服务提供者和服务调用者订阅微服务相关的配置

    • 配置下发(可选):主动将配置推送给服务提供者和服务调用者

    • 检测服务提供者的健康情况

  2. 一个注册中心,至少需要具备哪些条件?
    服务注册接口:服务提供者通过调用服务注册接口来完成服务注册。
    服务反注册接口:服务提供者通过调用服务反注册接口来完成服务注销。
    心跳汇报接口:服务提供者通过调用心跳汇报接口完成节点存活状态上报。
    服务订阅接口:服务消费者通过调用服务订阅接口完成服务订阅,获取可用的服务提供者节点列表。
    服务变更查询接口:服务消费者通过调用服务变更查询接口,获取最新的可用服务节点列表。
    服务查询接口:查询注册中心当前注册了哪些服务信息。
    服务修改接口:修改注册中心中某一服务的信息。

  3. 项目中RPC服务注册中心需要注意什么?
    同 一.1,一.2

  4. 如果让你设计一个服务注册中心,怎么设计

  5. 注册中心单机还是分布式的,其中一个挂了怎么办?一致性,可靠性怎么保证的?超时控制,加锁和管道支持并发,单机(考虑了多机情况

  6. 常用的服务注册中心, 注册中心的差异

  7. 使用zookeeper有什么好处

  8. 为什么用Zookeeper做注册中心(优点,与其他选型对比下)

  9. 说一下zookeeper,为什么使用zookeeper,不选其他注册中心,集群一般有几个节点,为什么?

  10. 了解Nacos和Zookeeper的区别吗?

  11. 为什么不选择Redis作为注册中心(zookeeper临时节点自动宕机自动清除)

  12. 为什么要用Zookeeper(服务注册、发现)

  13. Zookeeper和Eureka分别是满足CAP中的哪些

  14. socket过程中发生的系统调用

  15. zookeeper服务发现

  16. zookeeper服务容灾?zookeeper服务节点挂掉之后,怎么删除它?
    容灾:在集群若干台故障后,整个集群仍然可以对外提供可用的服务。
    一般配置奇数台去构成集群,以避免资源的浪费。
    三机房部署是最常见的、容灾性最好的部署方案。
    删除:使用临时节点,会话失效,节点自动清除。

  17. Zookeeper有几种角色?
    群首(leader),追随者(follower),观察者(observer)

  18. CAP理论解释下?P是什么?

    • 一致性(Consistency)多个副本之间的数据一致性

    • 可用性(Availability)在合理规定的时间内,是否能返回一个明确的结果。

    • 分区容错性(Partition tolerance)在分区故障下,仍然可以对外提供正常的服务。
      一个分布式系统在以上三个特性中:最多满足其中的两个特性。

  19. Zookeeper集群节点宕机了怎么发现剔除的?
    发现:watcher机制
    剔除:临时节点?

  20. 服务熔断和服务降级有什么区别?(https://blog.csdn.net/qq_33394088/article/details/80210679?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-3.control)
    服务熔断:如果某个目标服务调用慢或者有大量超时,此时,熔断该服务的调用,对于后续调用请求,不在继续调用目标服务,直接返回,快速释放资源。如果目标服务情况好转则恢复调用。
    服务降级:当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行。**

  21. zookeeper原理?羊群效应,怎么解决,解决之后又有什么问题,又怎么解决,纯粹搞成了循环依赖了。zab协议,具体说来。
    羊群效应:https://blog.csdn.net/wk022/article/details/88129479?utm_medium=distribute.pc_relevant_t0.none-task-blog-2~default~BlogCommendFromMachineLearnPai2~default-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2~default~BlogCommendFromMachineLearnPai2~default-1.control

  22. ZAB算法讲一下(讲了ZAB是paxos的改版,Mysql是paxos、redis sentinel是raft、zookeeper是ZAB、ZAB的具体实现)

  23. zk的分布式算法zab,如果选举的时候zxid都相同呢?(比较SID)

  24. dubbo 怎么注册到zookeeper以及 dubbo 协议,zookeeper协议,

  25. zookeeper的节点类型?(持久,临时,顺序)

  26. 分布式数据一致性协议都知道哪些(2PC 3PC Paxos)

  27. Raft了不了解

  28. 分布式事务的几种解决方案(2PC,3PC,TCC,基于消息,然后顺带讲了一下优缺点) 分布式事务的几种方式吧(2pc、3pc、tcc、基于消息)以及区别

  29. Zookeeper 是如何保证一致性的?
    https://blog.csdn.net/weixin_33834679/article/details/93105669?utm_medium=distribute.pc_relevant_t0.none-task-blog-2~default~BlogCommendFromMachineLearnPai2~default-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2~default~BlogCommendFromMachineLearnPai2~default-1.control
    zookeeper 的一致性,为了防止单机挂掉,zookeeper维护了一个集群,实现自身的高可用。
    重点回答zookeeper的ZAB协议
    事务的顺序一致性:全局唯一事务ID,ZXID

  30. 你知道Zookeeper的分布式锁实现方式吗?(临时节点,如果服务器挂了,锁会自己消失)

  31. ZooKeeper的作用?
    项目答:注册中心。
    扩展答:1.数据发布/订阅 2.自动化的DNS服务 3.数据库复制处理 4.基于zookeeper分布式系统机器间的通信方式 5.命名服务
    6.集群管理(监控、控制) 7.Master选举 8.分布式锁 9.分布式队列

  32. zookeeper有什么特性,讲一下(临时节点、持久节点、ZAB)

  33. 服务下线还有没有别的实现方法(这就算引导了,结合前面的问题,使用临时节点)

  34. zookeeper宕机与dubbo直连的情况?(https://blog.csdn.net/csdn_kenneth/article/details/82557734)
    zookeeper注册中心宕机—>dubbo直连,可以调服务
    zookeeper宕机了,消费者可以通过本地缓存通信调提供者的服务
    现象:zookeeper注册中心宕机,还可以消费dubbo暴露的服务。
    原因:健壮性

    1. 监控中心宕掉不影响使用,只是丢失部分采样数据
    2. 数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务
    3. 注册中心对等集群,任意一台宕掉后,将自动切换到另一台
    4. 注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯
    5. 服务提供者无状态,任意一台宕掉后,不影响使用
    6. 服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复
  1. 任何一个请求过来都会打到注册中心么?

  2. 任何一个流量打过来都会打到注册中心么?

  3. 有一大批流量总是被打到一个实例上面,这个实例的兄弟实例分到的流量很少,怎么办?

  4. 有一个实例挂了怎么办?

  5. 注册中心怎么进行心跳检测
    https://blog.csdn.net/sinat_29774479/article/details/103593878

  6. 注册中心对于服务端掉线时怎么处理

  7. 服务端用的哪个类监听的(ServerSocket)

  8. 自己实现的定时器是啥?

  9. 服务调用方怎么知道服务不可用了?

  10. 怎么实现的类似本地调用?

  11. 如果是你如何设计一个nacos ,rpc如何调用。

  12. 如果注册中心服务器宕机怎么保证高可用?
    高可用:通过设置减少系统不能提供服务的时间。
    在zookeeper主要考虑容灾和扩容两方面提高高可用。

  13. 服务的地址怎么知道?(注册中心)

  14. 服务注册信息的拆分要怎么做,服务注销怎么实现?

  15. 服务注册怎么进行服务注销监听?

  16. 服务注册中心的功能除了放在额外的服务器上实现还能放在哪里?怎么实现?

  17. RPC调用中服务注册怎么做的?

  18. RPC服务注册、服务发现、服务注销怎么做的

  19. RPC项目zookeeper怎么实现注册、发现的(临时节点存储ip+端口+负载均衡策略)

  20. RPC心跳怎么实现的,是服务端给服务注册中心心跳还是服务端给客户端心跳

  21. 了解过zookeeper的问题吗?
    (崩溃恢复无法提供服务、写的性能瓶颈是一个问题、选举过程速度缓慢、无法进行有效的权限控制)

二、序列化与反序列化以及协议

策略:几个序列化协议的区别以及优缺点、Kryo的原理和安全性、两个接口区别。

项目细节:在项目怎么定义序列化协议,怎么定义序列化相关的类以及项目序列化的细节,

  1. 序列化和反序列化有什么作用
    (1)实现了数据的持久化:永久性保存对象,保存对象的字节序列到本地文件或者数据库中;
    (2)序列化实现远程通:通过序列化以字节流的形式使对象在网络中进行传递和接收;
    (3)通过序列化在进程间传递对象;

  2. Serializable和Externalizable懂吗?(不知道Externalizable)
    https://my.oschina.net/wangmengjun/blog/1588096
    1、Serializable序列化时不会调用默认的构造器,而Externalizable序列化时会调用默认构造器的!
    2、Serializable:一个对象想要被序列化,它的类就要实现 此接口,这个对象的所有属性都可以被序列化和反序列化来保存、传递。
    Externalizable:自定义序列化可以控制序列化的过程和决定哪些属性不被序列化。
    3、使用Externalizable时,必须按照写入时的确切顺序读取所有字段状态。否则会产生异常。

  3. serializable关键字的作用(实现原理)?几种序列化协议?ProtoBuff的优点?
    https://blog.csdn.net/lwj_zeal/article/details/90743500

  4. 序列化传输?
    https://www.cnblogs.com/chjxbt/p/11458815.html

  5. 有没有阅读过序列化(Java Serialization、Fastjson)之后的数据

  6. RPC 不同序列化协议了解吗?优缺点是?各种序列号协议的特点?序列化方式有哪几个,区别是什么,自己写过吗? | | 优点 | 缺点 | | —- | —- | —- | | Kryo | 速度快,序列化后体积小 | 跨语言支持较复杂 | | Hessian | 默认支持跨语言 | 较慢 | | Protostuff | 速度快,基于protobuf | 需静态编译 | | Protostuff-Runtime | 无需静态编译,但序列化前需预先传入schema | 不支持无默认构造函数的类,反序列化时需用户自己初始化序列化后的对象,其只负责将该对象进行赋值 | | Java | 使用方便,可序列化所有类 | 速度慢,占空间 |


https://blog.csdn.net/qq_38685503/article/details/114633168?spm=1001.2014.3001.5501

  1. 为什么选用ProtoBuff?
    https://blog.csdn.net/qq_38685503/article/details/114694343

  2. 为什么选KRYO序列化?(面试官提示了压缩),java 的压缩算法

  3. 序列化怎么做的(序列化怎么实现)?Kryo原理了解吗?

  4. 你说到你自定义了一个简单协议,自定义的协议头里包括哪些内容,多少字节,各自的作用是什么(魔数,消息长度,请求id,消息类型)

  5. 由RPC项目问到了序列化反序列化,问到了对象有一个属性是对象引用,怎么序列化。

  6. 如何实现编解码及序列化?

  7. 那你这个序列化还是针对Java语言的,如何实现跨语言的序列化或者RPC框架?
    Java
    RPC框架要想跨语言,本质是在解决序列化/反序列化的跨语言问题

三、Netty

策略:BIO、NIO、AIO三者区别

1.TCP 的粘包的概念是对的吗(面试官:TCP 是面向字节流的,所以这个概念本身是一个伪概念,本身就是可以粘的。但是这种现象还是要解决的)

  1. 简述AIO、BIO、NIO的具体使用、区别及原理

  2. BIO,NIO,AIO的痛点,怎么优化?

  3. IO/NIO/AIO区别?介绍Reactor,介绍Proactor?
    为什么BIO比NIO性能差?简单讲讲区别?
    假设有100个连接,采用NIO的方式要服务端要分配几个线程,采用BIO的方式呢?
    为啥要用异步IO不用多线程,不是一样可以加速吗?

  4. 说说你对Netty的认识?

  5. NIO中Channel的作用

  6. NIO的设计架构?JDK中NIO有哪些重要组件?

  7. 为什么选用Netty来做通信框架?还知道其他网络通信框架?

  8. Netty怎么实现高性能的?Netty高性能主要依赖了哪些特性?Netty为什么快(基于NIO+零拷贝)Netty为啥效率高(零拷贝,线程模型)

  9. netty bytebuf工作原理,和NIO里buffer区别?

  10. 除了Netty还知道哪些网络传输框架吗?

  11. 为什么大多数rpc框架都用netty(聊了下Netty的特点)?你为什么会用到Netty?

  12. 同步、异步调用方式的具体实现

  13. Netty使用场景

  14. Netty的线程模型

  15. RPC过程网络上发生了什么

  16. RPC多个请求是在一个连接完成的吗

  17. Netty服务调用如何变成同步的?(不知道)
    Netty异步编程怎么做的?

  18. 基于Netty实现通信,使用了哪些TCP优化参数?
    你说网络通信使用的Netty,你都通过那些设置对Netty进行过调优(我表示Netty的bootstrap的option设置基本都是模仿Netty官方案例搞的,然后他问了我backlog是什么意思)

  19. tcp粘包
    粘包半包怎么解决的(LineBased和LengthBased,我是用的是LineBased)
    为什么要使用LineBased,怎么分割的(/r/n,当时没有考虑太多,觉得这个比较简单)

  20. Netty解决粘包的几种方式
    Netty 拆包粘包的实质,Netty线程池中的线程建立连接之后,这条连接是不是始终于这个请求,对于Netty来说是不是只占用服务端的一个套接字,了解zero copy嘛
    项目中如何解决粘包、拆包的问题(基于字符或者基于长度)
    你这个报文传输的时候会不会遇到报文粘连的情况?如何解决?

  21. Netty底层原理

  22. Netty中的select过程

  23. 零拷贝讲讲(mmap优化,sendfile)

  24. Netty的两个线程池,为什么两个,有什么区别,具体说来。
    Netty初始化的时候需要初始化两个线程池,你能简单说一说吗?

  25. 怎么实现保持长连接的(Netty保证的,应该是使用了TCP的长连接特性)

  26. 如何实现心跳保持(IDLE编解码器监听事件)

  27. 多少个线程,为什么这么设置?(netty自带的,默认CPU*2)

四、负载均衡

策略:负载均衡算法(四种)、负载均衡器设置、负载均衡作用

项目实现:

  1. 项目中负载均衡怎么实现的(看项目代码)
    怎么实现负载均衡策略的(我只做了最简单的轮询、加权、随机,通过在zookeeper中配置,然后将引用按照权重将Channel的引用加入到一个List当中)
    先设置一个负载均衡接口LoadBalancer,然后用继承接口得到轮询、随机两个类,然后在NacosServiceDiscovery设置一个loadBalancer属性及它的函数,
    在SocketTestClient的创建client时传入loadBalancer参数到SocketClient类中,serviceDiscovery
    测试类中
    SocketClient client = new SocketClient(CommonSerializer.KRYO_SERIALIZER, new RoundRobinLoadBalancer());
    构造函数
    serviceDiscovery = new NacosServiceDiscovery(loadBalancer);
    NacosServiceDiscovery中
    public NacosServiceDiscovery(LoadBalancer loadBalancer){
    if (loadBalancer == null){
    this.loadBalancer = new RandomLoadBalancer();
    }else {this.loadBalancer = loadBalancer;}}
    lookupService方法调用
    Instance instance = loadBalancer.select(instances);

  2. 项目中负载均衡算法用到那些
    轮询、随机

  3. 解释一下什么是负载均衡?
    指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行
    之后结合算法回答

  4. 负载均衡了解哪些(dubbo的四种策略说了下(轮询、随机、一致性哈希、最小活跃数),https://www.cnblogs.com/twoheads/p/10131656.html)


(1) RandomLoadBalance:随机负载均衡。随机的选择一个。是Dubbo的默认负载均衡策略(Dubbo 中的随机负载是按照权重设置随机概率)。
(2) RoundRobinLoadBalance:轮询负载均衡。轮询选择一个(Dubbo中有权重的概念,按公约后的权重设置轮询比率)。
问题:存在慢的提供者请求的问题,比如:第二胎机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上
(3) LeastActiveLoadBalance:最少活跃调用数,相同活跃数的随机。活跃数指调用前后计数差。
好处:使慢的 Provider 收到更少请求,因为越慢的 Provider 的调用前后计数差会越大。
(4) ConsistentHashLoadBalance:一致性哈希负载均衡。一致性hash:添加删除机器前后映射关系一致,当然,不是严格一致。实现的关键是环形Hash空间。将数据和机器都hash到环上,数据映射到顺时针离自己最近的机器中。
好处:当某一台提供者挂时,原本该发往该提供者的请求,基于虚拟节点,平摊到其他提供者,不会引起剧烈变动

  1. RPC调用中使用随机算法和轮转算法做负载均衡的优缺点
    优点:实现简单,水平扩展方便
    缺点:因为相同的请求会被落到不同的机器上,浪费内存啊,内存有限,Cache会被淘汰,频繁淘汰,当然使得命中率低下啊。

  2. dubbo负载均衡算法,一致性哈希的实现?
    1.问简单的话,用4.(4)
    2.难的话源码,https://blog.csdn.net/Revivedsun/article/details/71022871

  3. Dubbo为什么推荐基于随机的负载均衡?
    1.实现简单,水平扩展方便
    2.在一个截面上碰撞的概率高,但调用越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重

  4. 负载均衡作用
    (1)根据集群中每个节点的负载情况将用户请求转发到合适的节点上, 以避免单点压力过大的问题
    (2)负载均衡可实现集群高可用及伸缩性
    高可用:某个节点故障时,负载均衡器会将用户请求转发到其他节点,从而保证所有服务持续可用.
    伸缩性:根据系统整体负载情况,可以很容易地添加或移除节点。

  5. 如何设计负载均衡器(http://www.voidcn.com/article/p-qmnricjo-beb.html)
    负载均衡器工作原理有两大方法:

    1. 接收客户端请求,将请求转发给集群中的各台服务器处理,服务器将处理结果返回给负载均衡器,负载均衡器将处理结果转发给相应的客户端。

    2. 接收客户端请求,将请求转发给集群中的各台服务器处理,服务器将处理结果直接返回给相应的客户端。

  6. 负载均衡如何保证健壮性?
    (采用心跳机制检测宕机节点。)

  7. 一个服务可能有多台机器可以调用?(利用负载均衡算法)

五、RPC 和 HTTP

  1. RPC 有没有可能会用 HTTP 协议?(有,如 grpc 就是 HTTP2.0)

  2. RPC 和 HTTP的对比?为什么要用 RPC?
    1、传输协议:
    RPC:基于HTTP协议,TCP协议
    HTTP:基于HTTP协议
    2、传输效率:
    RPC:(1)使用自定义的TCP协议,请求报文体积更小,
    (2)使用HTTP2协议,也可以很好的减小报文体积,提高传输效率
    HTTP:(1)基于http1.1的协议,请求中会包含很多无用的内容,
    (2)基于HTTP2.0,那么简单的封装下可以作为一个RPC来使用,这时标准的RPC框架更多的是服务治理。
    3、性能消耗:
    RPC:可以基于thrift实现高效的二进制传输
    HTTP:大部分是基于JSON实现的,字节大小和序列化耗时都比thrift要更消耗性能
    4、负载均衡:
    RPC:基本自带了负载均衡策略
    HTTP:需要配置Nginx、HAProxy配置
    5、服务治理:(下游服务新增,重启,下线时如何不影响上游调用者)
    RPC:能做到自动通知,不影响上游
    HTTP:需要事先通知,如修改NGINX配置。

  3. RPC 传输速度比 HTTP 更快吗?
    不一定,但一般会快。取决于序列化协议和传输协议,
    比如二进制编码肯定比 JSON 节省体积,自定义 tcp 协议/HTTP2.0 比 tcp/HTTP1.1 要快

  4. 用的TCP还是HTTP2传输的?
    自己项目、DUBBO:TCP
    grpc:http2.0

  5. HTTP 和 RPC 的关系? RPC 和 HTTP 的区别?

  6. 为什么spring cloud用的是http
    HTTP Restful本身轻量,易用,适用性强,可以很容易的跨语言,跨平台,或者与已有系统交互,
    目前很多大型项目多语言共存,http是最通用的协议,可以很好地解决跨语言跨平台兼容性

  7. 为啥用RPC,为什么不用HTTP?
    https://www.zhihu.com/question/41609070

  8. 为什么我们要使用RPC而不是使用HTTP(讨论了挺久的,我还是没回答上来)。后续整理了一下,感觉可能是当时我没理解到位想问的问题,放在这里: https://www.jianshu.com/p/f193bc194e3c

  9. 你这个RPC框架是基于HTTP请求的吗?
    不是,基于TCP

  10. RPC 是用的时候连一次,还是连一次后就长连接?
    自己的RPC是长连接(Netty 中提供了 IdleStateHandler 类专门用于处理心跳,所以是长连接
    没有这个,默认一般是短连接)

六、DUBBO与其他框架(学有余力可看,可以不看)

  1. RPC 框架有哪些?不同RPC框架的区别?brpc(百度)、grpc 了解吗?

  2. 除了Dubbo,还了解其他RPC框架吗(gRPC, Thirft 有什么区别)

  3. 能聊聊gRPC和DUBBO这两类框架区别?

  4. DUBBO容错机制
    1.Failover 失败自动切换:当出现失败,重试其它服务器,通常用于读操作(推荐使用)。 重试会带来更长延迟。
    2.Failfast 快速失败:只发起一次调用,失败立即报错,通常用于非幂等性的写操作。 如果有机器正在重启,可能会出现调用失败 。
    3.Failsafe 失败安全:出现异常时,直接忽略,通常用于写入审计日志等操作。 调用信息丢失 可用于生产环境 Monitor。
    4.Failback 失败自动恢复:后台记录失败请求,定时重发。通常用于消息通知操作 不可靠,重启丢失。 可用于生产环境 Registry。
    5.Forking 并行调用多个服务器:只要一个成功即返回,通常用于实时性要求较高的读操作。 需要浪费更多服务资源 。
    6.Broadcast:广播调用,所有提供逐个调用,任意一台报错则报错。通常用于更新提供方本地状态 速度慢,任意一台报错则报错 。

  5. DUBBO不足,以及优化方向?
    (语言支持、Dubbo服务治理方面比如分布式配置管理、服务跟踪、批量任务)

  6. RPC框架怎么设计

  7. Dubbo 工作原理(不会真有人问校招吧,不会吧,不会吧)?
    https://www.cnblogs.com/jackion5/p/11219707.html
    https://blog.csdn.net/ygl19920119/article/details/88342523

  8. 什么是 Dubbo?(百度谷歌结合Dubbo工作原理)

  9. Dubbo是基于什么协议传输的?Dubbo支持http协议嘛?
    TCP,支持

  10. 请问RPC框架跟SPRINGBOOT区别。

  11. 对比不同 RPC 框架比如 DUBBO 的设计差异吗?

  12. DUBBO的运行流程?注册中心挂了还可以调用吗?

  13. 讲了RPC用了 Dubbo SPI机制,大概就是借鉴 Dubbo 的一些东西

  14. DUBBO协议和http协议的区别?

七、动态代理

  1. 动态代理的实现原理
  2. JDK动态代理机制是怎么实现的(反射,再底层原理不太清楚)
  3. CGLIB 底层?动态代理,CGLIB是怎么实现的?
  4. 一个类有方法a和方法b,两个方法都被代理,方法a中调用了方法b,被代理后调用a方法,a方法中调用的是被代理的方法b还是普通方法b?(求大神解答)
  5. 知道怎么撑爆方法区内存吗?或者说怎么动态生成很多方法? (CGLIB 动态生成类、方法)
  6. Java proxy和CGLIB的区别(使用场景和限制)
  7. 怎么实现透明调用的(自定义一个注解,然后在BeanPostProcesser中拦截使用了这个注解的接口,然后使用CGLIB动态代理进行远程调用)
  8. 如何实现异步调用的?(将Future储存起来,再新建一个线程去维护这个Future的状态)

八、RPC的实现(怎么介绍自己的RPC项目)

RPC问题汇总2.0 - 图1

  1. 如果让你设计一个RPC框架,要设计啥(服务注册中心,负载均衡,无感调用,服务注销)
  2. RPC 框架有哪些组成部分?
  3. 分布式系统设计需要考虑什么方面(我从CAP定理的角度分析的)
  4. 如何设计一套高并发的系统(微服务,消息中间件解耦,缓存)
  5. RPC跟RESTful的区别、底层协议
  6. 实现RPC框架是怎么实现的?
  7. 实现高性能的RPC关键在于哪些方面(我从序列化,通信协议,IO模型三个方面回答)
  8. RPC框架(一个微服务的上下架怎么被感知,也就是注册中心的实现,单点登录的实现,跨域问题的解决)
  9. 你这个RPC有什么地方需要改进的?
  10. RPC具体讲一下?
  11. 讲RPC,服务上下线、客户端的Watch,还有些其他细节,比如服务下线怎么做的
  12. 你的RPC可以支持多语言吗?(不能)

九、RPC项目出现的问题及任何解决

  1. 熔断策略,服务存在容量上限,优化还有什么想法?

  2. 熔断降级有什么区别?(我回答的是降级是发生在熔断之后的,后来面试官说进行限流的时候也会降级)?

  3. 如何做熔断机制?

  4. RPC调用中服务器宕机之后发生了什么?

  5. 如果服务调用过程中服务器突然宕机怎么处理?(答服务注销钩子,心跳检测,二次请求)

  6. 追问,如果插入5个数据,插入完第一个服务器宕机了咋办?(答思路,和服务注册中心维护一个执行偏移量,然后从偏移点继续执行)

  7. 追问,如果连偏移量都还没来得及同步呢(die了,不会)

  8. 如果线上服务出了问题,一般怎么排查的?

  9. 你排查过哪些线上问题?

  10. RPC过程中异常怎么处理的,利用反射生成?还有怎么传输或者有没有必要

  11. 怎么调用?(IO模型和线程模型和序列化协议和同步异步)
    调用失败怎么办?(容错策略比如重试或者选择其他机器掉调用)

  12. RPC调用中如果出错怎么处理

  13. 像SpringMvc提供给用户自定义拦截器的功能,你的框架有没有提供类似的接口,可以给用户做一些拓展(没有,但问题没结束,面试官一点点提示,我想不起来当时答上来没了)

  14. 如何集成 Spring 通过注解注册服务、消费服务

  15. spring底层前置后置处理等怎么实现的

  16. 项目中spring的使用机制

十一、其他细节问题

  1. RPC项目如果要实现内存零拷贝怎么做?

  2. 有没有提供什么扩展的接口,钩子给其人或程序方便扩展。

  3. 整体服务调用链路是怎样的?

  4. 有没有考虑过服务治理相关的事情吗(还没有)

  5. 有没有完整比较过性能?比较传输协议的性能?序列化的性能?(没有)

  6. 做RPC时会做内容协商吗?

  7. kill 之后,shutdownHook还会执行吗

  8. 协程中的Future和Promise机制

  9. 你这边说到心跳检测,听你的意思你的心跳检测处理和业务处理是一起处理的吗(我这边是的,evenrtriggered和channelread的确写在了一个handler里)

  10. 你有为你的业务处理开辟专门的线程吗,具体是怎么做的(在bootstrap绑定线程)

  11. 你说你用来作为不同服务的识别标识是接口名,用的接口名是全路径名吗,你在服务端如何对应到具体的方法上

  12. 如果我现在在一部分机器上更新了我的接口,你这边是如何做到或者你将如何去做能让客户端区分新版和旧版

  13. 如果服务下架了,你在客户端需要做什么事

  14. 如果你的框架拿去给上层写实现的小伙伴去用,你是如何做到…(具体说法记不太清了,我这里是讲了一下我的自定义注解是如何去实现的)

  15. RPC 框架中,服务发现的时候是每次 call 的时候都重新连一个 ip,还是使用一个长连接?(这个有同学可以帮我回答下吗)

  16. 你这个数据传输的明文的吗? ->这题答爆了,脑子一热,答虽然没有加密,但是后期可以用md5加密,

  17. 怎么去记录待执行的异步任务,如果服务器重启了怎么去记录?

  18. 线程池拒绝策略,你项目里经常使用哪种策略,调用方线程完成任务有什么问题没有?

  19. 如果想要RPC传入一个可以执行的函数,怎么传?

  20. RPC项目长连接心跳机制

  21. 协议用的哪个,为啥不用UDP

  22. RPC框架的原理,方法名怎么传输的

  23. RPC项目中有做单元测试吗?(没有)

  24. 你有把自己的RPC项目用在生产上吗(没有)

  25. 微服务RPC下,发现使用TCP的效率比UDP高,可能是什么原因

  26. RPC是通过API实现的,讲讲具体服务(没太明白)

  27. restful阐述

  28. RPC 的优点?

  29. Dubbo或NETTY源码中你觉得有亮点的地方。(没看过不会)

  30. RPC 解决了现在的哪些问题? 有没有想过把你的项目改造成 RPC? 你的rpc做的时候有什么取舍?(实在没想到有啥取舍,就说做了什么功能)

  31. RPC中的关键技术?(面试官提示了协议制定),RPC工具的难点

  32. RPC框架写了多少行

  33. 分布式有哪些问题?
    (1)RPC如何保证分布式节点数据同步?
    (2)一个分布式部署的项目?至少需要哪些模块?
    (3)分布式锁?场景?
    (4)分布式锁的原理是什么、怎么做的(解决多个机器间的资源互斥)
    (5)如何实现一个分布式 session 服务

  34. TCP在当前存在的问题,滑动窗口机制、拥塞控制的不合理性,如何解决这个问题?
    (用UDP的方式解决滑动窗口的问题,解决网络传输被限制的问题)(参考google正在开发的一套网络协议)

  35. MTU为什么最大1500
    Maximum Transmission Unit,缩写MTU,中文名是:最大传输单元。MTU是数据链路层的概念。
    https://blog.csdn.net/passionkk/article/details/100538418

  36. RPC调用原理:
    (1)一致性哈希比其他方法的优点?(当增加或减少服务节点时,不会造成哈希表的全量重新映射,而是增量式的重新映射)
    (2)一致性哈希在某节点宕机时怎么保证一致性的?
    (3)了不了解hessian协议(不太了解)

  37. 一致性哈希
    服务调用方:写一个注解,注解表明服务提供方得地址,没有注册中心得情况下….然后代理这个对象,内部调用逻辑通过一个ChannelHandler实现,先扫描注解上的获取得提供方得IP,然后把参数、方法名序列化成JSON,发送给提供方,之后进入wait状态,等到结果返回,解析返回结果(通过ChannelHandler得钩子方法去解析),然后把结果存起来,notify醒刚才wait得线程,然后返回存储得结果
    服务提供方:通过Netty监听一个端口,等人过来调,有人来调,解码器解码TCP,解析JSON,找到对应得服务,执行服务代码得到返回值再序列化成Json,然后传回去