dubbo之mock模拟

1:写在前面

考虑这样的场景,当服务提供者还没有开发完毕或者是因为某些原因无法启动时,会导致服务消费者方的停滞,此时为了能够正常的开发测试,可以使用mock功能,在服务消费者端提供一个服务接口的mock实现类,来模拟调用服务提供者正常获取结果,不同于stub 既支持在服务提供者端配置,也支持在服务消费者端配置,mock是假定服务提供者不可用的情况下产生的一种模拟机制,因此只能在服务消费者端配置使用。

2:实例

以下操作均在服务消费者端进行,因为我们假定的是没有可用的服务提供者端的情况。

2.1:定义服务接口

public interface MyMockService {
    String mockSayHi(String word);
}

2.2:xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://code.alibabatech.com/schema/dubbo
       http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!--当前项目在整个分布式架构里面的唯一名称,计算依赖关系的标签-->
    <dubbo:application name="dongshidaddy-consumer" owner="dongshidaddy"/>
    <!--点对点的方式-->
    <dubbo:registry address="zookeeper://192.168.10.119:2181" />
    <dubbo:reference id="myMockServiceInConsumerSide"
                     check="false"
                     interface="dongshi.daddy.service.MyMockService"/>

    <!--<bean class="dongshi.daddy.service.MyMockServiceMock"/>-->
</beans>

2.3:main

public class ConsumerWithMockMain {
    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("consumer-with-mock.xml");
        context.start();
        MyMockService myMockService = (MyMockService) context.getBean("myMockServiceInConsumerSide");
        System.out.println(myMockService.mockSayHi("hello"));
    }
}

执行:

在这里插入图片描述

可以看到说找不到可用的服务提供者,这是正常的,因为我们根本就没有注册,我们继续向下看。

2.4:使用mock

在xml配置中增加mock=true,如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://code.alibabatech.com/schema/dubbo
       http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!--当前项目在整个分布式架构里面的唯一名称,计算依赖关系的标签-->
    <dubbo:application name="dongshidaddy-consumer" owner="dongshidaddy"/>
    <!--点对点的方式-->
    <dubbo:registry address="zookeeper://192.168.10.119:2181" />
    <dubbo:reference id="myMockServiceInConsumerSide"
                     check="false"
                     mock="true"
                     interface="dongshi.daddy.service.MyMockService"/>

    <!--<bean class="dongshi.daddy.service.MyMockServiceMock"/>-->
</beans>

注意这里在dubbo:reference中设置check=“false”,因为不设置的话会检测服务提供者端是否可用,因为不可用,会直接异常,到不了mock那一步。

再次执行main:

在这里插入图片描述

此时报找不到XxxxMock类的错误,因为打开mock后会默认以接口名+Mock拼接的方式来查找mock的实现类,因此只需要提供mock实现类就可以了,继续向下看。

2.5:mock实现

public class MyMockServiceMock implements MyMockService {
    @Override
    public String mockSayHi(String word) {
        return "mock impl in consumer side: " + word;
    }
}

再次执行:

在这里插入图片描述

可以看到,先报错说找不到对应的service,然后执行了mock逻辑。

3:写在后面

参考文章列表:

dubbo的Mock功能与源码实现

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值