# copyrequest **Repository Path**: alohasir/copyrequest ## Basic Information - **Project Name**: copyrequest - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-01-28 - **Last Updated**: 2021-04-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 生产流量复制转移 ### 方案【1】 Nginx+lua (openresty) ``` 参考 https://juejin.cn/post/6844903650490318862 我们经常使用的 Nginx, 它其实也是一个很棒的流量复制工具,那就是模块 ngx_http_mirror_module,是在 _Nginx 1.13.4_ 中引入 配置文件如下: log_format日志显示格式化 (以下配置采用最精简模式,如需其他自行配置) worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; upstream backend { server 127.0.0.1:8080; } upstream testbackend { server 127.0.0.1:8081; } log_format main escape=json '[REMOTE_ADDR]:$remote_addr--[REMOTE_USER]:$remote_user--[TIME_LOCAL]:$time_local--[REQUEST]:$request--[HTTP_HOST]: $http_host' '--[STATUS]:$status--[BODY_TYPES_SENT]:$body_bytes_sent--[HTTP_REFERER]:$http_referer' '--[HTTP_USER_AGENT]:$http_user_agent--[BODY_BYTES_SENT]:$body_bytes_sent--[HTTP_X_FORWARDED_FOR]:$http_x_forwarded_for' '--[UPSTREAM_ADDR]:$upstream_addr--[REQUEST_TIME]:$request_time--[UPSTREAM_STATUS]:$upstream_status--[REQUEST_BODY]:$request_body' '--[RESP_BODY]:$resp_body--[RESP_HEADER]:$resp_header' '--[UPSTREAM_CACHE_STATUS]:$upstream_cache_status--[UPSTREAM_RESPONSE_TIME]:$upstream_response_time'; server { listen 80; server_name localhost; access_log logs/access.log main; set $resp_header ""; header_filter_by_lua ' local h = ngx.resp.get_headers() for k, v in pairs(h) do ngx.var.resp_header=ngx.var.resp_header..k..": "..v end '; lua_need_request_body on; set $resp_body ""; body_filter_by_lua ' local resp_body = string.sub(ngx.arg[1], 1, 1000) ngx.ctx.buffered = (ngx.ctx.buffered or "") .. resp_body if ngx.arg[2] then ngx.var.resp_body = ngx.ctx.buffered end '; location / { mirror /mirror; mirror /mirror; mirror /mirror; proxy_pass http://backend; } location /mirror { # 声明仅限内部调用 internal; proxy_pass http://testbackend$request_uri; } } } 以上可以整合logstash进行数据清洗json再进行做持久化操作 写入到ES或则mysql二次分析使用 参考地址https://blog.csdn.net/ywmack/article/details/83819058 还可以使用nginx做AB测试/协程等 参考地址https://blog.csdn.net/jinnianshilongnian/article/details/84705004 ``` 测试效果: ![img.png](img.png) ![img_1.png](img_1.png) --- ### 方案【2】 http流量请求复制 Gor --> Goreplay 参考地址 https://studygolang.com/articles/10205 Gor 是 Web 应用压力测试的完美方案 我一直在找一个简单又方便的解决方案,直到找到了 Gor 。 Gor 是用 Golang 写的一个 HTTP 实时流量复制工具。只需要在 LB 或者 Varnish 入口服务器上执行一个进程,就可以把生产环境的流量复制到任何地方,比如 Staging 环境、Dev 环境。完美解决了 HTTP 层实时流量复制和压力测试的问题。 Gor 的功能 Gor 支持流量的放大和缩小、频率限制,这样不需要搭建和生产环境一致的服务器集群也可以正确测试。Gor 还支持根据正则表达式过滤流量,这意味着可以单独测试某个 API 服务。还可以修改 HTTP 请求头,比如替换 User-Agent, 或者增加某些 HTTP Header 。 Gor 还可以把请求记录到文件,以备回放和分析。Gor 支持和 ElasticSearch 集成,将流量存入 ES 进行实时分析。 下载地址 https://github.com/buger/goreplay/releases?after=v0.15.1 windows上的安装gor与linux下的不一样,由于我所在的单位使用的是windows server 2008 r2,所以特别说明一下,方便大家以后使用: 1. 在windows下首先要安装 WinPcap 下载地址为:https://www.winpcap.org/install/default.htm 2 . 然后在gor官网下载gor的二进制文件,复制到windwos上(比如:c:/windows下) 3. 运行 gor --input-raw :80 --output-http http://192.168.1.109 命令即可。 Gor 的命令用例 默认情况下, GoReplay 不会跟踪响应, 你可以这样子开启这个功能: --output-http-track-response 监听某个端口输出到控制台 gor --input-raw :80 --output-stdout --output-http-track-response ![img_3.png](img_3.png) 监听某个端口将流量镜像到 gor --input-raw :80 --output-http "http://localhost" --output-http-track-response ![img_2.png](img_2.png) 监听某个端口输出到文件 gor --input-raw :80 --output-file request.log --output-http-track-response 回放 gor --input-file requests.gor --output-http= "http://localhost:8001" 线上流量过大需要限制流量 1.策略是随机丢弃一些请求 2.根据header或则url一些参数丢弃一部分请求 --- ### 方案【3】 tcp请求流量复制 tcpcopy --- ### 方案【4】 OTDD 参考地址 https://otdd.io/getstarted/