coldsmog开发笔记
JS 事件笔记
Ckeditor 上传WPS图片失败问题
Springboot
SpringBoot 统一异常处理
Springboot 引入外部jar包
Springboot 打成war包
Springboot 多环境配置
SpringBoot @Scope注解学习
Springboot 快速生成项目API文档
SpringCache 缓存
Spring jetcache 二级缓存
Springboot 按条件装配类
FastJson的JsonPath语法
正则表达式语法
Spring 路径匹配
Feign 基础数据操作
监控Feign调用metrics
Springboot feign的性能优化
Jackson 设置序列化属性
SpringBoot 集成 Spring Data Mongodb 操作 MongoDB
MongoDB 的一些注意事项
MongoDB 指令对比
Jackson 解析XML
Springboot Redis注册
SpringBoot RedisTemplate批量插入
Springboot 指标监控Micrometer
springboot validation 注解校验
springboot 引入配置
Springboot 静态文件处理
Springboot 导出csv文件
Springboot 事件驱动(发布/订阅模式)
Springboot 启动过程和扩展点
Springboot 优化停机上下线
Spring自动装配 - 干饭角度学习
Springboot ShardingJDBC
Springboot的重试
springboot 动态修改端口
Oracle
Oracle 中实现自增ID
Oracle 定时任务
Oracle 解锁临时表
Oracle 检查连接数
Oracle 表空间
Oracle 解释执行SQL
markdown作图(适用typora)
服务器压测
业务对象层和数据层
并发限流处理
中间件
Yarn的使用
Dubbo学习笔记-RPC扩展和本地Mock
Dubbo学习笔记-泛化实现进行mock
Redis缓存穿透,缓存击穿,缓存雪崩
Galera 集群说明
Pip 镜像
pip 使用
MySQL命令行
数据库缓存双写方案
Git相关操作
Redis 操作时间复杂度一览
nacos 杂记
mybatis 散记
shardingjdbc
一次线上事故排查发现的Caffeine缓存死锁问题
设计模式
重新讲讲单例模式和几种实现
更优雅地实现策略模式
Http-headers
Prometheus 杂散笔记
JAVA 散记
CompletableFuture
Gson、FastJson、Jackson、json-lib对比总结
jackson 时间的序列化踩坑
JVM
自定义注解
mysql类型和java类型 转换一览表
枚举维护一个Map<value, Enum>的映射
Java中String +、concat、StringBuilder、StringBuffer 性能对比
TraceId 使用
MySQL 多数据源处理
Mybatis-plus 流式查询
JAVA发送win 桌面通知
idea 启动项目失败非代码问题杂记
Lambda 简述
Arthas 使用笔记
一种链式更新数据的数据模式
Skywalking 新增中间件插件
Redission 使用
数据导出为图片
IDEA 的热重启
Netty 工具类
maven 插件
本文档使用 MrDoc 发布
-
+
首页
Dubbo学习笔记-RPC扩展和本地Mock
### 1.Dubbo介绍 Dubbo,一个是一款高性能Java RPC框架.私以为有[中文官方文档](http://dubbo.apache.org/zh-cn/docs/user/preface/background.html),就不再重复介绍了 ### 2.RPC扩展-本地存根stub RPC扩展功能:提前效验参数,缓存调用结果,日志记录等等,可以使用AOP织入这些扩展功能,但Dubbo提供了更灵活简单的实现-本地存根stub。 ### 3.本地Mock-本地伪装mock RPC在服务异常时,请求返回mock的(假)数据,而不是简单的抛出异常,达到服务降级和本地mock的效果.只有在服务抛出异常时才会调用。 ### 4.调用流程 ![](/media/202106/2021-06-09_102111.png) 1. 服务消费者发起调用 2. 如果服务消费者端存在本地存根 Stub 的话,会先执行本地存根 3. 本地存根 Stub 持有远程服务的 Proxy 对象,Stub 在执行的时候,会先执行自己的逻辑 (before),然后通过 Proxy 发起远程调用,最后在返回过程之前也会执行自己的逻辑 (after-returning) 4. 如果远程服务的 Proxy 对象在执行过程中抛出了 exception,会执行服务消费端的本地伪装 Mock 的逻辑 (after-throwing),返回容错数据,从而达到服务降级的目的 ### 5.本地存根实例 定义一个demo接口 ``` public interface DemoService { String sayHello(String name); } ``` 根据约定大于配置原则,实现一个demo的stub实例 ``` // 类名约定为 继承接口+Stub public class DemoServiceStub implements DemoService { private static Logger logger = LoggerFactory.getLogger(DemoServiceStub.class); private final DemoService demoService; // 本地存根的实现需要提供一个拷贝构造方法,方便框架将远程调用的 Proxy 对象注入进来 public DemoServiceStub(DemoService demoService) { this.demoService = demoService; } // 本地存根需要提供服务接口中所有方法的实现。在本例中,需要实现 sayHello 方法 @Override public String sayHello(String name) { // 进行预处理部分 logger.info("before 执行远程服务, 入参: " + name); try { // 执行原函数功能,重要!!! String result = demoService.sayHello(name); // 执行函数后续部分,这里也可以完成缓存的操作 logger.info("after 执行远程服务, 出参: " + result); return result; } catch (Exception e) { // 异常处理部分 logger.warn("执行失败! ", e); return null; } } } ``` 在prvider.xml中将服务暴露出去 ``` # resources\spring\mock-consumer.xml <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"> <!-- 提供方应用信息,用于计算依赖关系 --> <dubbo:application name="mock-demo-consumer"/> <dubbo:registry address="zookeeper://101.201.232.80:2181"/> <dubbo:metadata-report address="zookeeper://101.201.232.80:2181" /> <!-- 用dubbo协议在本地20880端口通讯 --> <dubbo:protocol name="dubbo" port="20880"/> <!-- 和本地bean一样实现服务 --> <bean id="demoService" class="mock.impl.DemoServiceImpl"/> <!-- 暴露接口类名遵循约定 --> <dubbo:reference id="demoService" check="false" interface="mock.api.DemoService" stub="true"/> <!-- 类名不遵循约定,则指定全类名 --> <!-- <dubbo:reference id="demoService" check="false" interface="mock.api.DemoService" stub="mock.api.DemoServiceStub"/> --> </beans> ``` ### 6.本地伪装实例 dubbo默认为1000ms会抛超时异常,我们就让线程sleep 5000ms来人为触发 改造demo实现类如下,取消try则返回 hello + name,否则触发mock,返回 mock + name ``` public class DemoServiceImpl implements DemoService { @Override public String sayHello(String name) { try { // 默认为1s无响应则抛超时异常,此处睡眠5s,使其抛出异常 Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } return "hello " + name; } } ``` 根据约定大于配置原则,实现一个demo的mock实例 ``` // 类名:demo接口+Mock public class DemoServiceMock implements DemoService { // 原服务抛出异常,则执行对应函数 @Override public String sayHello(String name) { return "mock " + name; } } ``` 消费者xml需要稍微改造 ``` # resources\spring\mock-consumer.xml <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"> <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 --> <dubbo:application name="mock-demo-consumer"/> <!--使用multicast广播注册中心暴露发现服务地址 30s耗时--> <dubbo:registry timeout="30000" address="zookeeper://127.0.0.1:2181"/> <!-- 生成远程服务代理,可以和本地bean一样使用demoService 注意mock=true--> <dubbo:reference id="demoService" check="false" interface="mock.api.DemoService" mock="true"/> </beans> ``` ### 7.参考 1. [https://github.com/apache/dubbo-samples/tree/master/java/dubbo-samples-stub](https://github.com/apache/dubbo-samples/tree/master/java/dubbo-samples-stub) 2. [https://github.com/apache/dubbo-samples/tree/master/java/dubbo-samples-mock](https://github.com/apache/dubbo-samples/tree/master/java/dubbo-samples-mock) 3. [http://dubbo.apache.org/zh-cn/blog/dubbo-stub-mock.html](http://dubbo.apache.org/zh-cn/blog/dubbo-stub-mock.html)
寒烟濡雨
2022年3月9日 09:54
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
关于 MrDoc
觅思文档MrDoc
是
州的先生
开发并开源的在线文档系统,其适合作为个人和小型团队的云笔记、文档和知识库管理工具。
如果觅思文档给你或你的团队带来了帮助,欢迎对作者进行一些打赏捐助,这将有力支持作者持续投入精力更新和维护觅思文档,感谢你的捐助!
>>>捐助鸣谢列表
微信
支付宝
QQ
PayPal
Markdown文件
分享
链接
类型
密码
更新密码