Tsung源码分析(三):Tsung插件式协议支持

 

Websocket for Tsung一文中有提到如何扩展Tsung支持自有协议,这里所说的插件式协议支持是指上文中提到的第一种方式:作为session type,本文说明下它的实现原理。

 

         tsung的配置文件中会有sessions这一节,主要配置会话进程跟测试服务器之间的交互过程。sessions可包含多个session,每个session有不同的概率,在会话进程选择session时,会根据这个概率来决定使用哪个session

         每个session都有个type属性,定义与测试服务器交互时使用的协议(应用层协议,如HTTPXMMP等)。Tsung本身是通过一种插件式的方式来支持不同的协议的,所以可以很方便的扩展。

TSUNG_ROOT/src/tsung/ts_plugin.erl定义了支持一个协议所需要实现的接口。如ts_http就是通过behavior(ts_plugin)(这里的behaviorJava中的implements作用相似)的方式来声明它支持所有ts_plugin定义的操作(当然,也可以不用behavior那个声明,只要实现了它定义的方法也行)。

 

         ts_config.erlTSUNG_ROOT/src/tsung_controller/ts_config.erl)在解析配置时,会匹配sessiontype,并通过SessionType:parse_config的方式来解析该session的配置,比如配置session typets_http,那么会通过ts_http:parse_configTSUNG_ROOT/src/tsung/ts_htpp.erl)来解析session中的配置。而ts_http:parse_config会把解析的任务交给ts_config_http.erlTSUNG_ROOT/src/tsung_controller/ts_config_http.erl)来完成(下文以http协议说明)。

 

         解析一个session配置最重要的任务就是解析其中向测试服务器发送信息的请求。比如http协议,ts_config_http通过parse_config函数解析要请求的地址(不包括host信息,这已经在server节中配置过)、http访求,甚至agent信息(模拟),并生成一个http_request结构(定义在TSUNG_ROOT/include/ts_http.hrl),然后将此http_request做为参数生成一个ts_requesttsung中代表请求的数据结构TSUNG_ROOT/include/ts_profile.hrl

 

 

         会话进程启动后,首先进行的就是匹配session中定义的操作(通过ts_client:handle_next_action)。在匹配到下一个操作是向测试服务发请求(配置文件中的<request>,通过ts_request匹配)的动作后,会调用ts_client:handle_next_request来创建一个TCP连接,并通过回调函数ts_http:get_message拿到这个请求要发送的数据,然后通过此TCP连接发送到测试服务器。

         一般情况下,一个请求发出去后,有两种结果:一种是等待服务器响应,一种是无视响应继续下一个动作。如果是等待服务器的响应,那么当收到服务器的响应时,是通过ts_client:handle_info回调ts_http:parse来处理的。另外,有些应用使用的协议,服务器会主动向客户端发送消息(如websocket),它是通过ts_client:handle_info回调ts_http:parse_bidi来完成的。

 

         搞清楚原理后就可以很方便的扩展一个自定义的协议了。

你可能感兴趣的:(erlang,tsung)