zoukankan      html  css  js  c++  java
  • Dubbo本地伪装 Mock

    本地伪装通常用于在远程调用出错的情况下服务降级,即本地伪装用来做容错处理

    通过将服务端设置睡眠使用得客户端调用超时,抛出异常
    public String sayHello(String name) {
        // Dubbo 默认的超时时间是 1000 ms,这里通过睡眠 5000ms 来达到触发超时异常的发生
        // 由于超时的发生,这个结果并不会被返回给客户端,取而代之的是 org.apache.dubbo.remoting.TimeoutException
        try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); }
        return "Hello " + name;
    }
    在客户端提供本地伪装的实现。当远程调用发生错误的时候,返回给调用方的不是服务端的 "hello name",取而代之的是 "mock name"。
    public class DemoServiceMock implements DemoService {
        
        public String sayHello(String name) {
            System.out.println("about to execute mock: " + DemoServiceMock.class.getSimpleName());
            return "mock " + name;
        }
    }
    要使用本地伪装的话,还需要在 mock-consumer.xml 中配置属性 mock。可以简单的通过指定 mock="true" 来告诉 Dubbo 框架使用本地伪装,这个时候,本地伪装的包名需要和服务接口的包名一致,类名必须在服务接口的类名后加上 Mock 的后缀。例如,当服务接口名是 com.alibaba.dubbo.demo.DemoService 时,本地存根的全类名应该是 com.alibaba.dubbo.demo.DemoServiceMock。
    <dubbo:reference id="demoService" check="false" interface="com.alibaba.dubbo.demo.DemoService" mock="true">
        <dubbo:method name="sayHello" retries="0"></dubbo:method>
    </dubbo:reference>
    如果不希望使用默认的命名规则,也可以直接通过 mock 属性来指定本地伪装的全类名
    <dubbo:reference id="demoService" check="false" interface="com.alibaba.dubbo.demo.DemoService" 
                     mock="com.alibaba.dubbo.demo.consumer.DemoServiceMock">
        <dubbo:method name="sayHello" retries="0"></dubbo:method>
    </dubbo:reference>
    通过提供一个本地伪装的类,可以最大限度的控制出错之后的容错逻辑。有的时候,业务上并不需要这样灵活的机制,只有返回一个默认值的诉求,这个时候提供一个完整的本地伪装的实现就显得有点重了。或者线上出错的时候,应用并没有打包本地伪装,需要通过推送规则的方式临时对服务降级。Dubbo 框架为上面的这两种诉求都提供了快捷方式,帮助用户快速配置服务降级。
     
    总结
    本文介绍了 Dubbo 中本地存根和本地伪装的概念和用法。从本质来讲,本地存根和本地伪装等同于面向切面编程中的概念,通过诸如 Spring 框架提供的 AOP 编程可以达到同样的目的。通过本文如何开发一个本地存根和本地伪装的示例,读者可以直观的感受到通过框架提供的机制更加方便快捷。同时,对于很多简单的场景和动态配置推送的场景,框架提供了仅通过配置而无需编码的方式来满足,进一步提升了框架使用者的效率。
     
     
  • 相关阅读:
    微信证书 javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
    【转】ubunt 安装 yum出现 ubuntu 解决“无法获得锁 /var/lib/dpkg/lock -open (11:资源暂时不可用)”的方法
    HTTP Status 500
    idea导入项目报错:文档中根元素前面的标记必须格式正确
    redis 存取问题
    maven项目怎么引入另一个maven项目
    如何解决failed to push some refs to git
    idea配置maven后提示 commond not found
    JMS规范简介
    java消息中间件的使用与简介
  • 原文地址:https://www.cnblogs.com/caoxb/p/13140395.html
Copyright © 2011-2022 走看看