`
m635674608
  • 浏览: 5002470 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

基于TCPCopy的Dubbo服务引流工具-DubboCopy

    博客分类:
  • java
 
阅读更多

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是否有变化可能是其中最关键的一点。

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

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

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

 

http://www.cnblogs.com/yuyijq/p/4541660.html

分享到:
评论

相关推荐

    jmeter-plugins-dubbo-2.7.8-jar-with-dependencies.jar

    jmeter的dubbo插件,jmeter-plugins-dubbo-2.7.8-jar-with-dependencies.jar,适用于JMeter5.4.1版本,将解压后的文件jmeter-plugins-dubbo-2.7.8-jar-with-dependencies放在Jmeter安装目录下的\lib\ext文件夹中,...

    jmeter-plugins-dubbo-2.7.1-jar-with-dependencies

    本文将深入探讨“jmeter-plugins-dubbo-2.7.1-jar-with-dependencies”这一系统压测工具包,它专门针对基于Java的Dubbo服务进行性能测试。了解并熟练掌握这一工具,能帮助我们更好地优化服务性能,提升系统的稳定性...

    Dubbo视频教程--基础篇--1到4集的文档与源码

    Dubbo视频教程--基础篇--第01节--使用Dubbo对传统工程进行服务化改造的思路介绍--传工程源码.rar Dubbo视频教程--基础篇--第04节--使用Dubbo对传统工程进行服务化改造后的服务调用测试--源码.rar Dubbo视频教程--001...

    dubbo-monitor-simple-2.5.8-assembly.tar.gz

    《Dubbo监控工具详解——基于dubbo-monitor-simple-2.5.8》 在分布式系统开发中,监控是至关重要的一个环节,它可以帮助开发者实时了解服务的运行状态,及时发现并解决问题。Apache Dubbo,作为一款高性能、轻量级...

    dubbo相关文件 dubbo-admin consumer-demo provider-demo

    2.dubbo-admin-2.4.1.war 管理控制台项目 3.dubbo-demo-consumer-2.1.5-assembly.tar.gz dubbo消费者示例项目 4.dubbo-demo-provider-2.1.5-assembly.tar.gz dubbo服务提供者示例项目 5.dubbo-monitor-simple-2.5.3-...

    dubbo监控中心dubbo-monitor-simple

    该包为dubbo-monitor,使用方法请参见博文 《Dubbo进阶(五)—— dubbo-monitor-simple使用》 https://blog.csdn.net/sunhuaqiang1/article/details/80141478

    dubbo监控平台dubbo-monitor-simple-2.5.3

    Dubbo-Monitor-Simple是Dubbo官方提供的基础监控平台,它可以帮助开发者实时监控服务的调用情况,包括服务的调用次数、成功率、响应时间等关键指标,从而及时发现并解决问题,提升系统的稳定性和性能。这个版本为...

    dubbo-dubbo-2.7.3.rar

    dubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo...

    jmeter-plugins-dubbo-2.7.1-jar-with-dependencies (1)

    本文将深入探讨"jmeter-plugins-dubbo-2.7.1-jar-with-dependencies (1)"这个压缩包中的关键知识点。 1. **JMeter Plugins for Dubbo** JMeter Plugins for Dubbo 是一个扩展了JMeter功能的插件,专门用于测试基于...

    dubbo-demo-consumer、dubbo-demo-provider、dubbo-simple-monitor

    本篇将详细讲解基于dubbo-demo-consumer、dubbo-demo-provider和dubbo-simple-monitor的实例服务,带你深入理解Dubbo的核心概念和操作流程。 首先,我们来看`dubbo-demo-consumer`,它是Dubbo服务的消费者。消费者...

    dubbo-admin dubbo-monitor.zip 2.8.4可用

    【标题】"dubbo-admin dubbo-monitor.zip 2.8.4可用" 指的是一个包含Dubbo管理工具和监控模块的压缩包文件,版本为2.8.4,适用于Dubbo框架的管理和监控需求。 【描述】"dubbo-admin.zip dubbo-monitor.zip; 包含 ...

    dubbo-admin-2.5.4及dubbo-monitor-2.5.3 安装及配置

    dubbo-admin安装要点: 1.清空tomcat/webapps/ROOT目录 2.将包解压到tomcat/webapps/ROOT下 3.修改tomcat/webapps/ROOT/WEB-INF/dubbo.properties 文件 dubbo.registry.address dubbo接口服务注册地址: 单机...

    基于SpringBoot+Dubbo的微服务框架-SpringBoot-Dubbo-Docker-Jenkins.zip

    【标题】: "基于SpringBoot+Dubbo的微服务框架-SpringBoot-Dubbo-Docker-Jenkins.zip" 提供了一个综合的微服务开发解决方案,结合了SpringBoot、Dubbo、Docker和Jenkins四个核心组件。这四个技术在现代IT行业中扮演...

    springboot2.0.x+dubbo-spring-boot-starter

    标题 "springboot2.0.x+dubbo-spring-boot-starter" 涉及的是将流行的微服务框架 Dubbo 集成到 Spring Boot 2.0.x 的项目实践中。这个集成使得开发者能够利用 Spring Boot 的便利性和 Dubbo 的高性能远程服务调用...

    Dubbo视频教程--高可用架构篇

    【标题】"Dubbo视频教程--高可用架构篇"揭示了如何构建稳定且容错性强的分布式服务系统,重点在于Dubbo框架在高可用场景下的应用。本教程深入讲解了Dubbo的核心特性以及如何利用这些特性来提升服务的可靠性。 ...

    dobbo源码dubbo-dubbo-2.7.3.rar

    dobbo源码dubbo-dubbo-2.7.3.rardobbo源码dubbo-dubbo-2.7.3.rardobbo源码dubbo-dubbo-2.7.3.rardobbo源码dubbo-dubbo-2.7.3.rardobbo源码dubbo-dubbo-2.7.3.rardobbo源码dubbo-dubbo-2.7.3.rardobbo源码dubbo-dubbo...

    dubbo-admin-2.5.4.war

    dubbo-admin-2.5.4提供支持JDK1.7及JDK1.8的War包 Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看...

    dubbo-admin-2.5.4.war后台管理

    总之,`dubbo-admin-2.5.4.war`为开发者提供了一个强大的服务治理工具,通过它,我们可以对Dubbo服务进行精细化管理,提升系统的稳定性和效率。熟练掌握其使用,无疑会极大地提升开发和运维的效率。

    dubbo-monitor-simple-2.5.4-SNAPSHOT-assembly.tar.gz

    首先,我们关注的是“dubbo-monitor-simple”这个组件,它是Dubbo监控体系的一部分,主要负责收集、展示服务的运行数据,如调用次数、成功率、响应时间等,帮助开发者实时了解服务状态,及时发现并解决问题。...

    dubbo-monitor-simple-2.6.1.tgz

    dubbo官方自带了dubbo-admin及dubbo-simple/dubbo-monitor-simple二个子项目用于服务治理及服务监控。 dubbo-monitor-simple是Alibaba的开源项目,用于监控在dubbo框架下接口暴露,注册情况,也可以看接口的调用...

Global site tag (gtag.js) - Google Analytics