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{@Overridepublic String hello() {// 这里也可以返回 mock 的api 调用数据return "这是一个挡板数据";}}
再来看下配置文件中的开关
# feign 挡板配置feign-stub.remote-api.mode = normal
