咨询将应用A流量镜像至测试应用的其他实现方案(非Nginx镜像模块亦可)
Hey there! 我整理了几个除了Nginx镜像模块之外的流量镜像方案,覆盖不同的技术栈和架构场景,你可以按需选择:
使用专门的流量复制工具
比如goreplay或者tcpcopy这类工具,它们能直接抓取生产环境的流量包,然后重放给测试应用,完全不需要修改现有架构。以goreplay为例,只需要在靠近应用A的机器上运行简单命令:./gor --input-raw :8080 --output-http http://test-app:8080这个命令会把应用A(监听8080端口)的所有HTTP流量复制转发到测试应用。需要注意的是,要处理好流量的幂等性,避免测试应用因为重复请求出现数据异常,另外可以通过参数控制只镜像特定路径或比例的流量。
基于服务网格的流量镜像
如果你已经在用Istio、Linkerd这类服务网格,那它们自带的流量影子(mirror)功能就是绝佳选择。以Istio为例,只需要在VirtualService配置里添加mirror字段,指定测试服务的地址:apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: app-a spec: hosts: - app-a http: - route: - destination: host: app-a subset: v1 mirror: host: test-app subset: v1这种方案的优势是能精细控制镜像流量的比例(比如只镜像10%的流量),还能和服务网格的其他治理功能结合,缺点是如果之前没部署服务网格,会有一定的学习和部署成本。
应用层异步转发
如果你能修改应用A的代码,可以在请求处理逻辑里异步复制一份请求发送给测试应用。比如Python应用可以用aiohttp异步发送请求,Java应用用CompletableFuture来做异步调用。这种方式的好处是能完全自定义要镜像的请求,比如只镜像/api/payment这类核心路径的请求,或者过滤掉敏感参数。但一定要注意用异步,绝对不能同步等待测试应用的响应,否则会影响生产应用的性能。网络层端口镜像
利用交换机或路由器的端口镜像功能,把应用A所在服务器的网卡流量镜像到测试应用所在的机器,然后用工具解析并重放流量。这种方案完全不侵入应用和中间件,但需要你的网络设备支持端口镜像,而且原始流量是数据包格式,重放时需要用tcpcopy这类工具处理TCP连接的还原问题,适合对应用代码和中间件完全不想改动的场景。
备注:内容来源于stack exchange,提问作者Omera

