zoukankan      html  css  js  c++  java
  • Dubbo本地存根 Stub

    本地存根的工作方式与 AOP 的 around advice 类似,而本地伪装的工作方式等同于 AOP 中的 after-throwing advice,也就是说,只有当远程调用发生 exception 的时候才会执行本地伪装。本地存根和本地伪装的工作流程如下图所示:
    1. 服务消费者发起调用
    2. 如果服务消费者端存在本地存根 Stub 的话,会先执行本地存根
    3. 本地存根 Stub 持有远程服务的 Proxy 对象,Stub 在执行的时候,会先执行自己的逻辑 (before),然后通过 Proxy 发起远程调用,最后在返回过程之前也会执行自己的逻辑 (after-returning)
    4. 如果远程服务的 Proxy 对象在执行过程中抛出了 exception,会执行服务消费端的本地伪装 Mock 的逻辑 (after-throwing),返回容错数据,从而达到服务降级的目的
     
    一、本地存根 Stub
    public class DemoServiceStub implements DemoService { // #1
      
        private final DemoService demoService;
       
        public DemoServiceStub(DemoService demoService) { // #2
            this.demoService = demoService;
        }
    
        @Override
        public String sayHello(String name) { // #3
            System.out.println("before execute remote service, parameter: " + name); // #4
            try {
                String result = demoService.sayHello(name); // #5
                System.out.println("after execute remote service, result: " + result); // #6
                return result;
            } catch (Exception e) {
                System.out.println("fail to execute service"); // #7
                return null;
            }
        }
    
    }
     DemoServiceStub 运行在客户端,要使用本地存根的话,还需要在 .xml 中配置属性 stub。可以简单的通过指定 stub="true" 来告诉 Dubbo 框架使用本地存根,这个时候,本地存根的包名需要和服务接口的包名一致,类名必须在服务接口的类名后加上 Stub 的后缀。例如,当服务接口名是 com.alibaba.dubbo.demo.DemoService 时,本地存根的全类名应该是com.alibaba.dubbo.demo.DemoServiceStub。
    <dubbo:reference id="demoService" check="false" interface="com.alibaba.dubbo.demo.DemoService" stub="true">
        <dubbo:method name="sayHello" retries="0"></dubbo:method>
    </dubbo:reference>

    如果不希望使用默认的命名规则,也可以直接通过 mock 属性来指定本地伪装的全类名

    <dubbo:reference id="demoService" check="false" interface="com.alibaba.dubbo.demo.DemoService" 
                     stub="com.alibaba.dubbo.demo.consumer.DemoServiceStub">
        <dubbo:method name="sayHello" retries="0"></dubbo:method>
    </dubbo:reference>
    通过提供一个本地伪装的类,可以最大限度的控制出错之后的容错逻辑。有的时候,业务上并不需要这样灵活的机制,只有返回一个默认值的诉求,这个时候提供一个完整的本地伪装的实现就显得有点重了。或者线上出错的时候,应用并没有打包本地伪装,需要通过推送规则的方式临时对服务降级。Dubbo 框架为上面的这两种诉求都提供了快捷方式,帮助用户快速配置服务降级。
     
     
  • 相关阅读:
    在数据库中 存储图片 以及 在界面中显示图片(存储图片路径)- 这种方法相对与存储二进制文件好
    # 会员注册与登录模块
    文本文件从磁盘读取、写入
    简单的web三层架构系统【第五版】
    Nginx负载均衡中后端节点服务器健康检查的一种简单方式
    编译安装php-7.1.17及部分扩展
    wkhtmltopdf 安装过程不包含php扩展部分
    Centos6下安装中文字体
    xen 配置vm 跟随xen server一起启动
    CENTOS 升级Nodejs 到最新版本
  • 原文地址:https://www.cnblogs.com/caoxb/p/13140390.html
Copyright © 2011-2022 走看看