Skip to content

面试速答(先看这里)

**一句话结论:**首先,一次调用从Proxy开始,这里主要是借助JDK、javaassist等实现的动态代理,然后在开始执行之前,会经过一个filter,判断一下本地是否存在接口的缓存以及mock等,如果都没有,开始通过invoker进行服务调用。

60秒标准回答:

下图,是Dubbo的官网中给出的一张关于Dubbo的完整调用链

有些人能看懂,有些人看不懂,看不懂没关系,我给大家简化一下就可以看得懂了

首先,一次调用从Proxy开始,这里主要是借助JDK、javaassist等实现的动态代理,然后在开始执行之前,会经过一个filter,判断一下本地是否存在接口的缓存以及mock等,如果都没有,开始通过invoker进行服务调用

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**下图,是Dubbo的官网中给出的一张关于Dubbo的完整调用链:
  • **要点2:**有些人能看懂,有些人看不懂,看不懂没关系,我给大家简化一下就可以看得懂了:
  • **要点3:**服务调用者在启动时会从注册中心拉取和订阅对应的服务列表, Cluster会把拉取的服务列表聚合成一个Invoker列表。
  • **要点4:**在Invoker执行过程中,会先通过Directory获取所有可以调用的服务提供者的列表。
  • **要点5:**再根据请求查找对应的Exporter,然后开始执行Invoker,这里就要调用具体的服务实现方法了。

**记忆锚点:**Invoker → Dubbo → javaassist → 一下本地是否存在接口 → Directory → 然后把请求交给线程

加分表达:

  • 下图,是Dubbo的官网中给出的一张关于Dubbo的完整调用链: 有些人能看懂,有些人看不懂,看不懂没关系,我给大家简化一下就可以看得懂了: 首先,一次调用从Proxy开始,这里主要是借助JDK、javaassist等实现的动态代理,然后在开始执行之前,会经过一个filter,判断一下本地是否存在接口的缓存以及mock等,如果都没有,开始通过invoker进…

追问准备:

  • 围绕「Invoker」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「Dubbo」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「javaassist」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

下图,是Dubbo的官网中给出的一张关于Dubbo的完整调用链:

有些人能看懂,有些人看不懂,看不懂没关系,我给大家简化一下就可以看得懂了:

image.png

首先,一次调用从Proxy开始,这里主要是借助JDK、javaassist等实现的动态代理,然后在开始执行之前,会经过一个filter,判断一下本地是否存在接口的缓存以及mock等,如果都没有,开始通过invoker进行服务调用。

服务调用者在启动时会从注册中心拉取和订阅对应的服务列表, Cluster会把拉取的服务列表聚合成一个Invoker列表。

在Invoker执行过程中,会先通过Directory获取所有可以调用的服务提供者的列表。接下来在根据一些负载均衡的规则进行负载均衡来选出一个具体的Invoker。

在开始调用Invoker的invoke方法前,需要再进行一些过滤规则,如上下文处理、限流、以及计数等。

接下来就通过Invoker进行调用,在调用时会使用具体的客户端进行网络通信,如Netty,在这个过程中当然还需要做协议封装、数据的序列化等动作。

同时,客户端在收到请求后,同样需要进行反序列化,然后把请求交给线程池来进行调度执行。

再根据请求查找对应的Exporter,然后开始执行Invoker,这里就要调用具体的服务实现方法了。

然后再按照原路把结果返回。