基于ngx_lua的Mock Server

项目地址

https://github.com/tim-chow/ngx-lua-mock-server


基本思路

  • 客户端将Mock Server设置成正向代理(所谓的“正向代理”就是通常所说的“代理”)
  • Mock Server对发送给它的请求进行拦截,如果在数据源(目前只支持Redis,可以很方便地扩展,进而支持其他数据源)中存在该请求对应的Mock data,则返回Mock data,否则将该请求反向代理到“真正的”服务器上

Redis数据源的数据结构

Mock data在Redis数据库中的组织方式是一个hash table。其中hash表名是host接上request_uri(request_uri包含path和query_string),key是请求方法,value则是要返回给客户端的“假数据”。下面是一个例子:
1111


关于如何设置正向代理

  • Windows上很多设置代理的软件,各种浏览器比如Chrome也有很多插件支持设置代理,不再赘述
  • Linux上设置代理很简单,只需要简单的给命令设置一个http_proxy环境变量即可,比如:
http_proxy="http://timd.cn:8080" curl http://www.sina.cn/  

或者

export http_proxy="http://timd.cn:8080"  
curl http://www.sina.cn/  

测试ngx-lua-mock-server

  • 安装Openresty,假定Openresty已经被安装到了/usr/local/openresty
  • git clone https://github.com/tim-chow/ngx-lua-mock-server
  • cd ngx-lua-mock-server/
  • mkdir logs/
  • 项目的配置文件是plugins/MyConfig.lua,Nginx的配置文件是nginx.conf。需要通过nginx.conf的resolver指令配置dns服务器,通过plugins/MyConfig.lua设置Redis的相关配置
  • 启动Openresty:/usr/local/openresty/nginx/sbin/nginx -c nginx.conf -p .。需要正确的设置-p,否则无法找到Lua脚本
  • 在Redis中添加Mock data:
    2222
  • 使用http客户端进行测试:
[root@iZ23dastruaZ ~]# http_proxy="http://127.0.0.1:8080" curl -i http://www.sina.com/a?p=q
HTTP/1.1 200 OK  
Server: openresty/1.11.2.1  
Date: Sun, 16 Oct 2016 15:52:15 GMT  
Content-Type: text/plain  
Transfer-Encoding: chunked  
Connection: close  
Is-Mocked: 1

zhalang  
[root@iZ23dastruaZ ~]# http_proxy="http://127.0.0.1:8080" curl -i http://www.sina.com/
HTTP/1.1 200 OK  
Server: openresty/1.11.2.1  
Content-Type: text/html  
Transfer-Encoding: chunked  
Connection: close  
Date: Sun, 16 Oct 2016 15:52:28 GMT  
Cache-Control: max-age=300  
ETag: "57969250-4fae"  
Last-Modified: Mon, 25 Jul 2016 22:27:28 GMT  
Set-Cookie: TS016d18b4=01d72e94acacea7b9558885e8a32312d6c04bac486aa03b9378a6ff774e0438c6470976034; Path=/  
Expires: Sun, 16 Oct 2016 15:57:28 GMT  
Accept-Ranges: bytes

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

第一个请求返回的是Mock data,当返回Mock data时,会增加一个Is-Mocked响应头;第二个请求因为在Redis中没有Mock data,所以被代理到了真正的服务上了。


优势:

  • 客户端和服务端的正式代码和测试代码没有任何区别。当客户端想要访问Mock服务,只需要 在外部通过软件或环境变量 设置一个代理,并且将Mock data添加到数据源即可
  • 可以Mock任何服务的任何接口

感谢浏览tim chow的作品!

如果您喜欢,可以分享到: 更多

如果您有任何疑问或想要与tim chow进行交流

可点此给tim chow发信

如有问题,也可在下面留言: