1. 核心定位部署位置两者都仅存在于消费者 (Consumer) 端。它们是客户端的本地逻辑扩展服务提供者 (Provider) 完全感知不到它们的存在也不需要任何配置。本质都是为了解决远程调用过程中的非功能性需求如性能优化、容错降级而不需要修改远程服务端的代码。2.本地存根(Local Stub)核心机制静态代理。它在远程调用发生之前介入。控制权拥有完全的主动权。它持有远程代理对象的引用可以决定是否发起远程调用。典型场景本地缓存先查本地命中则直接返回阻断远程调用提升性能。参数校验在发网络请求前拦截非法参数减少无效网络开销。上下文传递统一处理 ThreadLocal 变量或隐式参数。日志增强记录更详细的调用前后日志。关键特征每次调用都会执行构造函数必须注入远程代理对象。3.本地伪装(Local Mock)核心机制故障降级。它在远程调用失败之后介入。控制权被动触发。只有当远程调用抛出异常如超时、宕机、限流时才会被激活。典型场景服务降级非核心服务挂掉时返回默认值、空列表或友好提示防止雪崩。容错测试模拟服务不可用场景验证系统健壮性。屏蔽异常将技术异常转化为业务上的“无数据”状态保证主流程不中断。关键特征仅在失败时执行正常成功调用时无任何性能损耗通常不需要注入远程代理。4.一句话区别Stub是为了**“优化”能不能不调能不能先查缓存它是主动**的拦截器。Mock是为了**“保命”提供者挂了怎么办降级使用它是被动**的备胎。5. 最佳实践建议如果需要减少网络请求或做前置处理$\rightarrow$ 选Stub。如果需要防止系统崩溃或做兜底数据$\rightarrow$ 选Mock。组合使用可以先用 Stub 做缓存优化如果缓存没命中且远程调用失败了再自动触发 Mock 进行降级实现既高性能又高可用的架构。以下文件全部在 消费者工程 中Stub存根示例import com.example.dubbo.api.UserService; import com.example.dubbo.api.model.User; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.Map; // 实现相同的接口 public class UserServiceStub implements UserService { // 1. 持有真正的远程代理对象 (由 Dubbo 注入) private final UserService userService; // 2. 模拟一个本地缓存 (实际生产可用 Caffeine/Redis) private static final MapString, Object LOCAL_CACHE new ConcurrentHashMap(); private static final String CACHE_KEY_ALL_USERS key_all_users; // 【关键】构造函数必须包含接口类型的参数 public UserServiceStub(UserService userService) { this.userService userService; } Override public ListUser listAll() { // --- 前置逻辑检查本地缓存 --- if (LOCAL_CACHE.containsKey(CACHE_KEY_ALL_USERS)) { System.out.println([Stub] 命中本地缓存直接返回【不发起远程调用】); //SuppressWarnings(unchecked) ListUser cachedUsers (ListUser) LOCAL_CACHE.get(CACHE_KEY_ALL_USERS); return cachedUsers; } System.out.println([Stub] 缓存未命中准备发起远程调用...); try { // --- 执行真正的远程调用 --- ListUser result userService.listAll(); // --- 后置逻辑更新缓存 --- if (result ! null) { LOCAL_CACHE.put(CACHE_KEY_ALL_USERS, result); System.out.println([Stub] 远程调用成功已更新本地缓存); } return result; } catch (Exception e) { // 这里也可以做简单的容错但复杂的降级通常交给 Mock System.err.println([Stub] 远程调用异常: e.getMessage()); throw e; // 抛出异常让上层的 Mock 机制去处理如果配置了的话 } } }Mock降级示例import com.example.dubbo.api.UserService; import com.example.dubbo.api.model.User; import java.util.List; public class UserService_mock implements UserService { Override public ListUser listAll() { System.err.println([Mock] 警告远程 UserService 调用失败正在执行降级策略...); return List.of(new User(0L,空,kongqq.com,0)); } }使用修改 DubboReference 注解添加stub , mockDubboReference(version 1.0, loadbalance roundrobin, stub com.example.dubbo.consumer.stub.UserServiceStub, mock com.example.dubbo.consumer.mock.UserService_mock ) private UserService userServiceAny;