TCPCopy顾名思义,就是一个可以将tcp流量复制的工具(其实也可以复制UDP)。有了这样一个工具,我们就可以真实的复制线上流量,然后将这些流量复制到我们的测试服务器上。这样就可以很容易模拟线上真实用户的访问,做一些功能上的,性能上的测试。而且经过实际测试发现TCPCopy对线上机器的资源消耗也是极低的。

借助这么一个工具,我们可以比较容易的实现一些比较有意思的功能。比如我们现在我们的应用都已经服务化了,那么我们在一次需求变更之后,或者一次性能优化之后,我们如何最快的知道该服务功能是否正确,性能优化是否达到期望呢?当然,我们可以使用一些性能压测工具模拟大量请求,但是有的时候来自线上真实的流量或许能最真实的反应实际情况。

OK,那我们可以使用TCPCopy将线上流量复制到线下测试环境。在我们使用这种方式的时候,又发现另外一个问题。我们很多时候进行引流的时候,只希望复制部分服务的流量。比如我们想将下单服务的引入进来,但并不想将支付订单的流量也引入进来,因为这样我们可能需要搭建一个很复杂的环境。另外, 有的时候我们只想针对单个服务进行测试,这样的话只复制单个服务或符合条件的流量,可以更好的隔离我们的测试,隔离其他服务对我们测试期望的影响。基于这些原因,我们就不能直接的将TCPCopy的所有流量全部直接的引入测试环境。为此我们开发了一个proxy -- DubboCopy(因为我厂的服务框架是基于Alibaba开源的Dubbo)。

下面第一个图是使用TCPCopy的原始结构:

使用DubboCopy之后的结构:

DubboCopy的目的主要有:

1. 降低服务流量复制的使用门槛

2. 基于多重维度的服务流量复制

3. 监控各种性能指标,收集服务响应结果

那么下面我们就分几个部分介绍我们是如何实现的。

降低服务流量复制的使用门槛

其实TCPCopy的使用还是有一些门槛的,有一些网段的限制,需要添加一些路由表等。并且TCPCopy没有提供rpm包等,如果从零搭建一套流量复制环境,还是要费一番周折。而我们想达到的是一键引流,对使用方透明。首先我们自己build了TCPCopy的RPM放入公司的仓库。然后我们请求OPS协助提供了在线上机器启停TCPCopy的HTTP接口。这样一来用户使用该功能的时候,就基本上感受不到TCPCopy的存在。这里说点题外话:『基础设施服务化,流程API化』是提高生产效率非常有效的办法,感谢兄弟部门的协作让整个流程畅通起来。

另外一点是,因为TCPCopy直接面对的是我们提供的这个proxy,不会直接跟线下测试服务器交互,所以一些配置在proxy上配置,也对使用者透明,继续降低了使用的复杂度。

可以基于多重维度的服务流量复制

这一点是我们的主要目的。用户使用该功能的时候,只需要在界面上选择需要复制的服务,并且指定目标机器。这时DubboCopy就会使用调用接口在线上机器启动TCPCopy。需要注意的是,我们复制的流量可能来自线上多台机器,而我们的DubboCopy也是部署有多台。那么在调用启动接口的时候,会使用类似一个负载均衡的方式发送不同的命令到不同的线上机器,将流量均衡的复制到各个DubboCopy。

当TCPCopy将流量复制到proxy后,我们可以部分解析Dubbo的协议,从中提取出服务,方法等信息。有了这些信息我们就可以根据预先配置好的信息选择要将数据包复制到哪些测试机。DubboCopy是使用Netty开发的,接收到TCPCopy复制过来的流量之后,我们部分的解析出所需信息,然后了解到该请求的长度,读取指定长度的数据,然后发送到目标机。但是,如果我们想提供这样一个通用服务,我们需要承载大量线上机器复制过来的流量,但是基于成本考虑我们的DubboCopy不能扩展特别多。那么我们怎么更有效率的处理这个转发呢?对于这样一个网络转发应用而言,我们的资源消耗主要在网络,内存和CPU。内网里,一般来说网络不会成为一个特别大的问题,而且大部分业务服务,数据量并不是特别大(当然也有一些是需要获取大量的数据)。CPU主要用于处理网络和协议解析部分。而使用Java编写这类服务,我最担心的是内存上。因为该服务需要处理大量的请求数据,GC会不会成为一个很大的问题呢?不过进一步分析我们发现,可以做到几乎不使用堆内存。Netty读取的数据可以使用DirectByteBuffer,这样就分配在堆外了,然后我们也是部分解析请求的数据,这只会占用很少的字节。另外,我们提取的信息其实都是类似服务名,方法名等元数据信息。对于这类信息我们都是可以缓存的。而数据呢?其实我们只需要确定一个请求的数据大小,然后将这个大小的数据原样的复制过去即可。我们使用Netty的ByteBuf的readSlice,甚至都无须将数据读取出来,就可以直接将所需数据写入到发送通道。这样整个过程,基本上是不怎么消耗堆内内存的,所以GC基本上没有压力。而对于堆外内存,Netty 4提供了pool,也能大大降低分配的开销。在我们的实际测试也表明了堆内存占用极低,GC也不怎么频繁。

另外,我们将接受数据的Netty Server的worker线程与发送数据的Netty Client的worker线程进行共享,这样进一步降低了上下文切换的频率。

监控各种性能指标,收集服务响应结果

实际上,我们进行复制的目的无非就两点:性能测试和功能测试。

那么对于性能测试来说就是各种性能指标,而服务的RT是否有变化可能是其中最关键的一点。

对于功能测试,最直接的可能是服务的响应数据是否有异常等,不过也可以进一步做到响应数据与线上服务的响应数据进行对比(这一点目前还未实现)。

有了这两方面的数据,我们就覆盖了服务流量复制到结果收集两个环节,能做到一个比较有效的线上环境模拟的工具了。

那么问题来了,大家的线上模拟环境是怎么实现的呢?或者对这个工具感兴趣,有什么新需求的都欢迎来聊聊。

基于TCPCopy的Dubbo服务引流工具-DubboCopy的更多相关文章

  1. 基于注解的Dubbo服务配置

      基于注解的Dubbo服务配置可以大大减少dubbo xml配置文件中的Service配置量,主要步骤如下:   一.服务提供方   1. Dubbo配置文件中增加Dubbo注解扫描 <!-- ...

  2. Dubbo服务限流

    为了防止某个消费者的QPS或是所有消费者的QPS总和突然飙升而导致的重要服务的失效,系统可以对访问流量进行控制,这种对集群的保护措施称为服务限流. Dubbo中能够实现服务限流的方式较多,可以划分为两 ...

  3. 推荐一款简单易用线上引流测试工具:GoReplay

    一. 引流测试产生背景 日常大部分的测试工作都是在测试环境下,通过模拟用户的行为来对系统进行验证,包括功能以及性能.在这个过程中,你可能会遇到以下问题: 用户访问行为比较复杂,模拟很难和用户行为一致, ...

  4. 真刀真枪压测:基于TCPCopy的仿真压测方案

    郑昀 基于刘勤红和石雍志的实践报告 创建于2015/8/13 最后更新于2015/8/19 关键词:压测.TCPCopy.仿真测试.实时拷贝流量 本文档适用人员:技术人员 提纲: 为什么要做仿真测试 ...

  5. HTTP引流神器Goreplay详解【官译】

    0.背景 校验系统的正确性和可靠性时,仅靠用例场景无法覆盖全生产环境下的所有场景,需要一套引流工具,在系统正式上线前,用线上的请求测试待上线系统,在正常请求下,是否有报错:在数倍请求下,系统的性能瓶颈 ...

  6. github博客Hexo引流到微信

    相信有不少小伙伴都在github上创建了属于自己的博客,其中用Hexo的Next主题应该不少,那么,我们究竟该如何将博客的流量引流到微信呢?今天就来带你看一看. 如何引流 现在网上有一种套路,当你在看 ...

  7. 利用tcpcopy引流过程

    tcpcopy是一个tcp流量复制工具,当前还支持udp和mysql流量的复制. 目的: 将机器10.24.110.21的5000端口流量引流到机器10.23.25.11的5000端口. 示例:将10 ...

  8. 容量测试之tcpcopy引流模式

    tcpcopy 给用户提供了很多命令参数来修改引流的模式和设置,详细可以查阅手册.在这里把几种常见的引流方式做个归纳小结,以tcpcopy传统架构使用命令举例. 1.分布式引流 用法:Tcpcopy可 ...

  9. Visual Studio2012 添加服务引用时,生成基于任务操作不可用原因

    今天在添加服务引用时,发现 单选按钮 ”生成基于任务操作“不可用,原因项目选择的.net frame是3.5,调整为.net 4.5或.net4.6即可. 原因:.net4.5以下的环境不支持.

随机推荐

  1. C2第八次解题报告

    看过题解后如果觉得还算有用,请帮忙加点我所在团队博客访问量 http://www.cnblogs.com/newbe/ http://www.cnblogs.com/newbe/p/4069834.h ...

  2. TestNG教程

    TestNG教程 http://www.yiibai.com/testng/2013/0916311.html TestNG,3种执行方式: 1.ant(build.xml) 2.Eclipse(安装 ...

  3. spring简介

    在SSH框假中spring充当了管理容器的角色.我们都知道Hibernate用来做持久层,因为它将JDBC做了一个良好的封装,程序员在与数据库进行交互时可以不用书写大量的SQL语句.Struts是用来 ...

  4. 【ios面试总结】

    一 C语言方法的知识 1: const  static  voilite 修辞变量各代表什么意思? const  修辞的变量为常量,常量是不容许修改.  static  修辞的变量为静态变量,在内存中 ...

  5. yuecheng 笑话

    http://115.28.189.219:9898/stock/manager_articles/fundamentals 要闻 http://115.28.189.219:9898/stock/m ...

  6. linux redmine 搭建

    redmine搭建过程参考:http://www.tuicool.com/articles/InMbym 注意事项: 配置文件必须以2个空格开始 启动(指定了端口,和绑定的IP): ruby bin/ ...

  7. 深入理解openstack网络架构(4)-----连接到public network

    原文地址: https://blogs.oracle.com/ronen/entry/diving_into_openstack_network_architecture3 译文转自:http://b ...

  8. 从 Android 静音看正确的查bug的姿势?

    0.写在前面 没抢到小马哥的红包,无心回家了,回公司写篇文章安慰下自己TT..话说年关难过,bug多多,时间久了难免头昏脑热,不辨朝暮,难识乾坤...艾玛,扯远了,话说谁没踩过坑,可视大家都是如何从坑 ...

  9. 设计模式之美:Strategy(策略)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):使用不同的 Strategy 处理内部状态. 别名 Policy 意图 定义一系列的算法,把它们一个个封装起来,并且使它们可以相 ...

  10. 【面试必备】CSS盒模型的点点滴滴

    从接触CSS布局开始,就一直在听盒模型的概念了,网上的文章有很多,深浅不一.有些人会认为盒模型很简单,不就是border.margin.padding.content嘛,一个元素所占的空间就是把它们都 ...