一个服务具备好的鲁棒性,肯定要兼容下游各种各样的非预期返回,防止下游API改动影响服务稳定性。
如何验证呢?肯定不能手动改下游代码实现指定的错误返回,操作成本太大了。去开发或基于开源二次开发一个代理服务成本有比较高。iptables
则是一个不错的选择。大概的实现方式可见下图:
iptables用途及用到的命令
iptables可以实现路由转发,且由于是linux网络层,性能极佳,一台Linux服务可以满足N多对被测服务和下游服务的故障验证。
在测试时,可以通过手工、脚本、或封装一个执行命令服务,来对网络进行操作,实现向下游请求的干扰(请求丢弃、请求拒绝)、随机/指定错误(NAT到对应的插件服务)。
NAT
# 查询 iptables -t nat -L # 配置端口转发,将本机的端口转发到其他机器上 # 例:通过 192.168.1.10 的 9996 端口转发到 192.168.1.10 的 9650 端口 # 先设置允许ip_forward sysctl -w net.ipv4.ip_forward=1 # 配置DNAT iptables -t nat -A PREROUTING -p tcp -m tcp --dport 9996 -j DNAT --to-destination 192.168.1.10:9650 # 配置SNAT iptables -t nat -A POSTROUTING -p tcp -m tcp -d 192.168.1.10/32 --dport 9650 -j SNAT --to-source 192.168.1.10 # 删除则是将 -A 修改为 -D 即可,或获取到对应的规则num,使用 iptables -t nat -D <num>
DROP / REJECT
# 查询 iptables -L # 请求丢弃 iptables -A OUTPUT -p tcp -d 192.168.1.10 --dport 9650 -j DROP # 请求拒绝 iptables -A OUTPUT -p tcp -d 192.168.1.10 --dport 9650 -j REJECT # 删除则是将 -A 修改为 -D 即可,或获取到对应的规则num,使用 iptables -D <num>
插件服务
该服务可以用flask实现一个轻量级的HTTP服务,设置好启动参数,动态启停即可。
当设置下游响应错误、指定错误返回、或随机修改真实返回内容时,启动该服务脚本,NAT到该服务上。由这个插件服务实现对应的各种各样的错误。