<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>xiaocui (Evan)</title>
    <link>https://ruby-china.org/xiaocui</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>Goreplay - 使用真实流量测试你的应用</title>
      <description>&lt;p&gt;场景描述：&lt;/p&gt;

&lt;p&gt;最近项目准备升级，其中一个步骤就是需要删除一些不再维护的 gem，这样就会涉及大量代码的修改，除了增加测试覆盖率以外，最好能使用线上真实的流量来访问测试环境，然后通过 newrelic 更加详尽的捕捉潜在的错误。&lt;/p&gt;

&lt;p&gt;那这里就涉及到流量分流或者流量复制的问题，而 goreplay 便是解决该问题的一个优秀的工具。
顾名思义，goreplay 是基于 go 语言实现的，要在生产服务器上安装 go 环境。&lt;/p&gt;

&lt;p&gt;安装参考：&lt;a href="https://golang.org/doc/install" rel="nofollow" target="_blank"&gt;https://golang.org/doc/install&lt;/a&gt;，&lt;/p&gt;

&lt;p&gt;准备好 go 语言环境后，goreplay 直接提供了编译好的版本，十分方便，直接解压即可，可参考以下步骤：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 请自行安装最新版本&lt;/span&gt;
wget https://github.com/buger/goreplay/releases/download/v0.16.1/gor_0.16.1_x64.tar.gz
&lt;span class="nb"&gt;tar &lt;/span&gt;xvf gor_0.16.1_x64.tar.gz
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下面是 goreplay 官方的图例，简单来讲就是 goreplay 捕捉线上流量，并将捕捉到的流量释放到测试服务器上。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/ed1766d0-4311-490f-b2c9-2909bbb12fbe.png!large" title="" alt="image"&gt;&lt;/p&gt;

&lt;h5&gt;Goreplay 基本用法&lt;/h5&gt;

&lt;p&gt;注：本文中使用 sudo 权限执行，如需要权限配置，参考:
&lt;a href="https://github.com/buger/goreplay/wiki/Running-as-non-root-user" rel="nofollow" target="_blank"&gt;https://github.com/buger/goreplay/wiki/Running-as-non-root-user&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;捕捉流量并通过终端输出 (调试)&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; ./goreplay &lt;span class="nt"&gt;--input-raw&lt;/span&gt; :8000 &lt;span class="nt"&gt;--output-stdout&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上述命令将监控 8000 端口上所有的流量，并通过终端 stdout 输出。你可以通过浏览器或者 curl 访问 8000 端口，然后在终端查看 gor 输出所有的 http 请求。&lt;/p&gt;

&lt;p&gt;2.捕捉流量并实时同步到另一台机器&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; ./goreplay &lt;span class="nt"&gt;--input-raw&lt;/span&gt; :8000 &lt;span class="nt"&gt;--output-http&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"http://example:8001"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上述命令将 8000 端口的流量实时同步访问&lt;a href="http://example:8001" rel="nofollow" target="_blank"&gt;http://example:8001&lt;/a&gt;服务器，你在访问第一台服务器时，将看到流量以相同的顺序请求到第二台。&lt;/p&gt;

&lt;p&gt;3.将捕捉流量保存到文件中，然后释放到其它机器
有时候实时同步流量是很难做到的，所以 Goreplay 提供了这种先保存后释放的模式：
第一步，通过--output-file 保存流量：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; ./goreplay &lt;span class="nt"&gt;--input-raw&lt;/span&gt; :8000 &lt;span class="nt"&gt;--output-file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;requests.gor
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上述命令将 8000 端口的流量，保存到 requests.gor 文件中 (必须是.gor 后缀，其它后缀经测释放时有问题)。&lt;/p&gt;

&lt;p&gt;第二步，释放保存的流量：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; ./goreplay &lt;span class="nt"&gt;--input-file&lt;/span&gt; requests.gor &lt;span class="nt"&gt;--output-http&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:8001"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上述命令将释放所有保存在 requests.gor 中的请求通过相同的时间顺序释放到服务器&lt;a href="http://localhost:8001" rel="nofollow" target="_blank"&gt;http://localhost:8001&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;参数解释：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;--input-raw&lt;/span&gt;   &lt;span class="c"&gt;#用来捕捉http流量，需要指定ip地址和端口&lt;/span&gt;
&lt;span class="nt"&gt;--input-file&lt;/span&gt;   &lt;span class="c"&gt;#接收通过--output-file保存流量的文件&lt;/span&gt;
&lt;span class="nt"&gt;--input-tcp&lt;/span&gt; &lt;span class="c"&gt;#将多个 Goreplay 实例获取的流量聚集到一个 Goreplay 实例&lt;/span&gt;
&lt;span class="nt"&gt;--output-stdout&lt;/span&gt;  &lt;span class="c"&gt;#终端输出&lt;/span&gt;
&lt;span class="nt"&gt;--output-tcp&lt;/span&gt; &lt;span class="c"&gt;#将获取的流量转移至另外的 Goreplay 实例&lt;/span&gt;
&lt;span class="nt"&gt;--output-http&lt;/span&gt;  &lt;span class="c"&gt;#流量释放的对象server，需要指定ip地址和端口&lt;/span&gt;
&lt;span class="nt"&gt;--output-file&lt;/span&gt;   &lt;span class="c"&gt;#录制流量时指定的存储文件&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;Goreplay 的限速机制和请求过滤&lt;/h5&gt;

&lt;ol&gt;
&lt;li&gt;限速机制:
由于生产服务器配置一般远高于测试服务器配置，所以直接将生产服务器全部流量同步到测试服务器是不可行的，goreplay 提供了两种策略：&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;a. 限制每秒的请求数&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; ./goreplay  &lt;span class="nt"&gt;--input-tcp&lt;/span&gt; :28020 &lt;span class="nt"&gt;--output-http&lt;/span&gt; &lt;span class="s2"&gt;"http://staging.com|10"&lt;/span&gt;&lt;span class="c"&gt;# (每秒请求数限制10个以内)&lt;/span&gt;
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./goreplay  &lt;span class="nt"&gt;--input-raw&lt;/span&gt; :80 &lt;span class="nt"&gt;--output-tcp&lt;/span&gt; &lt;span class="s2"&gt;"replay.local:28020|10%"&lt;/span&gt;  &lt;span class="c"&gt;# (每秒请求数限制10%以内)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;b. 基于 Header 或 Url 的参数限制一些请求，为指定的 header 或者 url 的请求设定限制的百分比。&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; ./goreplay  &lt;span class="nt"&gt;--input-raw&lt;/span&gt; :80 &lt;span class="nt"&gt;--output-tcp&lt;/span&gt; &lt;span class="s2"&gt;"replay.local:28020|10%"&lt;/span&gt; &lt;span class="nt"&gt;--http-header-limiter&lt;/span&gt; &lt;span class="s2"&gt;"X-API-KEY: 10%"&lt;/span&gt;
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./goreplay  &lt;span class="nt"&gt;--input-raw&lt;/span&gt; :80 &lt;span class="nt"&gt;--output-tcp&lt;/span&gt; &lt;span class="s2"&gt;"replay.local:28020|10%"&lt;/span&gt; &lt;span class="nt"&gt;--http-param-limiter&lt;/span&gt; &lt;span class="s2"&gt;"api_key: 10%"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;请求过滤:
当你需要捕捉指定路径的请求流量时，可以使用该机制，如只同步/api 路径下的请求
&lt;code&gt;bash
sudo ./goreplay --input-raw :8080 --output-http staging.com --http-allow-url /api
&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;另外还有其它一些参数用法：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;--http-disallow-url&lt;/span&gt;    &lt;span class="c"&gt;#不允许正则匹配的Url&lt;/span&gt;
&lt;span class="nt"&gt;--http-allow-header&lt;/span&gt; &lt;span class="c"&gt;#允许的 Header 头&lt;/span&gt;
&lt;span class="nt"&gt;--http-disallow-header&lt;/span&gt; &lt;span class="c"&gt;#不允许的 Header 头&lt;/span&gt;
&lt;span class="nt"&gt;--http-allow-method&lt;/span&gt; &lt;span class="c"&gt;#允许的请求方法，传入值为GET, POST, OPTIONS等&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;更多参考官方文档：&lt;a href="https://github.com/buger/goreplay/wiki/Getting-Started" rel="nofollow" target="_blank"&gt;https://github.com/buger/goreplay/wiki/Getting-Started&lt;/a&gt;&lt;/p&gt;</description>
      <author>xiaocui</author>
      <pubDate>Tue, 13 Nov 2018 15:17:06 +0800</pubDate>
      <link>https://ruby-china.org/topics/37756</link>
      <guid>https://ruby-china.org/topics/37756</guid>
    </item>
    <item>
      <title>哪位用过 Ember.js 框架的？？</title>
      <description>&lt;p&gt;最近在学习 emberjs 框架，看了一些语法和结构，跟着跑了下例子，也用 rails 实现了下 todo 程序。目前只是停留在单页面程序上，但还是不是很清楚 emberjs 在 rails 中最厉害的地方是什么。&lt;/p&gt;</description>
      <author>xiaocui</author>
      <pubDate>Wed, 03 Sep 2014 11:23:55 +0800</pubDate>
      <link>https://ruby-china.org/topics/21361</link>
      <guid>https://ruby-china.org/topics/21361</guid>
    </item>
    <item>
      <title>有没有写过 cms 系统的大牛啊？？</title>
      <description>&lt;p&gt;准备写个简单的站群管理系统，现在创建了文章，评论，站点信息，友情链接 4 个表，还需要那些表啊？？可能对站群的理解还有点局限，请大牛指导下&lt;/p&gt;</description>
      <author>xiaocui</author>
      <pubDate>Fri, 09 May 2014 09:07:36 +0800</pubDate>
      <link>https://ruby-china.org/topics/19115</link>
      <guid>https://ruby-china.org/topics/19115</guid>
    </item>
  </channel>
</rss>
