code.rar

一、挡板

在一些跨系统的性能测试项目中,往往由于客观因素的限制(测试硬件资源有限、多系统之间的协调等),我们无法搭建一个完整的测试环境来完成测试工作。此时,我们一般会搭建出被测系统,然后采用软件程序来模拟其他相关系统的功能。该软件程序一般被称为挡板。

比如第三方接口调用,第三方接口的调用需要付费,比如说,短信,这时候我们就可以通过挡板的方式来实现模拟发送短信的业务。

二、Feign 实现简单的挡板

案例:模拟挡板模拟远程 API 调用

2.1、原理

01.png
未提供挡板类时 RemoteServerClient 在 Spring Cloud 内部会生成一个由 ReflectiveFeign.FeignInvocationHandler 代理的 HardCodedTarget 对象

而挡板的作用就是,通过配置开关的方式,当我们打挡板时,用我们新写的类 RemoteServerClientStub 对应的实例 替换原有的 HardCodedTarget 实例对象。

换句话说,就是根据开关控制发起调用的实现类是哪一个

2.2、相关代码

代码结构

02.png

  • client 模拟 Feign 调用,并实现挡板
  • server 模拟 API 提供

调用链

03.png
重点关注 RemoteServerClient 的挡板实现,因为默认的 HardCodedTarget spring Cloud 已经帮我们实现了,

先来看下 RemoteServerClient Feign Client 代码

  1. /**
  2. * 重点: primary 设置为 false
  3. */
  4. @FeignClient(name = "feign-db-server",primary = false)
  5. public interface RemoteServerClient {
  6. /** Ribbon server API **/
  7. @RequestMapping("/server/api")
  8. String hello();
  9. }

来看下挡板实现 RemoteServerClientStub

  1. /**
  2. * 重点:
  3. * 1、@Primary 注解
  4. * 2、@conditionOnProperty(name="xxx",havingValue=xxx) 开启该配置的开关,配置在配置文件中
  5. */
  6. @Primary
  7. @Component
  8. @ConditionalOnProperty(name = "feign-stub.remote-api.mode", havingValue = "stub")
  9. public class RemoteServerClientStub implements RemoteServerClient{
  10. @Override
  11. public String hello() {
  12. // 这里也可以返回 mock 的api 调用数据
  13. return "这是一个挡板数据";
  14. }
  15. }

再来看下配置文件中的开关

  1. # feign 挡板配置
  2. feign-stub.remote-api.mode = normal