概念

案例来自于图灵学院,我上完课,做完作业,给老师的代码和课件改造了一下,加了一些注释,然后发了个博客

官网地址介绍:http://dubbo.apache.org/zh/docs/v2.7/user/examples/local-stub/
我觉得挺抽象的

本地存根,名字很抽象,但实际上不难理解,本地存根就是一段逻辑,这段逻辑是在Comsumer执行的,这段逻辑一般都是由provider提供的,provider可以利用这种机制在服务消费者远程调用服务提供者之前或之后再做一些其他事情,比如结果缓存,请求参数验证等等。

注意,本地存根的方法执行dubbo调用的时候如果调用失败了也会触发重试机制,最多重试2次.

使用

代码地址

自己自行下载,找到dubbo-stub项目,打开运行,自己准备个zookeeper,然后改个配置文件.就能运行了.

https://gitee.com/zjj19941/ZJJ_Dubbo.git 地址的dubbo-stub 项目 ,先启动provider,再启动consumer项目,观察控制台输出,就能看到本地存根的想过了

存根方法

  1. package com.tuling;
  2. //这个类也不需要你去注入,dubbo已经帮你注入了.
  3. public class DemoServiceStub implements DemoService {
  4. // 这里你不需要用@Reference注解去注入,dubbo已经帮你做了.
  5. private final DemoService demoService;
  6. // 构造函数传入真正的远程代理对象
  7. public DemoServiceStub(DemoService demoService) {
  8. this.demoService = demoService;
  9. }
  10. @Override
  11. public String sayHello(String name) {
  12. // 此代码在客户端执行, 你可以在客户端做ThreadLocal本地缓存,或预先验证参数是否合法,等等
  13. System.out.println("2.我触发了本地存根方法开始....");
  14. //注意,本地存根的方法执行dubbo调用的时候如果调用失败了也会触发重试机制,最多重试2次,如果重试失败了之后就会抛出异常出来,你可以在这里try catch 捕获.
  15. String s = demoService.sayHello(name);
  16. System.out.println("3.sayHello的结果是 = " + s);
  17. System.out.println("4.我触发了本地存根方法结束....");
  18. // 你可以容错,可以做任何AOP拦截事项
  19. return "5.我是本地方法存根的返回值";
  20. }
  21. }

consumer逻辑

  1. package com.tuling;
  2. import org.apache.dubbo.config.annotation.Reference;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.context.ConfigurableApplicationContext;
  6. @SpringBootApplication
  7. public class DubboConsumerDemo {
  8. //stub指定本地存根方法
  9. @Reference(version = "default", stub = "com.tuling.DemoServiceStub")
  10. private DemoService demoService;
  11. public static void main(String[] args) {
  12. ConfigurableApplicationContext context = SpringApplication.run(DubboConsumerDemo.class);
  13. DemoService demoService = context.getBean(DemoService.class);
  14. System.out.println("1.开始执行sayHello");
  15. System.out.println((demoService.sayHello("你好")));
  16. System.out.println("6.执行sayHello结束");
  17. }
  18. }

执行结果

根据下面的 consumer控制台结果的序号,你可以去代码里面找对应的序号,来知道存根的执行顺序.
我感觉本地存根类似于AOP切面..

  1. 1.开始执行sayHello
  2. 2.我触发了本地存根方法开始....
  3. 3.sayHello的结果是 = dubbo20880, Hello, 你好
  4. 4.我触发了本地存根方法结束....
  5. 5.我是本地方法存根的返回值
  6. 6.执行sayHello结束