code.rar
一、挡板
在一些跨系统的性能测试项目中,往往由于客观因素的限制(测试硬件资源有限、多系统之间的协调等),我们无法搭建一个完整的测试环境来完成测试工作。此时,我们一般会搭建出被测系统,然后采用软件程序来模拟其他相关系统的功能。该软件程序一般被称为挡板。
比如第三方接口调用,第三方接口的调用需要付费,比如说,短信,这时候我们就可以通过挡板的方式来实现模拟发送短信的业务。
二、Feign 实现简单的挡板
案例:模拟挡板模拟远程 API 调用
2.1、原理
未提供挡板类时 RemoteServerClient
在 Spring Cloud 内部会生成一个由 ReflectiveFeign.FeignInvocationHandler
代理的 HardCodedTarget
对象
而挡板的作用就是,通过配置开关的方式,当我们打挡板时,用我们新写的类 RemoteServerClientStub
对应的实例 替换原有的 HardCodedTarget
实例对象。
换句话说,就是根据开关控制发起调用的实现类是哪一个
2.2、相关代码
代码结构
- client 模拟 Feign 调用,并实现挡板
- server 模拟 API 提供
调用链
重点关注 RemoteServerClient
的挡板实现,因为默认的 HardCodedTarget
spring Cloud 已经帮我们实现了,
先来看下 RemoteServerClient
Feign Client 代码
/**
* 重点: primary 设置为 false
*/
@FeignClient(name = "feign-db-server",primary = false)
public interface RemoteServerClient {
/** Ribbon server API **/
@RequestMapping("/server/api")
String hello();
}
来看下挡板实现 RemoteServerClientStub
/**
* 重点:
* 1、@Primary 注解
* 2、@conditionOnProperty(name="xxx",havingValue=xxx) 开启该配置的开关,配置在配置文件中
*/
@Primary
@Component
@ConditionalOnProperty(name = "feign-stub.remote-api.mode", havingValue = "stub")
public class RemoteServerClientStub implements RemoteServerClient{
@Override
public String hello() {
// 这里也可以返回 mock 的api 调用数据
return "这是一个挡板数据";
}
}
再来看下配置文件中的开关
# feign 挡板配置
feign-stub.remote-api.mode = normal