全链路压测组件、全链路压测方法及装置与流程

专利2024-10-17  33


本申请涉及互联网术领域,尤其涉及一种全链路压测组件、全链路压测方法及装置。



背景技术:

链路压力测试是基于实际生产业务场景和系统环境,模拟海量的用户请求和数据对整个业务链进行压力测试,并持续调优的过程。

目前,业务场景越发复杂化,在整个业务链中,不同应用服务之间关联性越来越密切,可谓是牵一发而动全身。但是,在相关链路压力测试方案中,主要通过在压测前伪造一批数据,压测结束后再进行删除数据,这种手动对线上的真实数据进行删改极容易给系统带来风险和故障,而且也非常容易出现压测数据被当成真实数据使用,导致用户错误下单等问题。



技术实现要素:

有鉴于此,现提供一种全链路压测组件、装置、计算机设备及计算机可读存储介质,以解决现有技术中在链路压测结束后需要手动删改数据,容易导致系统风险和故障的问题。

本申请提供了一种全链路压测组件,包括:

接收请求处理组件,用于拦截数据请求,并对所述数据请求的请求头进行解析,以根据解析结果判定所述数据请求是否为压测请求;

压测请求响应组件,还用于在判定所述数据请求为压测请求时,对所述压测请求进行响应得到压测数据;

数据存储组件,用于拦截所述压测数据,并采用影子技术将所述压测数据存储至数据库中。

可选地,在所述数据库为关系型数据库时,所述数据存储组件还用于拦截所述压测数据,并采用影子表技术将所述压测数据存储至所述关系型数据库中预先配置的影子表中;

在所述数据库为以键值对形式进行数据存储的非关系型数据库时,所述数据存储组件还用于拦截所述压测数据,并采用影子键技术将所述压测数据存储至所述非关系型数据库中预先配置的影子键中。

可选地,所述全链路压测组件还包括分库分表规则读取组件;

所述分库分表规则读取组件用于读取预先配置的所述影子表的分库分表规则,并根据读取到的分库分表规则构建所述影子表的分表;

所述数据存储组件还用于拦截所述压测数据,并采用影子表技术与所述分库分表规则将所述压测数据存储至对应的分表中。

可选地,所述全链路压测组件还包括:分库分表配置组件;

所述分库分表配置组件,用于将预先配置的分库分表的路由规则添加至预设的配置文件中,其中,所述路由规则用于确定所述压测数据存储的分表;

所述数据存储组件还用于拦截所述压测数据,并采用影子表技术与所述路由规则将所述压测数据存储至对应的分表中。

可选地,所述压测请求响应组件,还用于将所述压测请求中的压测标识注入至待压测的第一应用服务的当前的线程上下文中,以使所述第一应用服务根据所述线程上下文对所述压测请求进行响应得到压测数据。

可选地,所述压测请求响应组件,还用于采用请求头的方式将包含压测标识的压测请求透传至第二应用服务,以使所述第二应用服务对所述压测请求进行响应得到压测数据。

可选地,所述压测请求响应组件,还用于采用异步消息的方式将包含压测标识的压测请求透传至预设的broker服务器中,以使第三应用服务从所述broker服务器中监听到所述压测标识时,对所述压测请求进行响应得到压测数据。

可选地,所述broker服务器为分布式数据同步系统databus中的服务器时,所述压测请求响应组件,还用于采用protopuf插件对所述压测标识进行处理,得到处理后的压测标识,将包含处理后的压测标识的压测请求通过消息的方式透传至预设的broker服务器中。

本申请还提供了一种全链路压测方法,包括:

通过发压平台产生数据请求;

通过全链路压测组件拦截数据请求,并对所述数据请求的请求头进行解析,以根据解析结果判定所述数据请求是否为压测请求;

在判定所述数据请求为压测请求时,通过所述全链路压测组件将所述压测请求中的压测标识注入至待压测的第一应用服务的当前的第一线程上下文中;

通过所述第一应用服务根据所述第一线程上下文对所述压测请求进行响应得到第一压测数据。

可选地,所述全链路压测方法还包括:

在所述第一应用服务调用预设的第二应用服务对所述压测请求进行处理时,通过所述全链路压测组件采用请求头的方式将包含所述压测标识的压测请求透传至所述第二应用服务;

通过所述全链路压测组件将所述压测标识注入至所述第二应用服务的当前的第二线程上下文中;

通过所述第二应用服务根据所述第二线程上下文对所述压测请求进行响应得到第二压测数据。

可选地,所述全链路压测方法还包括:

在所述第一应用服务或所述第二应用服务通过异步消息的方式调用预设的第三应用服务对所述压测请求进行处理时,通过所述全链路压测组件将包含所述压测标识的压测请求透传至预设的broker服务器中;

通过所述第三应用服务监听所述broker服务器中的压测标识;

在监听到所述压测标识时,通过所述全链路压测组件将所述压测标识注入至所述第三应用服务的当前的第三线程上下文中;

通过所述第三应用服务根据所述第三线程上下文对所述压测请求进行响应得到第三压测数据。

可选地,所述全链路压测方法还包括:

通过所述全链路压测组件拦截所述第一压测数据,并采用影子技术将所述第一压测数据存储至数据库中;及/或

通过所述全链路压测组件拦截所述第二压测数据,并采用影子技术将所述第二压测数据存储至数据库中;及/或

通过所述全链路压测组件拦截所述第三压测数据,并采用影子技术将所述第三压测数据存储至数据库中。

本申请还提供了一种全链路压测装置,包括:

产生模块,用于通过发压平台产生数据请求;

判定模块,用于通过全链路压测组件拦截数据请求,并对所述数据请求的请求头进行解析,以根据解析结果判定所述数据请求是否为压测请求;

注入模块,用于在判定所述数据请求为压测请求时,通过所述全链路压测组件将所述压测请求中的压测标识注入至待压测的第一应用服务的当前的第一线程上下文中;

响应模块,用于通过所述第一应用服务根据所述第一线程上下文对所述压测请求进行响应得到第一压测数据。

本申请还提供了一种计算机设备,所述计算机设备,包括存储器、处理器以及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述方法的步骤。

本申请还提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述方法的步骤。

上述技术方案的有益效果:

本申请实施例中,在进行链路压测时,通过全链路压测组件拦截数据请求,并对所述数据请求的请求头进行解析,以根据解析结果判定所述数据请求是否为压测请求;以及在判定所述数据请求为压测请求时,将所述压测请求中的压测标识注入至待压测的第一应用服务的当前的线程上下文中,使得压测标识透传至第一应用服务中。这样第一服务服务在对所述压测请求进行处理得到的压测数据就会具有真实的数据所不具有的压测标识,从而在对该压测数据进行存储时,可以全链路压测组件拦截所述压测数据,并采用影子技术将所述压测数据存储至数据库中,实现压测数据和真实数据的隔离。此外,在所述第一应用服务调用预设的第二应用服务对所述压测请求进行处理时,全链路压测组件还可以采用请求头的方式将所述压测标识透传至所述第二应用服务,这样,第二应用服务在对所述压测请求进行处理得到的压测数据也会具有真实的数据所不具有的压测标识,从而可以在对第二应用服务响应所述压测请求得到的压测数据进行存储时,也可以通过全链路压测组件拦截所述压测数据,并采用影子技术将该压测数据存储至数据库中,实现压测数据和真实数据的隔离。此外,在所述第一应用服务或所述第二应用服务通过异步的方式调用预设的第三应用服务对所述压测请求进行处理时,全链路压测组件,可以将所述压测标识透传至预设的broker服务器中,这样,当第三服务服务在对所述压测请求进行处理得到的压测数据也会具有真实的数据所不具有的压测标识,从而可以在对第三应用服务响应所述压测请求得到的压测数据进行存储时,也可以通过全链路压测组件拦截所述压测数据,并采用影子技术将该压测数据存储至数据库中,实现压测数据和真实数据的隔离。此外,本实施例中,在应用服务之间实现调用时,通过将压测标识进行透传,从而保证了链路的完整性。

附图说明

图1为本申请实施例中用于实现全链路压测方法的架构图;

图2为本申请实施例中全链路压测组件的功能模块示意图;

图3为本申请适用于全链路压测方法的流程图;

图4为本申请另一适用于全链路压测方法的流程图;

图5为本申请另一适用于全链路压测方法的流程图;

图6为本申请所述的全链路压测装置的一种实施例的程序模块图;

图7为本申请实施例提供的执行全链路压测方法的计算机设备的硬件结构示意图。

具体实施方式

以下结合附图与具体实施例进一步阐述本申请的优点。

这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本公开相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本公开的一些方面相一致的装置和方法的例子。

在本公开使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本公开。在本公开和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其它含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。

应当理解,尽管在本公开可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本公开范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。

在本申请的描述中,需要理解的是,步骤前的数字标号并不标识执行步骤的前后顺序,仅用于方便描述本申请及区别每一步骤,因此不能理解为对本申请的限制。

图1示意性示出了根据本申请实施例中用于实现全链路压测方法的架构图。在示例性的实施例中,实现全链路压测方法的架构可以包括发压平台1、网关2、全链路压测组件3,多个待压测的应用服务4及数据库5。

其中,发压平台1用于产生数据请求,并将数据请求通过网关2传至全链路组件3中,全链路组件3用于拦截数据请求,并对数据请求中包含的压测标识透传至各个待压测的应用服务4中,以便对各个应用服务4进行压测,得到压测数据。数据库5用于通过影子技术来存储压测数据,从而实现压测数据与真实数据的隔离,保证压测数据和真实数据不会混乱。

参阅图2,其为本申请一实施例的全链路压测组件的功能模块示意图。从图中可以看出,本实施例中所提供的全链路压测组件20可以包括:接收请求处理组件21、压测请求响应组件22、数据存储组件23。

接收请求处理组件21,用于拦截数据请求,并对所述数据请求的请求头进行解析,以根据解析结果判定所述数据请求是否为压测请求。

具体地,接收请求处理组件21作为一个过滤器(filter),用于拦截数据请求,并对数据请求的请求头进行解析,以根据解析结果判定所述数据请求是否为压测请求

作为示例,接收请求处理组件21可以为一个webfilter,其可以被注入至tomcat容器里,这样,因tomcat容器实现了servlet组件javax.servlet.filter的规范,故webfilter可以拦截所有的数据请求,并在拦截到数据请求后,可以对数据请求的请求头进行解析,在解析到请求头中包含有压测标识时,可以判定该数据请求为压测请求,并可以进一步将压测标识注入至第一应用服务的当前的线程上下文中。第一应用服务在当前的线程上下文中获取到压测标识后,即可以重建压测上下文。在本实施例中,为了便于后续进行功能扩展,重建的压测上下文可以抽象出来一个context类,这样若需要扩展tracecontext上下文等,只需要添加一些特殊的api,即可实现无缝升级。

其中,所述数据请求是由发压平台产生的,该数据请求可以为正常的数据请求,也可以为压测请求。正常的数据请求指的是会产生真实结果的数据请求,比如,一个真实的下单数据请求。压测请求是基于用户产生的真实数据而伪造出来的mock(模拟)数据,用于对应用服务进行压测的,其是一个不会产生真实结果的数据请求,而是会产生mock结果的数据请求,比如,一个模拟的下单数据请求,该模拟的下单请求指的是一个不会存在商家对该请求进行发货的下单数据请求。在本实施例中,压测请求是一个具有压测标识的数据请求,而正常的数据请求则没有压测标识。压测标识是用于区分是压测请求还是正常的数据请求的信息。在一具体实施方式中,压测标识定义如下:

bili_global_context:{"malltest":true,"verbose":true,"globalswitch":true}。

其中,压测数据是应用服务对压测请求进行响应得到的数据,该压测数据与真实数据不同之处在于,其不会产生一个真实结果。

压测请求响应组件22,还用于在判定所述数据请求为压测请求时,对所述压测请求进行响应得到压测数据。

具体地,在不同的场景中,压测请求响应组件22对压测请求进行响应得到压测数据的方式不同。

作为示例,当处于服务(比如第一应用服务)内部线程对压测请求进行处理的场景时,压测请求响应组件22会将所述压测请求中的压测标识注入至待压测的第一应用服务的当前的线程上下文中,以使所述第一应用服务根据所述线程上下文对所述压测请求进行响应得到压测数据。具体而言,第一应用服务会根据该压测标识重建压测上下文,并基于重建的压测上下文对所述压测请求进行响应得到压测数据。作为示例,当处于服务之间的(比如第一应用服务调用第二应用服务)同步调用对压测请求进行处理的场景时,压测请求响应组件22可以采用请求头的方式将包含压测标识的压测请求透传至第二应用服务,以使所述第二应用服务对所述压测请求进行响应得到压测数据。具体而言,当第一应用服务通过feign客户端调用第二应用服务对压测请求进行处理,或者通过resttemplate调用第二应用服务对压测请求进行处理时,压测请求响应组件22可以采用请求头的方式将包含压测标识的压测请求透传至第二应用服务。

需要说明的是,当通过feign客户端调用第二应用服务时,由于feign客户端本质上是使用http技术请求来调用应用服务的,因此,在通过feign客户端调用第二应用服务对所述压测请求进行处理时,可以将压测标识添加至调用请求的请求头中,从而实现将包含压测标识的压测请求至所述第二应用服务。当通过resttemplate调用第二应用服务时,由于resttemplate本质上也是基于http请技术来调用应用服务的,无非是封装了调用细节(具体实现可以是netty、httpclient、okhttp、jdkhttp等),因此,在通过resttemplate调用第二应用服务对所述压测请求进行处理时,也可以将压测标识添加至调用请求的请求头中,从而实现将包含压测标识的压测请求透传至所述第二应用服务。

作为示例,当处于服务之间的(比如第一应用服务或第二应用服务调用第三应用服务)异步调用对压测请求进行处理的场景时,压测请求响应组件22,还用于采用异步消息的方式将包含压测标识的压测请求透传至预设的broker服务器中,以使第三应用服务从所述broker服务器中监听到所述压测标识时,对所述压测请求进行响应得到压测数据。具体而言,采用不同的异步消息调用第三应用服务对所述压测请求进行处理时,将包含压测标识的压测请求透传至broker服务器中的方式不同。

作为示例,当broker服务器为分布式数据同步系统databus中的服务器时,由于databus与java客户端不是很兼容,因此,为了解决兼容性问题,本实施例中的,压测请求响应组件22在将包含压测标识的压测请求透传至broker服务器中时,可以先通过protopuf插件对所述压测标识进行处理,得到处理后的压测标识,之后再将包含处理后的压测标识的压测请求通过消息的方式透传至预设的broker服务器中。

其中,protobuf插件(googleprotocolbuffers)是google提供一个具有高效的协议数据交换格式工具库(类似json),但相比于json,protobuf有更高的转化效率,时间效率和空间效率都是json的3-5倍,通过protopuf插件可以通过二进制字节的序列化方式对压测标识进行序列化,避免databus与java客户端不兼容。

作为示例,当broker服务器为rabbitmq中的服务器时,压测请求响应组件22,在将包含压测标识的压测请求透传至broker服务器中时,可以无需对压测标识进行处理,而是直接将压测标识通过消息的方式透传至broker服务器中。

作为示例,当采用线程池传递消息的方式将包含压测标识的压测请求透传至broker服务器中,由于在线程池中,一个线程是会被多次复用的,这样每次的上下文环境可能都不会相同,因此,为了解决在将压测标识透传至broker服务器时,因为上下文环境的不同可能导致压测标识透传出错的问题,本实施例中,压测请求响应组件22在将包含压测标识的压测请求透传至broker服务器中时,可以先通过对象映射器dapper对所述压测标识进行包装处理,得到包装后的压测标识,将包含所述包装后的压测标识的压测请求通过线程池的方式透传至预设的broker服务器中。

其中,dapper是一个简单的.net对象映射器,在速度方面具有"kingofmicroorm"的头衔,几乎与使用原始的ado.net数据读取器一样快。orm是一个对象关系映射器,它负责数据库和编程语言之间的映射。dapper通过扩展idbconnection提供一些有用的扩展方法去查询您的数据库。本实施例中,通过dapper对所述压测标识进行包装,从而可以使得包装后的压测标识不会因为线程池的上下文环境不同而导致压测标识透传出错。

数据存储组件23,用于拦截所述压测数据,并采用影子技术将所述压测数据存储至数据库中。

具体地,所述数据存储组件23作为一个拦截器,可以拦截压测数据,并使用影子技术将压测数据存储至数据库中。

在本实施例中,在使用影子技术将压测数据存储至数据库时,不同类别的数据库,使用影子技术将压测数据存储至数据库的方式不同。

作为示例,当数据库为关系型数据库,比如mysql数据库,则可以采用影子表技术将所述压测数据存储至mysql数据库中预先配置的影子表中。其中,影子表是基于真实表复制出的一套与真实表具有相同结构的表,其与真实表的用途不同,仅用于存储压测数据。在一实施方式中,为了将影子表和真实表加以区分,在配置影子表时,可以在对影子表命名时添加特定的字符前缀或后缀来分区影子表和真实表。

可以理解的是,在使用影子表技术将压测数据存储至关系型数据库时,则需要动态修改将压测数据存储至关系型数据库的sql(structuredquerylanguage,结构化查询语句)语句,比如,一条sql语句insertintouser(name)values("zhangsan"),如果这是一条将压测数据存储至数据库的语句,则在通过这条语句将压测数据存储至数据库时,则可以先通过mybatis提供的parameterhandler插件拦截这条语句,之后通过mybatis提供的preparedstatementhandler插件将这条语句更改成insertintobili_shadow_user(name)values("zhangsan"),从而使得该压测数据可以存储至影子表中。

本实施例中,通过将压测数据存储至影子表中,从而无需对真实表中存储的数据进行删改,以及可以避免用户可以查看到影子表的数据。

在一实施方式中,考虑压测数据的数据量较大,若使用单独的影子表来存储压测数据会影响sql执行的性能,因此为了解决这个问题,全链路压测组件20还包括分库分表规则读取组件。

所述分库分表规则读取组件,用于读取预先配置的所述影子表的分库分表规则,并根据读取到的分库分表规则构建所述影子表的分表。

所述数据存储组件23,还用于拦截所述压测数据,并采用影子表技术与所述分库分表规则将所述压测数据存储至对应的分表中。

具体地,当使用shardingjdbc组件进行分库分表时,用户可以预先把shardingjdbc组件针对影子表的分库分表规则放入到spring环境中,这样,在进行链路压测时,所述分库分表规则读取组件就可以读取影子表的分库分表规则,然后基于读取到的分库分表规则构建所述影子表的分表。

可以理解的是,当影子表存在分表时,则将压测数据存储至关系型数据库时,仍然需要动态修改将压测数据存储至关系型数据库的sql语句,比如一条sql语句insertintoorder(mid,name)values(998,"zhangsan")(假设order表是经过分库分表后的,分片健是mid),如果这是一条将压测数据存储至数据库的语句,则在通过这条语句将压测数据存储至数据库时,则可以先通过mybatis提供的parameterhandler插件拦截这条语句,之后通过mybatis提供的preparedstatementhandler插件将这条语句更改成insertintobili_shadow_order(mid,name)values(998,"zhangsan"),之后shardingjdbc的shardingpreparedstatement组件会继续根据这条语句将压测数据存储至数据库中,由于所述分库分表规则读取组件已经读取到了分库分表规则,比如该分库分表规则为将数据存储至分表001中,则shardingpreparedstatement组件会根据分库分表规则将压测数据存储至影子分表bili_shadow_order_001中。

在另一实施方式中,考虑压测数据的数据量较大,若使用单独的影子表来存储压测数据会影响sql执行的性能,因此为了解决这个问题,全链路压测组件20还可以包括分库分表配置组件。

所述分库分表配置组件,用于将预先配置的分库分表的路由规则添加至预设的配置文件中,其中,所述路由规则用于确定所述压测数据存储的分表。

所述数据存储组件23,还用于拦截所述压测数据,并采用影子表技术与所述路由规则将所述压测数据存储至对应的分表中。

具体地,当使用shardingjdbc组件进行分库分表时,用户也可以使用springboot的方式去管理shardingjdbc组件的配置,在用户完成对shardingjdbc组件的配置后,可以通过分库分表配置组件将分库分表的路由规则添加至预设的配置文件中,这样,在进行链路压测时,所述分库分表配置组件即可以从配置文件中读取该分库分表的路由规则,并根据路由规则与影子表技术将压测数据存储至对应的分表中,比如,存储至影子分表bili_shadow_order_001中。

本实施例中,通过增设分库分表规则读取组件或分库分表配置组件可以使得在使用shardingjdbc组件进行分表时,由于未对影子表进行配置,使得压测数据不能存储至影子表的分表中。

作为示例,当数据库为以键值对形式进行数据存储的非关系型数据库时,比如,redis数据库,则可以采用影子键(影子key)技术将压测数据存储至redis数据库中预先配置的影子键中。其中,影子键和影子表类似,是基于真实key复制出的一套与真实key具有相同结构的key,其与真实key的用途不同,仅用于存储压测数据。在一实施方式中,为了将影子key和真实key加以区分,在配置影子key时,也可以在对影子key命名时添加特定的字符前缀或后缀来分区影子表key和真实key。

可以理解的是,在使用影子key技术将压测数据存储至非关系型数据库时,需要通过springdataredis来将压测数据存储至影子key中。在本实施例中,在使用springdataredis来将压测数据存储至影子key中,考虑到springdataredis没有很好的集成方式,可以采用aspectj的方式做增强。

进一步地,在本实施例中,为了便于全链路压测组件20用于链路压测中,本实施例中,可以将全链路压测组件20集成在springboot中,这样,在启动系统时,可以通过springboot提供的一套spi机制,读取meta-inf/spring.factories文件,从而完成全链路压测组件20与spring框架的整合。

在本实施例中,使用spi的方式与业务代码接入,能够无感知的将项目接入全链路压测组件20,当然springboot也提供了关闭的方法,只需要配置bili.full.chain.enable=false即可。

本申请实施例中,在进行链路压测时,通过全链路压测组件拦截数据请求,并对所述数据请求的请求头进行解析,以根据解析结果判定所述数据请求是否为压测请求;以及在判定所述数据请求为压测请求时,将所述压测请求中的压测标识注入至待压测的第一应用服务的当前的线程上下文中,使得压测标识透传至第一应用服务中。这样第一服务服务在对所述压测请求进行处理得到的压测数据就会具有真实的数据所不具有的压测标识,从而在对该压测数据进行存储时,可以全链路压测组件拦截所述压测数据,并采用影子技术将所述压测数据存储至数据库中,实现压测数据和真实数据的隔离。此外,在所述第一应用服务调用预设的第二应用服务对所述压测请求进行处理时,全链路压测组件还可以采用请求头的方式将所述压测标识透传至所述第二应用服务,这样,第二应用服务在对所述压测请求进行处理得到的压测数据也会具有真实的数据所不具有的压测标识,从而可以在对第二应用服务响应所述压测请求得到的压测数据进行存储时,也可以通过全链路压测组件拦截所述压测数据,并采用影子技术将该压测数据存储至数据库中,实现压测数据和真实数据的隔离。此外,在所述第一应用服务或所述第二应用服务通过异步的方式调用预设的第三应用服务对所述压测请求进行处理时,全链路压测组件,可以将所述压测标识透传至预设的broker服务器中,这样,当第三服务服务在对所述压测请求进行处理得到的压测数据也会具有真实的数据所不具有的压测标识,从而可以在对第三应用服务响应所述压测请求得到的压测数据进行存储时,也可以通过全链路压测组件拦截所述压测数据,并采用影子技术将该压测数据存储至数据库中,实现压测数据和真实数据的隔离。此外,本实施例中,在应用服务之间实现调用时,通过将压测标识进行透传,从而保证了链路的完整性。

图3示意性示出了根据本申请实施例的适用于全链路压测方法的流程图。所述方法可以运行在计算机设备中。如图3所示,所述方法可以包括步骤s30~s33,其中:

步骤s30,通过发压平台产生数据请求。

具体地,所述发压平台可以为jmeter,jmeter是apache组织开发的基于java的压力测试工具。用于对软件做压力测试,它最初被设计用于web应用测试,但后来扩展到其他测试领域。它可以用于测试静态和动态资源,例如静态文件、java小服务程序、cgi脚本、java对象、数据库、ftp服务器,等等。jmeter可以用于对服务器、网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能。

该数据请求可以为正常的数据请求,也可以为压测请求。正常的数据请求指的是会产生真实结果的数据请求,比如,一个真实的下单数据请求。压测请求是基于用户产生的真实数据而伪造出来的mock(模拟)数据,用于对应用服务进行压测的,其是一个不会产生真实结果的数据请求,而是会产生mock结果的数据请求,比如,一个模拟的下单数据请求,该模拟的下单请求指的是一个不会存在商家对该请求进行发货的下单数据请求。在本实施例中,压测请求是一个具有压测标识的数据请求,而正常的数据请求则没有压测标识。压测标识是用于区分是压测请求还是正常的数据请求的信息。在一具体实施方式中,压测标识定义如下:

bili_global_context:{"malltest":true,"verbose":true,"globalswitch":true}。

步骤s31,通过全链路压测组件拦截数据请求,并对所述数据请求的请求头进行解析,以根据解析结果判定所述数据请求是否为压测请求。

具体地,所述全链路组件为上述实施例中的全链路组件20,在本实施例中不再赘述。

本实施例中,在解析得到的请求头中包含有压测标识时,可以判定所述数据请求为压测请求,在解析得到的请求头中没有包含有压测标识时,则可以判定所述数据请求为正常的数据请求。

步骤s32,在判定所述数据请求为压测请求时,通过所述全链路压测组件将所述压测请求中的压测标识注入至待压测的第一应用服务的当前的第一线程上下文中。

步骤s33,通过所述第一应用服务根据所述第一线程上下文对所述压测请求进行响应得到第一压测数据。

具体地,第一应用服务在第一线程上下文中获取到压测标识后,可以根据该压测标识重建压测上下文。在本实施例中,为了便于后续进行功能扩展,重建的压测上下文可以抽象出来一个context类,这样若需要扩展tracecontext上下文等,只需要添加一些特殊的api,即可实现无缝升级。

在一示例性的实施方式中,参照图4,所述全链路压测方法还包括:

步骤s40,在所述第一应用服务调用预设的第二应用服务对所述压测请求进行处理时,通过所述全链路压测组件采用请求头的方式将包含所述压测标识的压测请求透传至所述第二应用服务。

所述第一应用服务可以通过feign客户端调用第二应用服务对压测请求进行处理,也可以通过resttemplate调用第二应用服务对压测请求进行处理。

在本实施例中,当通过feign客户端调用第二应用服务时,由于feign客户端本质上是使用http技术请求来调用应用服务的,因此,在通过feign客户端调用第二应用服务对所述压测请求进行处理时,可以将压测标识添加至调用请求的请求头中,从而实现将包含压测标识的压测请求透传至所述第二应用服务。当通过resttemplate调用第二应用服务时,由于resttemplate本质上也是基于http请技术来调用应用服务的,无非是封装了调用细节(具体实现可以是netty、httpclient、okhttp、jdkhttp等),因此,在通过resttemplate调用第二应用服务对所述压测请求进行处理时,也可以将压测标识添加至调用请求的请求头中,从而实现将包含压测标识的压测请求透传至所述第二应用服务。

步骤s41,通过所述全链路压测组件将所述压测标识注入至所述第二应用服务的当前的第二线程上下文中;

步骤s42,通过所述第二应用服务根据所述第二线程上下文对所述压测请求进行响应得到第二压测数据。

具体地,上述步骤s41-s42与步骤s32-s33类似,在本实施例中不再赘述。

在一示例性的实施方式中,参照图5,所述全链路压测方法还包括:

步骤s50,在所述第一应用服务或所述第二应用服务通过异步消息的方式调用预设的第三应用服务对所述压测请求进行处理时,通过所述全链路压测组件将包含所述压测标识的压测请求透传至预设的broker服务器中;

具体地,采用不同的异步消息方式调用第三应用服务对所述压测请求进行处理时,将包含压测标识的压测请求透传至broker服务器中的方式不同。

作为示例,当broker服务器为分布式数据同步系统databus中的服务器时,由于databus与java客户端不是很兼容,因此,为了解决兼容性问题,本实施例中的全链路压测组件在将压测标识透传至broker服务器中时,可以先通过protopuf插件对所述压测标识进行处理,得到处理后的压测标识,之后再将包含处理后的压测标识的压测请求通过消息的方式透传至预设的broker服务器中。

其中,protobuf插件(googleprotocolbuffers)是google提供一个具有高效的协议数据交换格式工具库(类似json),但相比于json,protobuf有更高的转化效率,时间效率和空间效率都是json的3-5倍,通过protopuf插件可以通过二进制字节的序列化方式对压测标识进行序列化,避免databus与java客户端不兼容。

作为示例,当broker服务器为rabbitmq中的服务器时,全链路压测组件在将包含压测标识的压测请求透传至broker服务器中时,可以无需对压测标识进行处理,而是直接将包含压测标识的压测请求通过消息的方式透传至broker服务器中。

作为示例,当采用线程池消息的方式将压测标识透传至broker服务器中,由于在线程池中,一个线程是会被多次复用的,这样每次的上下文环境可能都不会相同,因此,为了解决在将包含压测标识的压测请求透传至broker服务器时,因为上下文环境的不同可能导致压测标识透传出错的问题,本实施例中,全链路压测组件在将包含压测标识的压测请求透传至broker服务器中时,还可以通过对象映射器dapper对所述压测标识进行包装处理,得到包装后的压测标识,将包含所述包装后的压测标识的压测请求通过线程池的方式透传至预设的broker服务器中。

其中,dapper是一个简单的.net对象映射器,在速度方面具有"kingofmicroorm"的头衔,几乎与使用原始的ado.net数据读取器一样快。orm是一个对象关系映射器,它负责数据库和编程语言之间的映射。dapper通过扩展idbconnection提供一些有用的扩展方法去查询您的数据库。

步骤s51,通过所述第三应用服务监听所述broker服务器中的压测标识;

具体地,所述第三应用服务会通过监听程序实时或者定时监听broker服务器中是否存在压测标识。

步骤s52,在监听到所述压测标识时,通过所述全链路压测组件将所述压测标识注入至所述第三应用服务的当前的第三线程上下文中;

步骤s53,通过所述第三应用服务根据所述第三线程上下文对所述压测请求进行响应得到第三压测数据。

具体地,步骤s52-s53与步骤s32-s33类似,在本实施例中不再赘述。

在一示例性的实施方式中,所述全链路压测方法还包括:

通过所述全链路压测组件拦截所述第一压测数据,并采用影子技术将所述第一压测数据存储至数据库中;及/或

通过所述全链路压测组件拦截所述第二压测数据,并采用影子技术将所述第二压测数据存储至数据库中;及/或

通过所述全链路压测组件拦截所述第三压测数据,并采用影子技术将所述第三压测数据存储至数据库中。

具体地,在使用影子技术将压测数据存储至数据库时,不同类别的数据库,使用影子技术将压测数据存储至数据库的方式不同。需要说明的是,不同的压测数据存储至的数据库可以相同,也可以不同,在本实施例中不作限定。

作为示例,当数据库为关系型数据库,比如mysql数据库,则可以采用影子表技术将所述压测数据存储至mysql数据库中预先配置的影子表中。其中,影子表是基于真实表复制出的一套与真实表具有相同结构的表,其与真实表的用途不同,仅用于存储压测数据。在一实施方式中,为了将影子表和真实表加以区分,在配置影子表时,可以在对影子表命名时添加特定的字符前缀或后缀来分区影子表和真实表。

可以理解的是,在使用影子表技术将压测数据存储至关系型数据库时,则需要动态修改将压测数据存储至关系型数据库的sql(structuredquerylanguage,结构化查询语句)语句,比如,一条sql语句insertintouser(name)values("zhangsan"),如果这是一条将压测数据存储至数据库的语句,则在通过这条语句将压测数据存储至数据库时,则可以先通过mybatis提供的parameterhandler插件拦截这条语句,之后通过mybatis提供的preparedstatementhandler插件将这条语句更改成insertintobili_shadow_user(name)values("zhangsan"),从而使得该压测数据可以存储至影子表中。

本实施例中,通过将压测数据存储至影子表中,从而无需对真实表中存储的数据进行删改,以及可以避免用户可以查看到影子表的数据。

作为示例,当数据库为以键值对形式进行数据存储的非关系型数据库时,比如,redis数据库,则可以采用影子键(影子key)技术将压测数据存储至redis数据库中预先配置的影子键中。其中,影子键和影子表类似,是基于真实key复制出的一套与真实key具有相同结构的key,其与真实key的用途不同,仅用于存储压测数据。在一实施方式中,为了将影子key和真实key加以区分,在配置影子key时,也可以在对影子key命名时添加特定的字符前缀或后缀来分区影子表key和真实key。

可以理解的是,在使用影子key技术将压测数据存储至非关系型数据库时,需要通过springdataredis来将压测数据存储至影子key中。在本实施例中,在使用springdataredis来将压测数据存储至影子key中,考虑到springdataredis没有很好的集成方式,可以采用aspectj的方式做增强。

本申请实施例中,在进行链路压测时,通过全链路压测组件拦截数据请求,并对所述数据请求的请求头进行解析,以根据解析结果判定所述数据请求是否为压测请求;以及在判定所述数据请求为压测请求时,将所述压测请求中的压测标识注入至待压测的第一应用服务的当前的线程上下文中,使得压测标识透传至第一应用服务中。这样第一服务服务在对所述压测请求进行处理得到的压测数据就会具有真实的数据所不具有的压测标识,从而在对该压测数据进行存储时,可以全链路压测组件拦截所述压测数据,并采用影子技术将所述压测数据存储至数据库中,实现压测数据和真实数据的隔离。此外,在所述第一应用服务调用预设的第二应用服务对所述压测请求进行处理时,全链路压测组件还可以采用请求头的方式将所述压测标识透传至所述第二应用服务,这样,第二应用服务在对所述压测请求进行处理得到的压测数据也会具有真实的数据所不具有的压测标识,从而可以在对第二应用服务响应所述压测请求得到的压测数据进行存储时,也可以通过全链路压测组件拦截所述压测数据,并采用影子技术将该压测数据存储至数据库中,实现压测数据和真实数据的隔离。此外,在所述第一应用服务或所述第二应用服务通过异步的方式调用预设的第三应用服务对所述压测请求进行处理时,全链路压测组件,可以将所述压测标识透传至预设的broker服务器中,这样,当第三服务服务在对所述压测请求进行处理得到的压测数据也会具有真实的数据所不具有的压测标识,从而可以在对第三应用服务响应所述压测请求得到的压测数据进行存储时,也可以通过全链路压测组件拦截所述压测数据,并采用影子技术将该压测数据存储至数据库中,实现压测数据和真实数据的隔离。此外,本实施例中,在应用服务之间实现调用时,通过将压测标识进行透传,从而保证了链路的完整性。

参阅图6所示,是本申请全链路压测装置60一实施例的程序模块图。

本实施例中,所述全链路压测装置60包括一系列的存储于存储器上的计算机程序指令,当该计算机程序指令被处理器执行时,可以实现本申请各实施例的基于区块链的交易数据加密功能。在一些实施例中,基于该计算机程序指令各部分所实现的特定的操作,全链路压测装置60可以被划分为一个或多个模块。例如,在图6中,所述全链路压测装置60可以被分割成产生模块61、判定模块62、注入模块63、响应模块64。其中:

产生模块61,用于通过发压平台产生数据请求。

判定模块62,用于通过全链路压测组件拦截数据请求,并对所述数据请求的请求头进行解析,以根据解析结果判定所述数据请求是否为压测请求。

注入模块63,用于在判定所述数据请求为压测请求时,通过所述全链路压测组件将所述压测请求中的压测标识注入至待压测的第一应用服务的当前的第一线程上下文中。

响应模块64,用于通过所述第一应用服务根据所述第一线程上下文对所述压测请求进行响应得到第一压测数据。

在一示例性的实施方式中,全链路压测装置60还包括透传模块。

所述透传模块,用于在所述第一应用服务调用预设的第二应用服务对所述压测请求进行处理时,通过所述全链路压测组件采用请求头的方式将包含所述压测标识的压测请求透传至所述第二应用服务。

注入模块63,还用于通过所述全链路压测组件将所述压测标识注入至所述第二应用服务的当前的第二线程上下文中。

响应模块,还用于通过所述第二应用服务根据所述第二线程上下文对所述压测请求进行响应得到第二压测数据。

在一示例性的实施方式中,全链路压测装置60还包括监听模块。

所述透传模块,还用于在所述第一应用服务或所述第二应用服务通过异步消息的方式调用预设的第三应用服务对所述压测请求进行处理时,通过所述全链路压测组件将包含所述压测标识的压测请求透传至预设的broker服务器中。

所述监听模块,还用于通过所述第三应用服务监听所述broker服务器中的压测标识。

注入模块63,还用于在监听到所述压测标识时,通过所述全链路压测组件将所述压测标识注入至所述第三应用服务的当前的第三线程上下文中;

响应模块64,还用于通过所述第三应用服务根据所述第三线程上下文对所述压测请求进行响应得到第三压测数据。

在一示例性的实施方式中,全链路压测装置60还包括存储模块。

所述存储模块,用于通过所述全链路压测组件拦截所述第一压测数据,并采用影子技术将所述第一压测数据存储至数据库中;及/或通过所述全链路压测组件拦截所述第二压测数据,并采用影子技术将所述第二压测数据存储至数据库中;及/或通过所述全链路压测组件拦截所述第三压测数据,并采用影子技术将所述第三压测数据存储至数据库中。

本申请实施例中,本申请实施例中,在进行链路压测时,通过全链路压测组件拦截数据请求,并对所述数据请求的请求头进行解析,以根据解析结果判定所述数据请求是否为压测请求;以及在判定所述数据请求为压测请求时,将所述压测请求中的压测标识注入至待压测的第一应用服务的当前的线程上下文中,使得压测标识透传至第一应用服务中。这样第一服务服务在对所述压测请求进行处理得到的压测数据就会具有真实的数据所不具有的压测标识,从而在对该压测数据进行存储时,可以全链路压测组件拦截所述压测数据,并采用影子技术将所述压测数据存储至数据库中,实现压测数据和真实数据的隔离。此外,在所述第一应用服务调用预设的第二应用服务对所述压测请求进行处理时,全链路压测组件还可以采用请求头的方式将所述压测标识透传至所述第二应用服务,这样,第二应用服务在对所述压测请求进行处理得到的压测数据也会具有真实的数据所不具有的压测标识,从而可以在对第二应用服务响应所述压测请求得到的压测数据进行存储时,也可以通过全链路压测组件拦截所述压测数据,并采用影子技术将该压测数据存储至数据库中,实现压测数据和真实数据的隔离。此外,在所述第一应用服务或所述第二应用服务通过异步的方式调用预设的第三应用服务对所述压测请求进行处理时,全链路压测组件,可以将所述压测标识透传至预设的broker服务器中,这样,当第三服务服务在对所述压测请求进行处理得到的压测数据也会具有真实的数据所不具有的压测标识,从而可以在对第三应用服务响应所述压测请求得到的压测数据进行存储时,也可以通过全链路压测组件拦截所述压测数据,并采用影子技术将该压测数据存储至数据库中,实现压测数据和真实数据的隔离。此外,本实施例中,在应用服务之间实现调用时,通过将压测标识进行透传,从而保证了链路的完整性。

图7示意性示出了根据本申请实施例的适于实现全链路压测方法的计算机设备7的硬件架构示意图。本实施例中,计算机设备7是一种能够按照事先设定或者存储的指令,自动进行数值计算和/或信息处理的设备。例如,可以是平板电脑、笔记本电脑、台式计算机、机架式服务器、刀片式服务器、塔式服务器或机柜式服务器(包括独立的服务器,或者多个服务器所组成的服务器集群)等。如图7所示,计算机设备7至少包括但不限于:可通过系统总线相互通信链接存储器120、处理器121、网络接口123。其中:

存储器120至少包括一种类型的计算机可读存储介质,可读存储介质包括闪存、硬盘、多媒体卡、卡型存储器(例如,sd或dx存储器等)、随机访问存储器(ram)、静态随机访问存储器(sram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、可编程只读存储器(prom)、磁性存储器、磁盘、光盘等。在一些实施例中,存储器120可以是计算机设备7的内部存储模块,例如该计算机设备7的硬盘或内存。在另一些实施例中,存储器120也可以是计算机设备7的外部存储设备,例如该计算机设备7上配备的插接式硬盘,智能存储卡(smartmediacard,简称为smc),安全数字(securedigital,简称为sd)卡,闪存卡(flashcard)等。当然,存储器120还可以既包括计算机设备7的内部存储模块也包括其外部存储设备。本实施例中,存储器120通常用于存储安装于计算机设备7的操作系统和各类应用软件,例如全链路压测方法的程序代码等。此外,存储器120还可以用于暂时地存储已经输出或者将要输出的各类数据。

处理器121在一些实施例中可以是中央处理器(centralprocessingunit,简称为cpu)、控制器、微控制器、微处理器、或其它数据处理芯片。该处理器121通常用于控制计算机设备7的总体操作,例如执行与计算机设备7进行数据交互或者通信相关的控制和处理等。本实施例中,处理器121用于运行存储器120中存储的程序代码或者处理数据。

网络接口123可包括无线网络接口或有线网络接口,该网络接口123通常用于在计算机设备7与其它计算机设备之间建立通信链接。例如,网络接口123用于通过网络将计算机设备7与外部终端相连,在计算机设备7与外部终端之间的建立数据传输通道和通信链接等。网络可以是企业内部网(intranet)、互联网(internet)、全球移动通讯系统(globalsystemofmobilecommunication,简称为gsm)、宽带码分多址(widebandcodedivisionmultipleaccess,简称为wcdma)、4g网络、5g网络、蓝牙(bluetooth)、wi-fi等无线或有线网络。

需要指出的是,图7仅示出了具有部件120~122的计算机设备,但是应理解的是,并不要求实施所有示出的部件,可以替代的实施更多或者更少的部件。

在本实施例中,存储于存储器120中的全链路压测方法可以被分割为一个或者多个程序模块,并由一个或多个处理器(本实施例为处理器121)所执行,以完成本申请。

本申请实施例提供了一种计算机可读存储介质,计算机可读存储介质其上存储有计算机程序,计算机程序被处理器执行时实现实施例中的全链路压测方法的步骤。

本实施例中,计算机可读存储介质包括闪存、硬盘、多媒体卡、卡型存储器(例如,sd或dx存储器等)、随机访问存储器(ram)、静态随机访问存储器(sram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、可编程只读存储器(prom)、磁性存储器、磁盘、光盘等。在一些实施例中,计算机可读存储介质可以是计算机设备的内部存储单元,例如该计算机设备的硬盘或内存。在另一些实施例中,计算机可读存储介质也可以是计算机设备的外部存储设备,例如该计算机设备上配备的插接式硬盘,智能存储卡(smartmediacard,简称为smc),安全数字(securedigital,简称为sd)卡,闪存卡(flashcard)等。当然,计算机可读存储介质还可以既包括计算机设备的内部存储单元也包括其外部存储设备。本实施例中,计算机可读存储介质通常用于存储安装于计算机设备的操作系统和各类应用软件,例如实施例中的全链路压测方法的程序代码等。此外,计算机可读存储介质还可以用于暂时地存储已经输出或者将要输出的各类数据。

以上所描述的装置实施例仅仅是示意性的,其中作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到至少两个网络单元上。可以根据实际的需要筛选出其中的部分或者全部模块来实现本申请实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。

通过以上的实施方式的描述,本领域普通技术人员可以清楚地了解到各实施方式可借助软件加通用硬件平台的方式来实现,当然也可以通过硬件。本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(read-onlymemory,rom)或随机存储记忆体(randomaccessmemory,ram)等。

最后应说明的是:以上各实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述各实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的范围。


技术特征:

1.一种全链路压测组件,其特征在于,包括:

接收请求处理组件,用于拦截数据请求,并对所述数据请求的请求头进行解析,以根据解析结果判定所述数据请求是否为压测请求;

压测请求响应组件,还用于在判定所述数据请求为压测请求时,对所述压测请求进行响应得到压测数据;

数据存储组件,用于拦截所述压测数据,并采用影子技术将所述压测数据存储至数据库中。

2.根据权利要求1所述的全链路压测组件,其特征在于,在所述数据库为关系型数据库时,所述数据存储组件还用于拦截所述压测数据,并采用影子表技术将所述压测数据存储至所述关系型数据库中预先配置的影子表中;

在所述数据库为以键值对形式进行数据存储的非关系型数据库时,所述数据存储组件还用于拦截所述压测数据,并采用影子键技术将所述压测数据存储至所述非关系型数据库中预先配置的影子键中。

3.根据权利要求2所述的全链路压测组件,其特征在于,所述全链路压测组件还包括分库分表规则读取组件,用于读取预先配置的所述影子表的分库分表规则,并根据读取到的分库分表规则构建所述影子表的分表;

所述数据存储组件,还用于拦截所述压测数据,并采用影子表技术与所述分库分表规则将所述压测数据存储至对应的分表中。

4.根据权利要求2所述的全链路压测组件,其特征在于,所述全链路压测组件还包括:分库分表配置组件,用于将预先配置的分库分表的路由规则添加至预设的配置文件中,其中,所述路由规则用于确定所述压测数据存储的分表;

所述数据存储组件,还用于拦截所述压测数据,并采用影子表技术与所述路由规则将所述压测数据存储至对应的分表中。

5.根据权利要求1所述的全链路压测组件,其特征在于,所述压测请求响应组件,还用于将所述压测请求中的压测标识注入至待压测的第一应用服务的当前的线程上下文中,以使所述第一应用服务根据所述线程上下文对所述压测请求进行响应得到压测数据。

6.根据权利要求1所述的全链路压测组件,其特征在于,所述压测请求响应组件,还用于采用请求头的方式将包含压测标识的压测请求透传至第二应用服务,以使所述第二应用服务对所述压测请求进行响应得到压测数据。

7.根据权利要求1所述的全链路压测组件,其特征在于,所述压测请求响应组件,还用于采用异步消息的方式将包含压测标识的压测请求透传至预设的broker服务器中,以使第三应用服务从所述broker服务器中监听到所述压测标识时,对所述压测请求进行响应得到压测数据。

8.根据权利要求7所述的全链路压测组件,其特征在于,所述broker服务器为分布式数据同步系统databus中的服务器时,所述压测请求响应组件,还用于采用protopuf插件对所述压测标识进行处理,得到处理后的压测标识,将包含处理后的压测标识的压测请求通过消息的方式透传至预设的broker服务器中。

9.一种全链路压测方法,其特征在于,包括:

通过发压平台产生数据请求;

通过全链路压测组件拦截数据请求,并对所述数据请求的请求头进行解析,以根据解析结果判定所述数据请求是否为压测请求;

在判定所述数据请求为压测请求时,通过所述全链路压测组件将所述压测请求中的压测标识注入至待压测的第一应用服务的当前的第一线程上下文中;

通过所述第一应用服务根据所述第一线程上下文对所述压测请求进行响应得到第一压测数据。

10.根据权利要求9所述的全链路压测方法,其特征在于,所述全链路压测方法还包括:

在所述第一应用服务调用预设的第二应用服务对所述压测请求进行处理时,通过所述全链路压测组件采用请求头的方式将包含所述压测标识的压测请求透传至所述第二应用服务;

通过所述全链路压测组件将所述压测标识注入至所述第二应用服务的当前的第二线程上下文中;

通过所述第二应用服务根据所述第二线程上下文对所述压测请求进行响应得到第二压测数据。

11.根据权利要求10所述的全链路压测方法,其特征在于,所述全链路压测方法还包括:

在所述第一应用服务或所述第二应用服务通过异步消息的方式调用预设的第三应用服务对所述压测请求进行处理时,通过所述全链路压测组件将包含所述压测标识的压测请求透传至预设的broker服务器中;

通过所述第三应用服务监听所述broker服务器中的压测标识;

在监听到所述压测标识时,通过所述全链路压测组件将所述压测标识注入至所述第三应用服务的当前的第三线程上下文中;

通过所述第三应用服务根据所述第三线程上下文对所述压测请求进行响应得到第三压测数据。

12.根据权利要求11所述的全链路压测方法,其特征在于,所述全链路压测方法还包括:

通过所述全链路压测组件拦截所述第一压测数据,并采用影子技术将所述第一压测数据存储至数据库中;及/或

通过所述全链路压测组件拦截所述第二压测数据,并采用影子技术将所述第二压测数据存储至数据库中;及/或

通过所述全链路压测组件拦截所述第三压测数据,并采用影子技术将所述第三压测数据存储至数据库中。

13.一种全链路压测装置,其特征在于,包括:

产生模块,用于通过发压平台产生数据请求;

判定模块,用于通过全链路压测组件拦截数据请求,并对所述数据请求的请求头进行解析,以根据解析结果判定所述数据请求是否为压测请求;

注入模块,用于在判定所述数据请求为压测请求时,通过所述全链路压测组件将所述压测请求中的压测标识注入至待压测的第一应用服务的当前的第一线程上下文中;

响应模块,用于通过所述第一应用服务根据所述第一线程上下文对所述压测请求进行响应得到第一压测数据。

14.一种计算机设备,所述计算机设备,包括存储器、处理器以及存储在所述存储器上并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求9至12任一项所述的全链路压测方法的步骤。

15.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求9至12任一项所述的全链路压测方法的步骤。

技术总结
本申请公开了一种全链路压测组件、方法及装置。该压测组件包括:接收请求处理组件,用于拦截数据请求,并对所述数据请求的请求头进行解析,以根据解析结果判定所述数据请求是否为压测请求;压测请求响应组件,还用于在判定所述数据请求为压测请求时,对所述压测请求进行响应得到压测数据;数据存储组件,用于拦截所述压测数据,并采用影子技术将所述压测数据存储至数据库中。本申请可以实现压测数据和真实数据的隔离。

技术研发人员:阮仁照
受保护的技术使用者:上海哔哩哔哩科技有限公司
技术研发日:2020.12.17
技术公布日:2021.04.06

转载请注明原文地址:https://xbbs.6miu.com/read-21864.html