Dubbo学习笔记-RPC扩展和本地Mock

1.Dubbo介绍

Dubbo,一个是一款高性能Java RPC框架.私以为有中文官方文档,就不再重复介绍了

2.RPC扩展-本地存根stub

RPC扩展功能:提前效验参数,缓存调用结果,日志记录等等,可以使用AOP织入这些扩展功能,但Dubbo提供了更灵活简单的实现-本地存根stub。

3.本地Mock-本地伪装mock

RPC在服务异常时,请求返回mock的(假)数据,而不是简单的抛出异常,达到服务降级和本地mock的效果.只有在服务抛出异常时才会调用。

4.调用流程

Dubbo学习笔记-RPC扩展和本地Mock_第1张图片

  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


    
    
    
    

    
    

    
    

    
    
    
    

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


    
    

    
    

    
    

7.参考

  1. 本地存根Stub:https://github.com/apache/dubbo-samples/tree/master/java/dubbo-samples-stub
  2. 本地伪装Mock:https://github.com/apache/dubbo-samples/tree/master/java/dubbo-samples-mock
  3. beiwei30:http://dubbo.apache.org/zh-cn/blog/dubbo-stub-mock.html

你可能感兴趣的:(Dubbo学习笔记-RPC扩展和本地Mock)