百度怎么注册自己的网站,简易的在线数据库网站模板,wordpress菜单侧边栏,视频网站架构目录
绪论实践 dubbo-demo-interfacedubbo-demo-xml-providerdubbo-demo-xml-consumer启动
绪论
今天主要学习并实践dubbo的本地存根stub机制。首先了解一下官网文档对本地存根的介绍#xff1a;
远程服务后#xff0c;客户端通常只剩下接口#xff0c;而实现全在服务器…目录
绪论实践 dubbo-demo-interfacedubbo-demo-xml-providerdubbo-demo-xml-consumer启动
绪论
今天主要学习并实践dubbo的本地存根stub机制。首先了解一下官网文档对本地存根的介绍
远程服务后客户端通常只剩下接口而实现全在服务器端但提供方有些时候想在客户端也执行部分逻辑。
比如做 ThreadLocal 缓存提前验证参数调用失败后伪造容错数据等等。
核心思想API 中带上 Stub客户端生成 Proxy 实例**会把 Proxy 通过构造函数传给 Stub** 然后把 Stub 暴露给用户Stub 可以决定要不要去调 Proxy。Stub会使用代理模式将原有的远程调用service进行包装让使用者可以在远程服务调用前后做一些通用处理非常适合做缓存容错或者日志处理异常包装等。故本地存根机制类似与AOP机制中的around advice环绕增强 则本地存根执行顺序 1.服务消费者发起调用 2.如果服务消费者端存在本地存根 Stub 的话会先执行本地存根 3.本地存根 Stub 持有远程服务的 Proxy 对象Stub 在执行的时候会先执行自己的逻辑(before)然后通过Proxy 发起远程调用最后在返回过程之前也会执行自己的逻辑(after-returning) 4.如果远程服务的 Proxy 对象在执行过程中抛出了 exception会执行服务消费端的本地伪装 Mock 的逻辑 (after-throwing)【后面再议】返回容错数据从而达到服务降级的目的。 如图
实践
虽然dubbo官网简单给了本地存根的示例但不是能够足以解决新手实战问题其他博客千篇一律没有几乎什么改进的地方溪源学习的时候也是在花费了两个下班的时间搞定的实践实属坎坷 写在前面
dubbo官网给出两种设置本地存根的示例
stub的属性值设置为实现类的全限定名stub的属性值则默认设置为true
溪源主要给大家说下第二种方式踩坑点 如果默认将stub属性设置为true则必须保证本地存根实现类以Stub命名结尾例如UserServiceStub. 那为什么要这么设置呢给大家贴一下源码ServiceConfig#checkAndUpdateSubConfigs()类中。 如果实现类不以Stub结束,那反射查找本地存根实现类便找不到又谈何实现本地存根的逻辑呢 踩坑点相信大家已经清楚下面开始进入实战环节。
再看下dubbo官网本地存根细品细品
dubbo-demo-interface 目录结构如下 UserService 简单定义一个方法 /** author wxdate 2020/9/6 11:39 下午测试本地存根服务接口 / public interface UserService { /* 根据用户名返回用户名字param userId 用户IDreturn 用户名 */ String getUserName(String userId); } UserServiceStub /** author wx date 2020/9/6 11:09 下午 服务消费者实现接口并实现本地存根逻辑 */ public class UserServiceStub implements UserService { private static final String USER_ID “1503891”; private final UserService userService; /** 通过构造方法将服务接口代理对象接口实现类对象传入stubparam userService */ public UserServiceStub(UserService userService) { this.userService userService; } Override public String getUserName(String userId) { System.out.println(“开始执行服务消费端本地存根逻辑”); if (StringUtils.isBlank(userId)) { return “userId is null”; } if (!USER_ID.equals(userId)) { return “user not exits”; } String userName userService.getUserName(userId); System.out.println(“结束执行服务消费端本地存根逻辑”); return userName; } }
dubbo-demo-xml-provider 目录结构 stub-provider.xml UserProviderStubServiceImpl /** author wx date 2020/9/6 11:09 下午 服务消费者实现接口并实现本地存根逻辑 */ Service public class UserProviderStubServiceImpl implements UserService { private static final String USER_ID “1503891”; Override public String getUserName(String userId) { return USER_ID.equals(userId) ? “溪源” : “”; } } ProviderApplication /** * 服务端Stub测试 * throws IOException */ private static void stubTest() throws IOException { ClassPathXmlApplicationContext context new ClassPathXmlApplicationContext(“spring/stub-provider.xml”); context.start(); System.in.read(); }
dubbo-demo-xml-consumer stub-consumer.xml 消费者端并没有新增实现类但溪源为了代码的整洁与后期维护、梳理选择了新建stub-consumer.xml配置文件和单元测试的模式实践. ConsumerApplication private static void stubTest() { ClassPathXmlApplicationContext context new ClassPathXmlApplicationContext(“spring/stub-consumer.xml”); UserService stubService context.getBean(UserService.class); String userName stubService.getUserName(“1503891”); System.out.println(userName); }启动
分别启动providerconsumer如图 测试1 将userId传为空 测试2
到此为止本地存根实践应用结束大家对源码如何实现原理可以借助此demo开始debug吧
溪源初次接触dubbo本地存根机制如文中存在错误之处希望大家及时指正
源码传送门https://github.com/stream-source/dubbo/tree/master/dubbo-demo