当前位置: 首页 > news >正文

第四篇:Dubbo 本地存根 (Stub) 和 本地伪装 (Mock) 的核心总结

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 Map<String, 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 List<User> listAll() { // --- 前置逻辑:检查本地缓存 --- if (LOCAL_CACHE.containsKey(CACHE_KEY_ALL_USERS)) { System.out.println("[Stub] 命中本地缓存,直接返回,【不发起远程调用】"); //@SuppressWarnings("unchecked") List<User> cachedUsers = (List<User>) LOCAL_CACHE.get(CACHE_KEY_ALL_USERS); return cachedUsers; } System.out.println("[Stub] 缓存未命中,准备发起远程调用..."); try { // --- 执行真正的远程调用 --- List<User> 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 List<User> listAll() { System.err.println("[Mock] 警告:远程 UserService 调用失败!正在执行降级策略..."); return List.of(new User(0L,"空","kong@qq.com",0)); } }

使用,修改 @DubboReference 注解,添加stub , mock

@DubboReference(version = "1.0", loadbalance = "roundrobin", stub = "com.example.dubbo.consumer.stub.UserServiceStub", mock ="com.example.dubbo.consumer.mock.UserService_mock" ) private UserService userServiceAny;
http://www.jsqmd.com/news/486208/

相关文章:

  • IBM与ETH联合开创AI视觉推理新范式
  • 哪家短信平台好?正规三网106短信服务商横评 - Qqinqin
  • 109. 天才ACM(二分、倍增
  • 大数据微服务治理:Eureka注册表同步机制剖析
  • 2026年3月山东青岛旅拍/婚纱照/全家福/女士写真/生日照公司实力测评 - 2026年企业推荐榜
  • 2026年全国学俄语机构哪家靠谱?专业可信 适配不同学习场景 适配各类人群 - 深度智识库
  • SQLMAP的安装和使用
  • 菜刀怎么选?这份菜刀推荐品牌请收好,王麻子凭百年匠心脱颖而出 - 速递信息
  • STM32 单片机 按键 非阻塞
  • 联合循环——11 厂用储能电池原理介绍
  • Ubuntu+PM2实现nohup.out日志实时网页监控(亲测可用)
  • 联合循环——12 电厂通讯系统简介
  • 2026风机行业标杆企业深度解析——以绍兴上虞英达风机有限公司为核心 - 深度智识库
  • 贝赛思入学考试辅导机构:全周期备考体系与升学辅导实践 - 品牌2026
  • 2026年GitHub最火的开源AI项目:除了OpenClaw还有这些宝藏
  • 2026年最新公众号排版模板网站亲测推荐 5个宝藏微信公众平台编辑器、微信公众号助手实测对比 - 鹅鹅鹅ee
  • 掌握SwiftIconFont前缀系统:13类图标字体的快速查找与调用秘籍
  • 2026年枕式包装机采购指南:从“设备买卖”到“价值共创”,这四家源头工厂凭什么领跑? - 深度智识库
  • 联合循环——13 智能电厂的发展
  • 2026年食品包装机厂家实力推荐智能智造适配多行业发展需求 - 深度智识库
  • 文章代码地址
  • 发短信平台哪家好?国内主流短信供应商推荐 - Qqinqin
  • Unity中实现从随机位置逐渐扩散的颜色渐变动画效果
  • SaaS短信系统哪家好?简单易上手的短信平台推荐 - Qqinqin
  • 联合循环——14 厂用电缆介绍
  • 提示工程架构师深度分享:智能推荐系统的迭代优化方法论
  • ADS1115调试记录
  • 联合循环——25 电厂PID原理图介绍
  • 2026美本申请变局:当名校重启“标化强制令”,SAT备考如何破局? - 品牌2026
  • 如何快速构建现代Web应用:Microsoft Web Template Studio终极指南