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:写在后面
参考文章列表: