我有以下情况:
我的应用程序由一个单独的Web服务组成,该服务调用外部API(例如一些SaaS服务、ElasticSearch等)。为了非单元测试目的,我们想要控制外部服务,并在后续注入故障。应用程序和“模拟”的API都已经docker化,现在我想使用
由于应用程序中有几个硬编码的地址(例如外部服务的主机名),我无法更改它们并需要绕过此问题。
我的想法是利用Docker提供的某些功能,将所有外向流量重定向到外部的
我的
最后,我有了一个只执行以下操作的驱动程序:
我的应用程序由一个单独的Web服务组成,该服务调用外部API(例如一些SaaS服务、ElasticSearch等)。为了非单元测试目的,我们想要控制外部服务,并在后续注入故障。应用程序和“模拟”的API都已经docker化,现在我想使用
docker-compose
来启动所有容器。由于应用程序中有几个硬编码的地址(例如外部服务的主机名),我无法更改它们并需要绕过此问题。
service
容器向http://external-service.com/getsomestuff
发出调用。我的想法是利用Docker提供的某些功能,将所有外向流量重定向到外部的
http://external-service.com/getsomestuff
,并将其指向模拟容器,而不更改URL。我的
docker-compose.yaml
如下:version: '2'
services:
service:
build: ./service
container_name: my-service1
ports:
- "5000:5000"
command: /bin/sh -c "python3 app.py"
api:
build: ./api-mock
container_name: my-api-mock
ports:
- "5001:5000"
command: /bin/sh -c "python3 app.py"
最后,我有了一个只执行以下操作的驱动程序:
curl -XGET localhost:5000/
curl -XPUT localhost:5001/configure?delay=10
curl -XGET localhost:5000/
第二个 curl
设置模拟延迟为 10 秒。
我考虑了几种选项:
- 使用
iptables
-fu(需要修改 Dockerfile 安装它) - 使用 Docker 网络(这对我来说非常不清楚)
有没有简单的方法可以实现我想要的效果?
编辑:
为了清晰起见,以下是 service
代码的相关部分:
import requests
@app.route('/')
def do_stuff():
r = requests.get('http://external-service.com/getsomestuff')
return process_api_response(r.text())