在 Dubbo 框架中,本地存根和本地伪装分别指的是什么?它们的配置方式和使用场景有何不同?
考察说明
考察对 Dubbo 服务调用扩展机制的理解,特别是 Stub 和 Mock 的区别与应用。
回答思路
- 【回答框架 1】本地存根(Stub)是在服务消费方本地生成的一个代理类,它实现了服务接口,并在调用远程服务前后执行额外的逻辑,如参数校验、缓存、日志记录等。配置方式是在消费者 XML 中通过 stub 属性指定存根类的全限定名,存根类需要有一个传入服务接口实现的构造函数。
- 【回答框架 2】本地伪装(Mock)是当服务调用失败或不可用时,在消费者本地提供降级实现,通常用于容错和故障隔离。配置方式是在消费者 XML 中通过 mock 属性指定,可以设置为 true 或一个 Mock 类名,Mock 类需要实现服务接口或继承 Stub 类,其方法在远程调用异常时被调用,返回兜底数据。
- 【回答框架 3】两者区别:Stub 作用于调用前置处理,而 Mock 作用于后置降级。Stub 在远程调用之前或之后执行,而 Mock 仅在远程调用失败(如超时、网络异常、服务不可用)时才触发。Mock 类也可以实现 RpcContext 来判断异常类型。
- 【回答框架 4】使用场景:Stub 适合做统一参数校验、安全校验、幂等处理等;Mock 适合做降级方案,如返回缓存数据或默认结果,保证服务可用性。
- 【关键点 1】Stub 用于调用前增强,Mock 用于失败降级。
- 【关键点 2】Stub 配置在 consumer 的 stub 属性,Mock 配置在 mock 属性。
- 【关键点 3】Mock 可通过 mock='true' 或 mock 类名配置,true 时使用远程调用的异常信息生成 mock。
- 【易错点 1】混淆 Stub 和 Mock 的作用时机:Stub 在调用前后,Mock 只在异常时。
- 【易错点 2】认为 Mock 可以替代 Stub 做前置校验,实际侧重点不同。
- 【易错点 3】忽略 Mock 类需要无参构造或特殊构造函数,导致实例化失败。