一种应用开发和测试的方法和装置
技术领域
本发明实施例涉及电子信息技术,尤其涉及一种应用开发和测试的方法和装置。
背景技术
在分布式服务化系统中,常常存在这样的业务场景,应用A向应用B发起一次远程过程调用,应用A的业务并无需等待应用B的返回结果,只需触发应用B的处理逻辑即可。但是在一般的服务化结构中,远程过程调用都是同步的,应用A必须等待应用B处理完成后才能接着执行,导致应用A的实时性降低,用户体验变差。现有技术中,解决这类问题的一个通用方案是:使用消息队列中间件作为两个应用之间消息(即远程过程调用请求)传递的中介,让应用之间的调用方式由同步变为异步。消息队列中间件作为消息存储转发的容器,为系统各个应用之间提供异步通信的机制,保证消息送达以及消息处理失败时的重试。在系统中引入了消息队列之后,虽能增强系统整体的稳定性和可靠性,却也为系统的开发和测试带来了更多的复杂度。
在开发测试基于消息队列进行异步化的应用时,通常有以下的测试方式:
(1)图1所示为现有技术中的第一种方式的调用链消息传递图。现有技术中,测试团队针对项目A和项目B,分别搭建一个测试环境:项目A测试环境101和项目B测试环境111。在项目A测试环境101中部署需要的应用:应用A 102,应用B 104和应用C 103。在项目B测试环境111中部署需要的应用:应用A 112,应用B 114和应用C 113。项目A测试环境101中有自己的消息队列中间件105。项目B测试环境111中有自己的消息队列中间件115。应用A 102、应用B 104和应用C 103通过项目A测试环境101中的消息队列中间件105中进行消息的生产和消费。消息队列中间件105中有设定的消息主题:Topic_AB 106和Topic_BC 107。应用A112、应用B 114和应用C 113通过项目B测试环境111中的消息队列中间件115进行消息的生产和消费。消息队列中间件115中有设定的消息主题:Topic_AB 116和Topic_BC 117。
(2)图2所示为现有技术的第二种方式的调用链消息传递图。现有技术中,测试团队针对项目A和项目B,分别搭建一个测试环境:项目A测试环境201和项目B测试环境202。在项目A测试环境201中部署需要的应用:应用A 203,应用B 204和应用C 205。在项目B测试环境202中部署需要的应用:应用A 206,应用B 207和应用C 208。项目A测试环境201和项目B测试环境202共用一个消息队列中间件209。消息队列中间件209中有设定的消息主题:Topic_AB_projA 210、Topic_BC_projA 211、Topic_AB_projB 212和Topic_BC_projB 213。各个应用把用到的主题和消费者分组配置在配置文件中,由测试人员在测试时修改这些配置,这样一来各个测试环境中相同的应用因为使用的消息主题不一样就不会相互干扰了。
现有技术第一种方式中,每启动一个项目就要部署一个消息队列中间件,既浪费机器资源又增加了测试的工作量。现有技术第二种方式克服了第一种方式的缺陷,不再需要部署独立的消息队列中间件,但需要各个应用遵守把用到的主题和消费者分组抽出到配置文件的约定。同时,上述两种方式都存在一个缺陷,就是需要在项目测试环境中部署所有应用,即使有些应用在此项目中并未有修改,增加了应用开发和测试环境的资源消耗,也增大了应用开发和测试环境的维护复杂度。
发明内容
本发明提供一种应用开发和测试的方法和装置,以节省应用开发和测试环境的资源消耗,降低应用开发和测试环境的维护复杂度。
第一方面,本发明实施例提供了一种应用开发和测试的方法,包括:
获取生产者发送的消息,其中,所述消息包括所述生产者获取的当前线程的测试环境标识,所述生产者所处环境包括稳定测试环境或项目测试环境,所述稳定测试环境包括第一客户端、全量的应用、消息队列中间件和zookeeper集群,所述项目测试环境包括第二客户端和所述全量的应用中在当前项目中需要修改的应用;
根据所述生产者和所述稳定测试环境中传递消息的调用链路径,确定所述消息队列中间件中传递所述消息对应的消息主题;
将所述消息放入确定的消息主题中,并转发给该消息主题对应的消费者;
在所述消费者所处环境的环境标识与所述测试环境标识相同,或者在所述消费者所处环境为稳定测试环境且所述zookeeper集群中不存在以所述测试环境标识、所述消息主题和所述消费者为路径的节点时,允许所述消费者消费所述消息。
第二方面,本发明实施例还提供了一种应用开发和测试的装置,包括:
消息获取模块,用于获取生产者发送的消息,其中,所述消息包括所述生产者获取的当前线程的测试环境标识,所述生产者所处环境包括稳定测试环境或项目测试环境,所述稳定测试环境包括第一客户端、全量的应用、消息队列中间件和zookeeper集群,所述项目测试环境包括第二客户端和所述全量的应用中在当前项目中需要修改的应用;
主题确定模块,用于根据所述生产者和所述稳定测试环境中传递消息的调用链路径,确定所述消息队列中间件中传递所述消息对应的消息主题;
消息转发模块,用于将所述消息放入确定的消息主题中,并转发给该消息主题对应的消费者;
消息消费模块,用于在所述消费者所处环境的环境标识与所述测试环境标识相同,或者在所述消费者所处环境为稳定测试环境且所述zookeeper集群中不存在以所述测试环境标识、所述消息主题和所述消费者为路径的节点时,允许所述消费者消费所述消息。
本发明通过先部署包含全量应用的稳定测试环境和包含当前项目中需要修改的应用的项目测试环境,然后获取生产者发送的包括当前线程的测试环境标识的消息,将消息放入确定的稳定测试环境和稳定测试环境共用的消息主题中,并转发给该消息主题对应的消费者,在消费者所处环境的环境标识与测试环境标识相同,或者在消费者所处环境为稳定测试环境且zookeeper集群中不存在以测试环境标识、消息主题和消费者为路径的节点时,允许消费者消费消息,保证了消息只会被目标应用处理,解决了现有技术中,需要在项目测试环境中部署所有应用,即使有些应用在此项目中并未有修改,增加应用开发和测试环境的资源消耗,也增大应用开发和测试环境的维护复杂度的问题,达到了节省应用开发和测试环境的资源消耗,降低应用开发和测试环境的维护复杂度的效果。
附图说明
图1是现有技术中的第一种方式的调用链消息传递图。
图2是现有技术中的第二种方式的调用链消息传递图。
图3是本发明实施例一中的一种应用开发和测试的方法的流程图。
图4是本发明实施例二中的一种应用开发和测试的方法的流程图。
图5是本发明实施例三中的一种应用开发和测试的方法的流程图。
图6是本发明实施例四中的一种应用开发和测试的方法的流程图。
图7是本发明实施例五中的一种应用开发和测试的方法的调用链消息传递图。
图8是本发明实施例六中的一种应用开发和测试的装置的结构示意图。
具体实施方式
下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部结构。
实施例一
图3为本发明实施例一提供的一种应用开发和测试的方法的流程图,本实施例可适用于电子信息技术领域,该方法可以由应用开发和测试的装置来执行,该装置可以采用硬件和/或软件的方式实现,一般可集成于计算机或服务器中,该方法包括:
步骤310、获取生产者发送的消息,其中,所述消息包括所述生产者获取的当前线程的测试环境标识,所述生产者所处环境包括稳定测试环境或项目测试环境,所述稳定测试环境包括第一客户端、全量的应用、消息队列中间件和zookeeper集群,所述项目测试环境包括第二客户端和所述全量的应用中在当前项目中需要修改的应用;
其中,获取生产者发送的消息,消息中包括所述生产者获取的当前线程的测试环境标识。测试环境包括稳定测试环境或项目测试环境。稳定测试环境或项目测试环境具有唯一确定的环境标识。通过在消息中添加测试环境标识,表明了此次进行应用开发和测试的处理流程是由来自哪个测试环境的客户端触发。
生产者至少包括:用于产生消息并发送消息到消息队列中间件的稳定测试环境中的第一客户端(第一web服务器)或应用,或者用于产生消息并发送消息到消息队列中间件的项目测试环境中的第二客户端(第二web服务器)或应用。
在进行应用开发和测试时,首先需要部署稳定测试环境。稳定测试环境中部署着可以接收测试请求的第一客户端、全量的应用、消息队列中间件和zookeeper集群等。每当根据业务需求,启动一个项目时,就为此项目部署一个单独的项目测试环境,此项目测试环境中部署有接收测试请求的第二客户端和在当前项目中需要修改的应用,项目测试环境和稳定测试环境共用稳定测试环境的消息队列中间件和zookeeper集群等。
消息队列技术是分布式应用间交换信息的一种技术。消息队列可驻留在内存或磁盘上,队列存储消息直到它们被应用程序读走。通过消息队列,应用程序可独立地执行,它们不需要知道彼此的位置、或在继续执行前不需要等待接收程序接收此消息。消息队列为构造以同步或异步方式实现的分布式应用提供了松耦合方法,可用在应用中以执行多种功能,比如要求服务、交换信息或异步处理等。其中,消息队列中间件是一种独立的系统软件或服务程序,分布式应用系统借助这种软件在不同的技术之间共享资源,管理计算资源和网络通讯,如ActiveMQ或RocketMQ等。消息队列中间件在计算机系统中是一个关键软件,它能实现应用的互连和互操作性,能保证系统的安全、可靠、高效的运行。消息队列中间件位于用户应用和操作系统及网络软件之间,它为应用提供了公用的通信手段,并且独立于网络和操作系统。中间件为开发者提供了公用于所有环境的应用程序接口,当应用程序中嵌入其函数调用,它便可利用其运行的特定操作系统和网络环境的功能,为应用执行通信功能。消息队列中间件是消息的安全存放地,消息队列中间件存储消息直到它被应用程序处理。如果没有消息中间件完成信息交换,应用开发者为了传输数据,必须要学会如何用网络和操作系统软件的功能,编写相应的应用程序来发送和接收信息,且交换信息没有标准方法,每个应用必须进行特定的编程从而和多平台、不同环境下的一个或多个应用通信。
zookeeper集群是分布式的,开放源码的分布式应用程序协调服务系统,为分布式应用提供一致性服务。zookeeper集群的功能包括:配置维护、名字服务、分布式同步、组服务等。zookeeper集群主要用来解决分布式集群中应用系统的一致性问题,能提供基于类似于文件系统的目录节点树方式的数据存储。除了数据存储,zookeeper集群还可以用来维护和监控所存储的数据的状态变化。
生产者交由消息队列中间件传输的数据为消息。用户的各种类型的数据文件,某个应用向其它应用发出的处理请求等都可以作为消息。消息由两部分组成:第一,消息描述符(Message Discription或Message Header),用于描述消息的特征,如:消息的优先级、生命周期、消息(IdIDentity)等;第二,消息体(Message Body),即用户数据部分。在消息队列中间件中,消息分为两种类型,非永久性(non-persistent)消息和永久性(persistent)消息。非永久性消息是存储在内存中的,是为了提高性能而设计的,当系统掉电或消息队列中间件管理器重新启动时,将不可恢复。当用户对消息的可靠性要求不高,而侧重系统的性能表现时,可以采用该种类型的消息,如:当发布股票信息时,由于股票信息是不断更新的,可能每若干秒就会发布一次,新的消息会不断覆盖旧的消息。永久性消息是存储在硬盘上,并且纪录数据日志的,具有高可靠性,在网络和系统发生故障等情况下都能确保消息不丢、不重。此外,在消息队列中间件中,还有逻辑消息和物理消息的概念。利用逻辑消息和物理消息,我们可以将大消息进行分段处理,也可以将若干个本身完整的消息在应用逻辑上归为一组进行处理。消息队列中间件本身还具有一些其他特性:第一,消费模式中的通用消费模型:同一个消费者组中的消费者均分订阅主题的消息,不同的消费者组之间并行消费;第二,每一条消息中除了消息体内容,还能按照一定形式设置一些附加属性。
步骤320、根据所述生产者和所述稳定测试环境中传递消息的调用链路径,确定所述消息队列中间件中传递所述消息对应的消息主题;
根据所述生产者和稳定测试环境中传递消息的调用链路径,在消息队列中间件中,确定获取的生产者发送的消息对应的消息主题。
其中,消息主题由用户定义并在消息队列中间件中配置,根据稳定测试环境中的调用链路径设定。生产者发送消息到消息队列中间件的某个消息主题下,消费者从某个消息主题获取并消费消息。稳定测试环境和项目测试环境共用同一消息主题。
步骤330、将所述消息放入确定的消息主题中,并转发给该消息主题对应的消费者;
将获取的生产者发送的消息放入消息队列中间中的确定的消息主题中,消息队列中间件将获取的生产者发送的消息转发给该消息主题对应的消费者。消费者用于从消息队列中间件获取消息并进行消费。
其中,消费者至少包括:用于接收消息队列中间件发送的消息的稳定测试环境中的应用,或者用于接收消息队列中间件发送的消息的项目测试环境中的应用。
步骤340、在所述消费者所处环境的环境标识与所述测试环境标识相同,或者在所述消费者所处环境为稳定测试环境且所述zookeeper集群中不存在以所述测试环境标识、所述消息主题和所述消费者为路径的节点时,允许所述消费者消费所述消息。
其中,消费者所处环境包括稳定测试环境或项目测试环境。
在所述消费者所处环境的环境标识与所述测试环境标识相同,即消费者所处环境的环境标识与所述测试环境标识都是稳定测试环境的环境标识,或者消费者所处环境的环境标识与所述测试环境标识都是项目测试环境的环境标识的情况下,允许所述消费者消费所述消息。
在所述消费者所处环境的环境标识与所述测试环境标识不相同,所述消费者所处环境为稳定测试环境时,判断zookeeper集群中是否存在以所述测试环境标识、所述消息主题和所述消费者为路径的节点。如果zookeeper集群中存在以所述测试环境标识、所述消息主题和所述消费者为路径的节点,说明在测试环境标识所指的环境即项目测试环境中也有相同应用消费所述消息,不允许所述消费者消费所述消息。如果zookeeper集群中不存在以所述测试环境标识、所述消息主题和所述消费者为路径的节点,说明在测试环境标识所指的环境中没有相同应用消费所述消息,允许所述消费者消费所述消息。保证一条消息只会被其中一个应用真正处理。在由来自项目测试环境的测试请求触发的异步的调用链路径的各个环节中,如果该环节的应用在项目测试环境中有部署,则由项目测试环境中的应用来处理消息,如果该环节的应用在项目测试环境中没有部署,由稳定测试环境中的应用来处理消息。
本发明实施例通过先部署包含全量应用的稳定测试环境和包含当前项目中需要修改的应用的项目测试环境,然后获取生产者发送的包括当前线程的测试环境标识的消息,将消息放入确定的稳定测试环境和稳定测试环境共用的消息主题中,并转发给该消息主题对应的消费者,在消费者所处环境的环境标识与测试环境标识相同,或者在消费者所处环境为稳定测试环境且zookeeper集群中不存在以测试环境标识、消息主题和消费者为路径的节点时,允许消费者消费消息,保证了消息只会被目标应用处理,解决了现有技术中,需要在项目测试环境中部署所有应用,即使有些应用在此项目中并未有修改,增加应用开发和测试环境的资源消耗,也增大应用开发和测试环境的维护复杂度的问题,达到了节省应用开发和测试环境的资源消耗,降低应用开发和测试环境的维护复杂度的效果。
实施例二
图4是本发明实施例二中的一种应用开发和测试的方法的流程图。本方法在实施例一提供的方法的基础上,进一步的,在获取生产者发送的消息之前,还包括:
在生产者生成所述消息时,判断生产者所处的环境是否是开发测试环境;
如果是,则从当前线程上下文中获取测试环境标识,作为当前线程的测试环境标识;
将所述当前线程的测试环境标识加入到所述消息的附加属性中,并发送所述消息。
进一步的,在允许所述消费者消费所述消息之前,还包括:
根据所述消息,设置当前线程的线程上下文的测试环境标识。
参见图4所示,所述应用开发和测试的方法,包括:
步骤410、在生产者生成所述消息时,判断生产者所处的环境是否是开发测试环境;
其中,所述开发测试环境包括稳定测试环境或项目测试环境。
生产者所处的环境是开发测试环境,即生产者在稳定测试环境或者项目测试环境中,表明是在进行应用开发和测试的过程中,按照应用开发和测试方法进行下一步处理。生产者所处的环境不是开发测试环境,即生产者不在稳定测试环境或者项目测试环境中,表明不是在进行应用开发和测试的过程中,不按照应用开发和测试方法进行下一步处理。
步骤420、如果是,则从当前线程上下文中获取测试环境标识,作为当前线程的测试环境标识;
在消息发送逻辑中,测试环境标识要先从线程上下文中获取,不是调用链路径的起始端的应用,会先获取消息,在对消息实际处理之前,会取出消息中传递过来的测试环境标识,并设置线程上下文的相关变量,之后再作为生产者发送的消息时,会取出线程上下文的测试环境标识设置到消息附加属性中,发送出去。
进一步的,从当前线程上下文中获取测试环境标识,作为当前线程的测试环境标识,包括:
在所述当前线程的线程上下文中的测试环境标识为空时,获取所述生产者所处环境的环境标识,作为所述当前线程的测试环境标识。
在消息发送逻辑中,测试环境标识要先从线程上下文中获取,获取为空方才从身处的环境获取。当生产者为当前测试环境中的客户端,由于处于传递消息的调用链路径的起始端,线程上下文未进行设置,所以线程上下文中测试环境标识为空,需要从身处的测试环境获取环境标识作为测试环境标识。
步骤430、将所述当前线程的测试环境标识加入到所述消息的附加属性中,并发送所述消息;
将获取到的当前线程的测试环境标识加入到所述消息的附加属性中,并发送所述消息,表明了此次进行应用开发和测试的处理流程是由来自哪个测试环境的客户端触发。测试环境包括稳定测试环境或项目测试环境。获取消息的消费者,根据所处环境的环境标识与所述测试环境标识进行比较来确定是否进行消费。在所述消费者所处环境的环境标识与所述测试环境标识相同,或者在所述消费者所处环境为稳定测试环境且所述zookeeper集群中不存在以所述测试环境标识、所述消息主题和所述消费者为路径的节点时,允许所述消费者消费所述消息。从而保证应用开发和测试过程按照目标调用链路径进行。
步骤440、获取生产者发送的消息,其中,所述消息包括所述生产者获取的当前线程的测试环境标识,所述生产者所处环境包括稳定测试环境或项目测试环境,所述稳定测试环境包括第一客户端、全量的应用、消息队列中间件和zookeeper集群,所述项目测试环境包括第二客户端和所述全量的应用中在当前项目中需要修改的应用;
步骤450、根据所述生产者和所述稳定测试环境中传递消息的调用链路径,确定所述消息队列中间件中传递所述消息对应的消息主题;
步骤460、将所述消息放入确定的消息主题中,并转发给该消息主题对应的消费者;
步骤470、根据所述消息,在允许所述消费者消费所述消息之前,设置当前线程的线程上下文的测试环境标识;
其中,从获取的消息中取出测试环境测试标识,在允许所述消费者消费所述消息之前,设置当前线程的线程上下文的测试环境标识。
步骤480、在所述消费者所处环境的环境标识与所述测试环境标识相同,或者在所述消费者所处环境为稳定测试环境且所述zookeeper集群中不存在以所述测试环境标识、所述消息主题和所述消费者为路径的节点时,允许所述消费者消费所述消息。
本发明实施例通过先判断生产者所处的环境是否是开发测试环境,从当前线程上下文中获取测试环境标识,作为当前线程的测试环境标识,将当前线程的测试环境标识加入到消息的附加属性中并发送消息,根据消息,在允许所述消费者消费消息之前,设置当前线程的线程上下文的测试环境标识,从而保证应用开发和测试过程按照目标调用链路径进行,解决了现有技术中,不能按照目标调用链路径进行应用开发和测试问题,达到了保证应用开发和测试过程按照目标调用链路径进行的效果。
实施例三
图5是本发明实施例三中的一种应用开发和测试的方法的流程图。本方法在实施例一提供的方法的基础上,进一步的,在获取生产者发送的消息之前,还包括:
在所述消费者所处环境为项目测试环境时,获取稳定测试环境中与所述消费者对应的消费者的消费者组名;
在所述对应的消费者的消费者组名后面添加后缀,作为所述消费者的消费者组名,其中,所述后缀为所述项目测试环境的环境标识;
根据所述项目测试环境的环境标识、所述消息主题和所述消费者确定待创建的节点的路径;
根据所述路径,在zookeeper集群中创建所述节点;
执行所述消费者对所述消息的订阅。
参见图5所示,所述应用开发和测试的方法,包括:
步骤510、在所述消费者所处环境为项目测试环境时,获取稳定测试环境中与所述消费者对应的消费者的消费者组名;
其中,消费者组,多个消费者共同消费一个消息主题下的消息,每个消费者消费部分消息,这些消费者就组成一个分组,拥有同一个分组名称,通常也称为消费者集群。这个分组名称即为消费者组名。稳定测试环境中的应用作为消费者时,有对应消费者组名。
由于项目测试环境中部署的应用为稳定测试环境中的对应应用进行修改得到的,所以作为消费者的应用所处环境为项目测试环境时,在稳定测试环境中的对应应用即为该消费者对应的消费者。
步骤520、在所述对应的消费者的消费者组名后面添加后缀,作为所述消费者的消费者组名,其中,所述后缀为所述项目测试环境的环境标识;
其中,通过修改项目测试环境中应用使用的消费者组名,在对应的稳定测试环境中的消费者的消费者组名后面添加后缀,作为项目测试环境的消费者的消费者组名,使得稳定测试环境和项目测试环境中的应用都能获取到对应的消费主题中的消息。
步骤530、根据所述项目测试环境的环境标识、所述消息主题和所述消费者确定待创建的节点的路径;
根据所述项目测试环境的环境标识、所述消息主题和所述消费者确定在zookeeper集群中待创建的节点的路径,通过节点的路径来记录在所述项目测试环境中所述消费者消费所述消息主题发送的消息。
zookeeper的节点是通过像树一样的结构来进行维护的,并且每一个节点通过路径来标示以及访问。除此之外,每一个节点还拥有自身的一些信息,包括:数据、数据长度、创建时间、修改时间等等。从这样一类既含有数据,又作为路径表标示的节点的特点中,可以看zookeeper的节点既可以被看做是一个文件,又可以被看做是一个目录,它同时具有二者的特点。用户可以根据需要创建节点和获取已创建的节点,读取节点包含的信息。
步骤540、根据所述路径,在zookeeper集群中创建所述节点;
其中,根据所述路径,在zookeeper集群中创建节点,通过查看节点路径,可以知道在所述项目测试环境中是否存在所述消费者来消费所述消息主题发送的消息。
在zookeeper集群中创建节点的过程中,采用静态注册的方式进行注册,保证了即使项目测试环境的应用因为各种原因崩溃,消息依然会路由到项目测试环境,从而暴露项目测试环境中相关应用的问题,使项目测试环境的相关应用的异常能够在测试阶段暴露出来。
步骤550、执行所述消费者对所述消息的订阅;
其中,消费者订阅消息之后,每当有消息被生产者发送,并进入其订阅的消息主题,消息就会被转发给消费者。
步骤560、获取生产者发送的消息,其中,所述消息包括所述生产者获取的当前线程的测试环境标识,所述生产者所处环境包括稳定测试环境或项目测试环境,所述稳定测试环境包括第一客户端、全量的应用、消息队列中间件和zookeeper集群,所述项目测试环境包括第二客户端和所述全量的应用中在当前项目中需要修改的应用;
步骤570、根据所述生产者和所述稳定测试环境中传递消息的调用链路径,确定所述消息队列中间件中传递所述消息对应的消息主题;
步骤580、将所述消息放入确定的消息主题中,并转发给该消息主题对应的消费者;
步骤590、在所述消费者所处环境的环境标识与所述测试环境标识相同,或者在所述消费者所处环境为稳定测试环境且所述zookeeper集群中不存在以所述测试环境标识、所述消息主题和所述消费者为路径的节点时,允许所述消费者消费所述消息。
本发明实施例通过在获取生产者发送的消息之前,在所述消费者所处环境为项目测试环境时,获取稳定测试环境中与所述消费者对应的消费者的消费者组名,在消费者组名后面添加后缀,作为所述消费者的消费者组名,并根据所述项目测试环境的环境标识、所述消息主题和所述消费者确定待创建的节点的路径,在zookeeper集群中,采用静态注册的方式进行注册创建所述节点,之后执行消费者对消息的订阅,从而保证稳定测试环境和项目测试环境中的应用都能获取到对应的消息主题中的消息,通过节点的路径来记录在所述项目测试环境中所述消费者消费所述消息主题发送的消息,即使项目测试环境的应用因为各种原因崩溃,消息依然会到项目测试环境,从而暴露项目环境相关应用的问题,解决了现有技术中,不能记录项目测试环境中消费者消费消息主题发送的消息的信息的问题,应用因为各种原因崩溃后测试不能进行的问题,达到了稳定测试环境和项目测试环境中的应用共享同一消息主题的消息,对应用开发和测试过程的重要信息进行记录,保证应用的异常能够在测试阶段充分暴露出来的技术效果。
实施例四
图6是本发明实施例四中的一种应用开发和测试的方法的流程图。本方法在实施例一提供的方法的基础上,进一步的,在所述消费者所处环境的环境标识与所述测试环境标识相同,或者在所述消费者所处环境为稳定测试环境且zookeeper集群中不存在以所述项目测试环境的环境标识、所述消息主题和所述消费者为路径的节点时,允许所述消费者消费所述消息,包括:
获取所述消费者所处环境的环境标识;
在所述环境标识与所述测试环境标识相同时,允许所述消费者消费所述消息;
在所述环境标识与所述测试环境标识不同时,根据所述环境标识,判断所述消费者所处环境是否为稳定测试环境;
如果所述消费者所处环境是稳定测试环境,判断zookeeper集群中是否存在以所述测试环境标识、所述消息主题和所述消费者为路径的节点;
如果不存在,则允许所述消费者消费所述消息;如果存在,则确定所述测试环境标识所指向的项目测试环境中也有相同的消费者订阅所述消息,并拒绝所述消费者消费所述消息。
参见图6所示,所述应用开发和测试的方法,包括:
步骤610、获取生产者发送的消息,其中,所述消息包括所述生产者获取的当前线程的测试环境标识,所述生产者所处环境包括稳定测试环境或项目测试环境,所述稳定测试环境包括第一客户端、全量的应用、消息队列中间件和zookeeper集群,所述项目测试环境包括第二客户端和所述全量的应用中在当前项目中需要修改的应用;
步骤620、根据所述生产者和所述稳定测试环境中传递消息的调用链路径,确定所述消息队列中间件中传递所述消息对应的消息主题;
步骤630、将所述消息放入确定的消息主题中,并转发给该消息主题对应的消费者;
步骤640、获取所述消费者所处环境的环境标识;
其中,消费者所处环境包括稳定测试环境或项目测试环境,所处环境的环境标识唯一标识此环境。
步骤650、在所述环境标识与所述测试环境标识相同时,允许所述消费者消费所述消息;
其中,环境标识与测试环境标识相同时,即消费者所处环境的环境标识与所述测试环境标识都是稳定测试环境的环境标识,或者消费者所处环境的环境标识与所述测试环境标识都是项目测试环境的环境标识的情况下,表明按照调用链路径,该环境中的消费者应该对所述消息进行消费。
步骤660、在所述环境标识与所述测试环境标识不同时,根据所述环境标识,判断所述消费者所处环境是否为稳定测试环境;
其中,在所述消费者所处环境的环境标识与所述测试环境标识不相同时,若所述消费者所处环境为稳定测试环境时,需要进一步判断是否允许稳定测试环境中的消费者对消息进行消费;若所述消费者所处环境为项目测试环境时,消费者不对消息进行消费,这种情况存在于具有多个不同的项目测试环境时,消费者所处环境为其中的一个项目测试环境,而测试环境标识所标识的环境为另外一个项目测试环境。
步骤670、如果所述消费者所处环境是稳定测试环境,判断zookeeper集群中是否存在以所述测试环境标识、所述消息主题和所述消费者为路径的节点;
其中,进行判断时,通过查看节点路径,可以知道在所述项目测试环境中是否存在所述消费者可以消费所述消息主题发送的消息。
步骤680、如果不存在,则允许所述消费者消费所述消息;如果存在,则确定所述测试环境标识所指向的项目测试环境中也有相同的消费者订阅所述消息,并拒绝所述消费者消费所述消息。
其中,若节点路径不存在,可以知道在所述项目测试环境中不存在所述消费者消费所述消息主题发送的消息,所以稳定测试环境中的消费者对消息进行消费,即当发现项目测试环境不存在对应的应用时,稳定测试环境中的对应应用会对信息进行处理。若节点路径存在,可以知道在所述项目测试环境中存在所述消费者消费所述消息主题发送的消息,所以稳定测试环境中的消费者不对消息进行消费。
本发明实施例通过获取消费者所处环境的环境标识,根据环境标识、获取的测试环境标识和zookeeper集群中的节点,确定是否允许消费者消费消息,从而保证该环节的应用在项目测试环境中有部署,则由项目测试环境中的应用处理消息,如果该环节的应用在项目测试环境中没有部署,则由稳定测试环境中的应用实例来处理消息,这使得每个项目测试环境仅仅只需要部署本项目中有改动的应用,就可以进行测试。解决了现有技术中,需要在项目测试环境中部署所有应用进行测试,即使有些应用在此项目中并未有修改,达到了降低项目环境的部署成本的效果。
实施例五
图7所示为本发明实施例五提供的一种应用开发和测试的方法的调用链消息传递图。本实施例是在上述实施例的基础上的一个优选实例,在进行应用开发和测试时,首先需要部署稳定测试环境701。稳定测试环境701中部署着可以接收测试请求的第一客户端702、全量的应用(应用A 703,应用B 704,和应用C 705)、消息队列中间件706等。消息队列中间件706中有设定的消息主题:Topic_客户端707、Topic_AB 708和Topic_BC 709。根据业务需求,为项目部署一个单独的项目测试环境710。此项目测试环境710中部署有接收测试请求的第二客户端711和在当前项目中需要修改的应用B 712。
在业务流程中,调用链路径为客户端至应用A至应用B至应用C,其中第一客户端702和第二客户端702向应用A 703传递消息使用的消息主题为Topic_客户端707,应用A703向应用B 704和应用B 712传递消息使用的消息主题为Topic_AB 708,应用B704和应用B712向应用C 705传递消息使用的消息主题为Topic_BC 709。当前项目需要修改应用B,而应用A和应用C不需要修改。对于来自测试环境的测试请求,其调用链路为第一客户端702至稳定测试环境701中的应用A 703至稳定测试环境701中的应用B 704至稳定测试环境701中的应用C 705,即图7中的虚线。对于来自项目测试环境710的测试请求,其调用链路为第二客户端711至稳定测试环境710中的应用A 703至项目测试环境710中的应用B 712至稳定测试环境710中的应用C 705,即图7中的实线。
项目测试环境710的测试调用链路的具体工作过程为:
项目测试环境710的第二客户端711接收测试请求后,发送包含以项目测试环境710的环境标识(projX)作为测试环境标识的消息至消息队列中间件706的对应的消息主题(Topic_客户端707)中。稳定测试环境701中的应用A 703收到这条消息,因项目测试环境710中没有部署应用A,稳定测试环境701中的应用A 703会发现zookeeper集群中不存在/test_support/projX/mq_consumer_register/Topic_客户端/A的节点,稳定测试环境701中的应用A 703选择消费该消息。稳定测试环境701中的应用A 703在消费消息之前设置线程上下文的测试环境标识为projX,之后在发送消息至Topic_AB 708时,会取出线程上下文的测试环境标识(projX)设置到消息附加属性中,发送出去。稳定测试环境701中的应用B704和项目测试环境710中的应用B 712都会拉取到Topic_AB 708中的消息。稳定测试环境701中的应用B 704取出消息的测试环境标识(projX),发现所处环境的环境标识(stable)与测试环境标识(projX)不相同,并且发现zookeeper中存在/test_support/projX/mq_consumer_register/Topic_客户端/A的节点,于是不会处理这条消息。而项目测试环境710中的应用B 712发现消息的测试环境标识(projX)和所处环境的环境标识(projX)相同,于是消费该消息。这便等同于只有项目测试环境710中的应用B 712收到了消息。之后应用B712到稳定测试环境701中的应用C 705的消息传递原理与以上所述相同。
本发明实施例通过先部署包含全量应用的稳定测试环境和包含当前项目中需要修改的应用的项目测试环境,然后获取生产者发送的包括当前线程的测试环境标识的消息,将消息放入确定的稳定测试环境和稳定测试环境共用的消息主题中,并转发给该消息主题对应的消费者,在消费者所处环境的环境标识与测试环境标识相同,或者在消费者所处环境为稳定测试环境且zookeeper集群中不存在以测试环境标识、消息主题和消费者为路径的节点时,允许消费者消费消息,保证了消息只会被目标应用处理,解决了现有技术中,需要在项目测试环境中部署所有应用,即使有些应用在此项目中并未有修改,增加应用开发和测试环境的资源消耗,也增大应用开发和测试环境的维护复杂度的问题,达到了节省应用开发和测试环境的资源消耗,降低应用开发和测试环境的维护复杂度的效果。
实施例六
图8所示为本发明实施例六提供的一种应用开发和测试的装置的结构示意图,本实施例可适用于电子信息技术领域,该应用开发和测试的装置包括:
消息获取模块810,主题确定模块820,消息转发模块830和消息消费模块840。
消息获取模块810,用于获取生产者发送的消息,其中,所述消息包括所述生产者获取的当前线程的测试环境标识,所述生产者所处环境包括稳定测试环境或项目测试环境,所述稳定测试环境包括第一客户端、全量的应用、消息队列中间件和zookeeper集群,所述项目测试环境包括第二客户端和所述全量的应用中在当前项目中需要修改的应用;主题确定模块820,用于根据所述生产者和所述稳定测试环境中传递消息的调用链路径,确定所述消息队列中间件中传递所述消息对应的消息主题;消息转发模块830,用于将所述消息放入确定的消息主题中,并转发给该消息主题对应的消费者;消息消费模块840,用于在所述消费者所处环境的环境标识与所述测试环境标识相同,或者在所述消费者所处环境为稳定测试环境且所述zookeeper集群中不存在以所述测试环境标识、所述消息主题和所述消费者为路径的节点时,允许所述消费者消费所述消息。
本发明实施例通过先部署包含全量应用的稳定测试环境和包含当前项目中需要修改的应用项目测试环境,然后获取生产者发送的包括当前线程的测试环境标识的消息,将消息放入确定的稳定测试环境和稳定测试环境共用的消息主题中,并转发给该消息主题对应的消费者,在消费者所处环境的环境标识与测试环境标识相同,或者在消费者所处环境为稳定测试环境且zookeeper集群中不存在以测试环境标识、消息主题和消费者为路径的节点时,允许消费者消费消息,保证了消息只会被目标应用处理,解决了现有技术中,需要在项目测试环境中部署所有应用,即使有些应用在此项目中并未有修改,增加应用开发和测试环境的资源消耗,也增大应用开发和测试环境的维护复杂度的问题,达到了节省应用开发和测试环境的资源消耗,降低应用开发和测试环境的维护复杂度的效果。
在上述实施例的基础上,优选是,还包括:
生产者环境判断模块,用于在生产者生成所述消息时,判断生产者所处的环境是否是开发测试环境;
生产者环境标识获取模块,用于如果是,则从当前线程上下文中获取测试环境标识,作为当前线程的测试环境标识;
生产者环境标识添加模块,用于将所述当前线程的测试环境标识加入到所述消息的附加属性中,并发送所述消息。
进一步的,所述生产者环境标识获取模块包括:
生产者环境标识获取单元,用于在所述当前线程的线程上下文中的测试环境标识为空时,获取所述生产者所处环境的环境标识,作为所述当前线程的测试环境标识。
进一步的,还包括:
消费者组名获取模块,用于在所述消费者所处环境为项目测试环境时,获取稳定测试环境中与所述消费者对应的消费者的消费者组名;
后缀添加模块,用于在所述对应的消费者的消费者组名后面添加后缀,作为所述消费者的消费者组名,其中,所述后缀为所述项目测试环境的环境标识;
节点路径确定模块,用于根据所述项目测试环境的环境标识、所述消息主题和所述消费者确定待创建的节点的路径;
节点创建模块,用于根据所述路径,在zookeeper集群中创建所述节点;
消息订阅模块,用于执行所述消费者对所述消息的订阅。
进一步的,所述消息消费模块包括:
消费者环境标识获取单元,用于获取所述消费者所处环境的环境标识;
消费者环境标识比较单元,用于在所述环境标识与所述测试环境标识相同时,允许所述消费者消费所述消息;
消费者环境判断单元,用于在所述环境标识与所述测试环境标识不同时,根据所述环境标识,判断所述消费者所处环境是否为稳定测试环境;
消费者节点判断单元,用于如果所述消费者所处环境是稳定测试环境,判断zookeeper集群中是否存在以所述测试环境标识、所述消息主题和所述消费者为路径的节点;
消费者消费单元,用于则允许所述消费者消费所述消息;如果存在,则确定所述测试环境标识所指向的项目测试环境中也有相同的消费者订阅所述消息,并拒绝所述消费者消费所述消息。
进一步的,还包括:
环境标识设置模块,用于在允许所述消费者消费所述消息之前,根据所述消息,设置当前线程的线程上下文的测试环境标识。
上述应用开发和测试的装置可执行本发明任意实施例所提供的应用开发和测试的方法,具备执行方法相应的功能模块和有益效果。
注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。