RPC问题汇总
一、注册中心
策略:服务注册原理、注册中心结构、zookeeper的原理、几个注册中心的区别、分布式算法、分布式事务。
项目细节:服务注册、服务发现、服务注销、监听机制
介绍一下服务注册中心怎么做的?
(1)服务发现:- 服务注册/反注册:保存服务提供者和服务调用者的信息
- 服务订阅/取消订阅:服务调用者订阅服务提供者的信息,最好有实时推送的功能
服务路由(可选):具有筛选整合服务提供者的能力。
配置订阅:服务提供者和服务调用者订阅微服务相关的配置
配置下发(可选):主动将配置推送给服务提供者和服务调用者
检测服务提供者的健康情况
一个注册中心,至少需要具备哪些条件?
服务注册接口:服务提供者通过调用服务注册接口来完成服务注册。
服务反注册接口:服务提供者通过调用服务反注册接口来完成服务注销。
心跳汇报接口:服务提供者通过调用心跳汇报接口完成节点存活状态上报。
服务订阅接口:服务消费者通过调用服务订阅接口完成服务订阅,获取可用的服务提供者节点列表。
服务变更查询接口:服务消费者通过调用服务变更查询接口,获取最新的可用服务节点列表。
服务查询接口:查询注册中心当前注册了哪些服务信息。
服务修改接口:修改注册中心中某一服务的信息。项目中RPC服务注册中心需要注意什么?
同 一.1,一.2如果让你设计一个服务注册中心,怎么设计
注册中心单机还是分布式的,其中一个挂了怎么办?一致性,可靠性怎么保证的?超时控制,加锁和管道支持并发,单机(考虑了多机情况
常用的服务注册中心, 注册中心的差异
使用zookeeper有什么好处
为什么用Zookeeper做注册中心(优点,与其他选型对比下)
说一下zookeeper,为什么使用zookeeper,不选其他注册中心,集群一般有几个节点,为什么?
了解Nacos和Zookeeper的区别吗?
为什么不选择Redis作为注册中心(zookeeper临时节点自动宕机自动清除)
为什么要用Zookeeper(服务注册、发现)
Zookeeper和Eureka分别是满足CAP中的哪些
socket过程中发生的系统调用
zookeeper服务发现
zookeeper服务容灾?zookeeper服务节点挂掉之后,怎么删除它?
容灾:在集群若干台故障后,整个集群仍然可以对外提供可用的服务。
一般配置奇数台去构成集群,以避免资源的浪费。
三机房部署是最常见的、容灾性最好的部署方案。
删除:使用临时节点,会话失效,节点自动清除。Zookeeper有几种角色?
群首(leader),追随者(follower),观察者(observer)CAP理论解释下?P是什么?
一致性(Consistency)多个副本之间的数据一致性
可用性(Availability)在合理规定的时间内,是否能返回一个明确的结果。
分区容错性(Partition tolerance)在分区故障下,仍然可以对外提供正常的服务。
一个分布式系统在以上三个特性中:最多满足其中的两个特性。
Zookeeper集群节点宕机了怎么发现剔除的?
发现:watcher机制
剔除:临时节点?服务熔断和服务降级有什么区别?(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)
服务熔断:如果某个目标服务调用慢或者有大量超时,此时,熔断该服务的调用,对于后续调用请求,不在继续调用目标服务,直接返回,快速释放资源。如果目标服务情况好转则恢复调用。
服务降级:当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行。**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.controlZAB算法讲一下(讲了ZAB是paxos的改版,Mysql是paxos、redis sentinel是raft、zookeeper是ZAB、ZAB的具体实现)
zk的分布式算法zab,如果选举的时候zxid都相同呢?(比较SID)
dubbo 怎么注册到zookeeper以及 dubbo 协议,zookeeper协议,
zookeeper的节点类型?(持久,临时,顺序)
分布式数据一致性协议都知道哪些(2PC 3PC Paxos)
Raft了不了解
分布式事务的几种解决方案(2PC,3PC,TCC,基于消息,然后顺带讲了一下优缺点) 分布式事务的几种方式吧(2pc、3pc、tcc、基于消息)以及区别
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你知道Zookeeper的分布式锁实现方式吗?(临时节点,如果服务器挂了,锁会自己消失)
ZooKeeper的作用?
项目答:注册中心。
扩展答:1.数据发布/订阅 2.自动化的DNS服务 3.数据库复制处理 4.基于zookeeper分布式系统机器间的通信方式 5.命名服务
6.集群管理(监控、控制) 7.Master选举 8.分布式锁 9.分布式队列zookeeper有什么特性,讲一下(临时节点、持久节点、ZAB)
服务下线还有没有别的实现方法(这就算引导了,结合前面的问题,使用临时节点)
zookeeper宕机与dubbo直连的情况?(https://blog.csdn.net/csdn_kenneth/article/details/82557734)
zookeeper注册中心宕机—>dubbo直连,可以调服务
zookeeper宕机了,消费者可以通过本地缓存通信调提供者的服务
现象:zookeeper注册中心宕机,还可以消费dubbo暴露的服务。
原因:健壮性监控中心宕掉不影响使用,只是丢失部分采样数据
数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务
注册中心对等集群,任意一台宕掉后,将自动切换到另一台
注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯
服务提供者无状态,任意一台宕掉后,不影响使用
服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复
任何一个请求过来都会打到注册中心么?
任何一个流量打过来都会打到注册中心么?
有一大批流量总是被打到一个实例上面,这个实例的兄弟实例分到的流量很少,怎么办?
有一个实例挂了怎么办?
注册中心怎么进行心跳检测
https://blog.csdn.net/sinat_29774479/article/details/103593878注册中心对于服务端掉线时怎么处理
服务端用的哪个类监听的(ServerSocket)
自己实现的定时器是啥?
服务调用方怎么知道服务不可用了?
怎么实现的类似本地调用?
如果是你如何设计一个nacos ,rpc如何调用。
如果注册中心服务器宕机怎么保证高可用?
高可用:通过设置减少系统不能提供服务的时间。
在zookeeper主要考虑容灾和扩容两方面提高高可用。服务的地址怎么知道?(注册中心)
服务注册信息的拆分要怎么做,服务注销怎么实现?
服务注册怎么进行服务注销监听?
服务注册中心的功能除了放在额外的服务器上实现还能放在哪里?怎么实现?
RPC调用中服务注册怎么做的?
RPC服务注册、服务发现、服务注销怎么做的
RPC项目zookeeper怎么实现注册、发现的(临时节点存储ip+端口+负载均衡策略)
RPC心跳怎么实现的,是服务端给服务注册中心心跳还是服务端给客户端心跳
了解过zookeeper的问题吗?
(崩溃恢复无法提供服务、写的性能瓶颈是一个问题、选举过程速度缓慢、无法进行有效的权限控制)
二、序列化与反序列化以及协议
策略:几个序列化协议的区别以及优缺点、Kryo的原理和安全性、两个接口区别。
项目细节:在项目怎么定义序列化协议,怎么定义序列化相关的类以及项目序列化的细节,
序列化和反序列化有什么作用
(1)实现了数据的持久化:永久性保存对象,保存对象的字节序列到本地文件或者数据库中;
(2)序列化实现远程通:通过序列化以字节流的形式使对象在网络中进行传递和接收;
(3)通过序列化在进程间传递对象;Serializable和Externalizable懂吗?(不知道Externalizable)
https://my.oschina.net/wangmengjun/blog/1588096
1、Serializable序列化时不会调用默认的构造器,而Externalizable序列化时会调用默认构造器的!
2、Serializable:一个对象想要被序列化,它的类就要实现 此接口,这个对象的所有属性都可以被序列化和反序列化来保存、传递。
Externalizable:自定义序列化可以控制序列化的过程和决定哪些属性不被序列化。
3、使用Externalizable时,必须按照写入时的确切顺序读取所有字段状态。否则会产生异常。serializable关键字的作用(实现原理)?几种序列化协议?ProtoBuff的优点?
https://blog.csdn.net/lwj_zeal/article/details/90743500有没有阅读过序列化(Java Serialization、Fastjson)之后的数据
RPC 不同序列化协议了解吗?优缺点是?各种序列号协议的特点?序列化方式有哪几个,区别是什么,自己写过吗? | | 优点 | 缺点 | | —- | —- | —- | | Kryo | 速度快,序列化后体积小 | 跨语言支持较复杂 | | Hessian | 默认支持跨语言 | 较慢 | | Protostuff | 速度快,基于protobuf | 需静态编译 | | Protostuff-Runtime | 无需静态编译,但序列化前需预先传入schema | 不支持无默认构造函数的类,反序列化时需用户自己初始化序列化后的对象,其只负责将该对象进行赋值 | | Java | 使用方便,可序列化所有类 | 速度慢,占空间 |
https://blog.csdn.net/qq_38685503/article/details/114633168?spm=1001.2014.3001.5501
为什么选用ProtoBuff?
https://blog.csdn.net/qq_38685503/article/details/114694343为什么选KRYO序列化?(面试官提示了压缩),java 的压缩算法
序列化怎么做的(序列化怎么实现)?Kryo原理了解吗?
你说到你自定义了一个简单协议,自定义的协议头里包括哪些内容,多少字节,各自的作用是什么(魔数,消息长度,请求id,消息类型)
由RPC项目问到了序列化反序列化,问到了对象有一个属性是对象引用,怎么序列化。
如何实现编解码及序列化?
那你这个序列化还是针对Java语言的,如何实现跨语言的序列化或者RPC框架?
Java
RPC框架要想跨语言,本质是在解决序列化/反序列化的跨语言问题
三、Netty
策略:BIO、NIO、AIO三者区别
1.TCP 的粘包的概念是对的吗(面试官:TCP 是面向字节流的,所以这个概念本身是一个伪概念,本身就是可以粘的。但是这种现象还是要解决的)
简述AIO、BIO、NIO的具体使用、区别及原理
BIO,NIO,AIO的痛点,怎么优化?
IO/NIO/AIO区别?介绍Reactor,介绍Proactor?
为什么BIO比NIO性能差?简单讲讲区别?
假设有100个连接,采用NIO的方式要服务端要分配几个线程,采用BIO的方式呢?
为啥要用异步IO不用多线程,不是一样可以加速吗?说说你对Netty的认识?
NIO中Channel的作用
NIO的设计架构?JDK中NIO有哪些重要组件?
为什么选用Netty来做通信框架?还知道其他网络通信框架?
Netty怎么实现高性能的?Netty高性能主要依赖了哪些特性?Netty为什么快(基于NIO+零拷贝)Netty为啥效率高(零拷贝,线程模型)
netty bytebuf工作原理,和NIO里buffer区别?
除了Netty还知道哪些网络传输框架吗?
为什么大多数rpc框架都用netty(聊了下Netty的特点)?你为什么会用到Netty?
同步、异步调用方式的具体实现
Netty使用场景
Netty的线程模型
RPC过程网络上发生了什么
RPC多个请求是在一个连接完成的吗
Netty服务调用如何变成同步的?(不知道)
Netty异步编程怎么做的?基于Netty实现通信,使用了哪些TCP优化参数?
你说网络通信使用的Netty,你都通过那些设置对Netty进行过调优(我表示Netty的bootstrap的option设置基本都是模仿Netty官方案例搞的,然后他问了我backlog是什么意思)tcp粘包
粘包半包怎么解决的(LineBased和LengthBased,我是用的是LineBased)
为什么要使用LineBased,怎么分割的(/r/n,当时没有考虑太多,觉得这个比较简单)Netty解决粘包的几种方式
Netty 拆包粘包的实质,Netty线程池中的线程建立连接之后,这条连接是不是始终于这个请求,对于Netty来说是不是只占用服务端的一个套接字,了解zero copy嘛
项目中如何解决粘包、拆包的问题(基于字符或者基于长度)
你这个报文传输的时候会不会遇到报文粘连的情况?如何解决?Netty底层原理
Netty中的select过程
零拷贝讲讲(mmap优化,sendfile)
Netty的两个线程池,为什么两个,有什么区别,具体说来。
Netty初始化的时候需要初始化两个线程池,你能简单说一说吗?怎么实现保持长连接的(Netty保证的,应该是使用了TCP的长连接特性)
如何实现心跳保持(IDLE编解码器监听事件)
多少个线程,为什么这么设置?(netty自带的,默认CPU*2)
四、负载均衡
策略:负载均衡算法(四种)、负载均衡器设置、负载均衡作用
项目实现:
项目中负载均衡怎么实现的(看项目代码)
怎么实现负载均衡策略的(我只做了最简单的轮询、加权、随机,通过在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);
项目中负载均衡算法用到那些
轮询、随机解释一下什么是负载均衡?
指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行
之后结合算法回答-
负载均衡了解哪些(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到环上,数据映射到顺时针离自己最近的机器中。
好处:当某一台提供者挂时,原本该发往该提供者的请求,基于虚拟节点,平摊到其他提供者,不会引起剧烈变动
RPC调用中使用随机算法和轮转算法做负载均衡的优缺点
优点:实现简单,水平扩展方便
缺点:因为相同的请求会被落到不同的机器上,浪费内存啊,内存有限,Cache会被淘汰,频繁淘汰,当然使得命中率低下啊。dubbo负载均衡算法,一致性哈希的实现?
1.问简单的话,用4.(4)
2.难的话源码,https://blog.csdn.net/Revivedsun/article/details/71022871Dubbo为什么推荐基于随机的负载均衡?
1.实现简单,水平扩展方便
2.在一个截面上碰撞的概率高,但调用越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重负载均衡作用
(1)根据集群中每个节点的负载情况将用户请求转发到合适的节点上, 以避免单点压力过大的问题
(2)负载均衡可实现集群高可用及伸缩性
高可用:某个节点故障时,负载均衡器会将用户请求转发到其他节点,从而保证所有服务持续可用.
伸缩性:根据系统整体负载情况,可以很容易地添加或移除节点。如何设计负载均衡器(http://www.voidcn.com/article/p-qmnricjo-beb.html)
负载均衡器工作原理有两大方法:接收客户端请求,将请求转发给集群中的各台服务器处理,服务器将处理结果返回给负载均衡器,负载均衡器将处理结果转发给相应的客户端。
接收客户端请求,将请求转发给集群中的各台服务器处理,服务器将处理结果直接返回给相应的客户端。
负载均衡如何保证健壮性?
(采用心跳机制检测宕机节点。)一个服务可能有多台机器可以调用?(利用负载均衡算法)
五、RPC 和 HTTP
RPC 有没有可能会用 HTTP 协议?(有,如 grpc 就是 HTTP2.0)
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配置。RPC 传输速度比 HTTP 更快吗?
不一定,但一般会快。取决于序列化协议和传输协议,
比如二进制编码肯定比 JSON 节省体积,自定义 tcp 协议/HTTP2.0 比 tcp/HTTP1.1 要快用的TCP还是HTTP2传输的?
自己项目、DUBBO:TCP
grpc:http2.0HTTP 和 RPC 的关系? RPC 和 HTTP 的区别?
为什么spring cloud用的是http
HTTP Restful本身轻量,易用,适用性强,可以很容易的跨语言,跨平台,或者与已有系统交互,
目前很多大型项目多语言共存,http是最通用的协议,可以很好地解决跨语言跨平台兼容性为啥用RPC,为什么不用HTTP?
https://www.zhihu.com/question/41609070为什么我们要使用RPC而不是使用HTTP(讨论了挺久的,我还是没回答上来)。后续整理了一下,感觉可能是当时我没理解到位想问的问题,放在这里: https://www.jianshu.com/p/f193bc194e3c
你这个RPC框架是基于HTTP请求的吗?
不是,基于TCPRPC 是用的时候连一次,还是连一次后就长连接?
自己的RPC是长连接(Netty 中提供了IdleStateHandler
类专门用于处理心跳,所以是长连接
没有这个,默认一般是短连接)
六、DUBBO与其他框架(学有余力可看,可以不看)
RPC 框架有哪些?不同RPC框架的区别?brpc(百度)、grpc 了解吗?
除了Dubbo,还了解其他RPC框架吗(gRPC, Thirft 有什么区别)
能聊聊gRPC和DUBBO这两类框架区别?
DUBBO容错机制
1.Failover 失败自动切换:当出现失败,重试其它服务器,通常用于读操作(推荐使用)。 重试会带来更长延迟。
2.Failfast 快速失败:只发起一次调用,失败立即报错,通常用于非幂等性的写操作。 如果有机器正在重启,可能会出现调用失败 。
3.Failsafe 失败安全:出现异常时,直接忽略,通常用于写入审计日志等操作。 调用信息丢失 可用于生产环境 Monitor。
4.Failback 失败自动恢复:后台记录失败请求,定时重发。通常用于消息通知操作 不可靠,重启丢失。 可用于生产环境 Registry。
5.Forking 并行调用多个服务器:只要一个成功即返回,通常用于实时性要求较高的读操作。 需要浪费更多服务资源 。
6.Broadcast:广播调用,所有提供逐个调用,任意一台报错则报错。通常用于更新提供方本地状态 速度慢,任意一台报错则报错 。DUBBO不足,以及优化方向?
(语言支持、Dubbo服务治理方面比如分布式配置管理、服务跟踪、批量任务)RPC框架怎么设计
Dubbo 工作原理(不会真有人问校招吧,不会吧,不会吧)?
https://www.cnblogs.com/jackion5/p/11219707.html
https://blog.csdn.net/ygl19920119/article/details/88342523什么是 Dubbo?(百度谷歌结合Dubbo工作原理)
Dubbo是基于什么协议传输的?Dubbo支持http协议嘛?
TCP,支持请问RPC框架跟SPRINGBOOT区别。
对比不同 RPC 框架比如 DUBBO 的设计差异吗?
DUBBO的运行流程?注册中心挂了还可以调用吗?
讲了RPC用了 Dubbo SPI机制,大概就是借鉴 Dubbo 的一些东西
DUBBO协议和http协议的区别?
七、动态代理
- 动态代理的实现原理
- JDK动态代理机制是怎么实现的(反射,再底层原理不太清楚)
- CGLIB 底层?动态代理,CGLIB是怎么实现的?
- 一个类有方法a和方法b,两个方法都被代理,方法a中调用了方法b,被代理后调用a方法,a方法中调用的是被代理的方法b还是普通方法b?(求大神解答)
- 知道怎么撑爆方法区内存吗?或者说怎么动态生成很多方法? (CGLIB 动态生成类、方法)
- Java proxy和CGLIB的区别(使用场景和限制)
- 怎么实现透明调用的(自定义一个注解,然后在BeanPostProcesser中拦截使用了这个注解的接口,然后使用CGLIB动态代理进行远程调用)
- 如何实现异步调用的?(将Future储存起来,再新建一个线程去维护这个Future的状态)
八、RPC的实现(怎么介绍自己的RPC项目)
- 如果让你设计一个RPC框架,要设计啥(服务注册中心,负载均衡,无感调用,服务注销)
- RPC 框架有哪些组成部分?
- 分布式系统设计需要考虑什么方面(我从CAP定理的角度分析的)
- 如何设计一套高并发的系统(微服务,消息中间件解耦,缓存)
- RPC跟RESTful的区别、底层协议
- 实现RPC框架是怎么实现的?
- 实现高性能的RPC关键在于哪些方面(我从序列化,通信协议,IO模型三个方面回答)
- RPC框架(一个微服务的上下架怎么被感知,也就是注册中心的实现,单点登录的实现,跨域问题的解决)
- 你这个RPC有什么地方需要改进的?
- RPC具体讲一下?
- 讲RPC,服务上下线、客户端的Watch,还有些其他细节,比如服务下线怎么做的
- 你的RPC可以支持多语言吗?(不能)
九、RPC项目出现的问题及任何解决
熔断策略,服务存在容量上限,优化还有什么想法?
熔断降级有什么区别?(我回答的是降级是发生在熔断之后的,后来面试官说进行限流的时候也会降级)?
如何做熔断机制?
RPC调用中服务器宕机之后发生了什么?
如果服务调用过程中服务器突然宕机怎么处理?(答服务注销钩子,心跳检测,二次请求)
追问,如果插入5个数据,插入完第一个服务器宕机了咋办?(答思路,和服务注册中心维护一个执行偏移量,然后从偏移点继续执行)
追问,如果连偏移量都还没来得及同步呢(die了,不会)
如果线上服务出了问题,一般怎么排查的?
你排查过哪些线上问题?
RPC过程中异常怎么处理的,利用反射生成?还有怎么传输或者有没有必要
怎么调用?(IO模型和线程模型和序列化协议和同步异步)
调用失败怎么办?(容错策略比如重试或者选择其他机器掉调用)RPC调用中如果出错怎么处理
像SpringMvc提供给用户自定义拦截器的功能,你的框架有没有提供类似的接口,可以给用户做一些拓展(没有,但问题没结束,面试官一点点提示,我想不起来当时答上来没了)
如何集成 Spring 通过注解注册服务、消费服务
spring底层前置后置处理等怎么实现的
项目中spring的使用机制
十一、其他细节问题
RPC项目如果要实现内存零拷贝怎么做?
有没有提供什么扩展的接口,钩子给其人或程序方便扩展。
整体服务调用链路是怎样的?
有没有考虑过服务治理相关的事情吗(还没有)
有没有完整比较过性能?比较传输协议的性能?序列化的性能?(没有)
做RPC时会做内容协商吗?
kill 之后,shutdownHook还会执行吗
协程中的Future和Promise机制
你这边说到心跳检测,听你的意思你的心跳检测处理和业务处理是一起处理的吗(我这边是的,evenrtriggered和channelread的确写在了一个handler里)
你有为你的业务处理开辟专门的线程吗,具体是怎么做的(在bootstrap绑定线程)
你说你用来作为不同服务的识别标识是接口名,用的接口名是全路径名吗,你在服务端如何对应到具体的方法上
如果我现在在一部分机器上更新了我的接口,你这边是如何做到或者你将如何去做能让客户端区分新版和旧版
如果服务下架了,你在客户端需要做什么事
如果你的框架拿去给上层写实现的小伙伴去用,你是如何做到…(具体说法记不太清了,我这里是讲了一下我的自定义注解是如何去实现的)
RPC 框架中,服务发现的时候是每次 call 的时候都重新连一个 ip,还是使用一个长连接?(这个有同学可以帮我回答下吗)
你这个数据传输的明文的吗? ->这题答爆了,脑子一热,答虽然没有加密,但是后期可以用md5加密,
怎么去记录待执行的异步任务,如果服务器重启了怎么去记录?
线程池拒绝策略,你项目里经常使用哪种策略,调用方线程完成任务有什么问题没有?
如果想要RPC传入一个可以执行的函数,怎么传?
RPC项目长连接心跳机制
协议用的哪个,为啥不用UDP
RPC框架的原理,方法名怎么传输的
RPC项目中有做单元测试吗?(没有)
你有把自己的RPC项目用在生产上吗(没有)
微服务RPC下,发现使用TCP的效率比UDP高,可能是什么原因
RPC是通过API实现的,讲讲具体服务(没太明白)
restful阐述
RPC 的优点?
Dubbo或NETTY源码中你觉得有亮点的地方。(没看过不会)
RPC 解决了现在的哪些问题? 有没有想过把你的项目改造成 RPC? 你的rpc做的时候有什么取舍?(实在没想到有啥取舍,就说做了什么功能)
RPC中的关键技术?(面试官提示了协议制定),RPC工具的难点
RPC框架写了多少行
分布式有哪些问题?
(1)RPC如何保证分布式节点数据同步?
(2)一个分布式部署的项目?至少需要哪些模块?
(3)分布式锁?场景?
(4)分布式锁的原理是什么、怎么做的(解决多个机器间的资源互斥)
(5)如何实现一个分布式 session 服务TCP在当前存在的问题,滑动窗口机制、拥塞控制的不合理性,如何解决这个问题?
(用UDP的方式解决滑动窗口的问题,解决网络传输被限制的问题)(参考google正在开发的一套网络协议)MTU为什么最大1500
Maximum Transmission Unit,缩写MTU,中文名是:最大传输单元。MTU是数据链路层的概念。
https://blog.csdn.net/passionkk/article/details/100538418RPC调用原理:
(1)一致性哈希比其他方法的优点?(当增加或减少服务节点时,不会造成哈希表的全量重新映射,而是增量式的重新映射)
(2)一致性哈希在某节点宕机时怎么保证一致性的?
(3)了不了解hessian协议(不太了解)一致性哈希
服务调用方:写一个注解,注解表明服务提供方得地址,没有注册中心得情况下….然后代理这个对象,内部调用逻辑通过一个ChannelHandler实现,先扫描注解上的获取得提供方得IP,然后把参数、方法名序列化成JSON,发送给提供方,之后进入wait状态,等到结果返回,解析返回结果(通过ChannelHandler得钩子方法去解析),然后把结果存起来,notify醒刚才wait得线程,然后返回存储得结果
服务提供方:通过Netty监听一个端口,等人过来调,有人来调,解码器解码TCP,解析JSON,找到对应得服务,执行服务代码得到返回值再序列化成Json,然后传回去