漫谈登录桩(MockStub)的实现

2014年6月4日,6月的第一个星期三,我正式入职百度,开始baiduer的工作。这不到2个月的时间,因为人力资源这边原因,我从INF部门离开,拉到了百度Hi-Server团队中来。2个完全不着调的岗位,做了许多以前没有做过的事情。总结一下:在INF的产品线是新产品,9月百度世界大会才上线的,很多东西不便透露;百度Hi-Server产品线相对来说就算是个老产品了,持续做了好几年了。7月中旬切到Hi-Server这边,不到这一个月的时间,主要Support了三个事情:一个登录桩的实现和一个公众平台iOS消息推送,还有消息报文协议的单测。登陆桩的实现用的是Python语言完成的,主要的时间消耗在公司自定义的2个类的实现。公众平台iOS消息推送则是在原有项目的基础上增加了一些代码,以便于支持公众账号信息的推送力。消息报文的单测,使用的是gtest测试框架,使用基于参数化的方案实现的。关于gtest单测,这个系列帖子算个精华帖:http://www.cnblogs.com/coderzh/archive/2009/04/08/1431297.html.今天主要和大家分享一下登陆桩实现中遇到的一些问题!

一、登陆桩做什么?

项目需要做一些线下的压力测试,主要是针对新增的一些模块的性能进行测评,所以需要提供一个模拟登陆服务的桩以Support这个测评工作。登陆桩它是个Mock的登陆服务,在接收到登陆请求以后,模拟真实的登陆服务,构造一个认证后的串作为响应报文返回,达到模拟登陆的目的。

二、登陆桩该怎么做?

根据上面对登陆桩需求的分析,我们可以把登陆桩的实现划分如下:

1. 监听服务:建立一个TCP连接,在指定端口监听登陆请求;

2. 解析请求包:收到的请求包是按照一定格式压缩加密而来的,桩需要对其解密解压缩把我们需要关注的字段取出来;

3. 构造响应包:根据我们解析后的请求报文,我们按照真实登陆服务的响应报文格式去构造该条请求报文所对应的响应报文,然后对该报文压缩加密后响应给请求方;

4. 并发性:桩需要支持多个账户并发模拟登录,所以我们需要实现的服务应该是一个多线程的。

三、大刀阔斧实现登陆桩!

请求响应报文的格式涉及到公司的机密,所以不在这里详细表述。报文主要的思路就是:

实例-->Json化-->pack-->加密-->发送----------------接收--------------->解密-->unpack-->反Json化-->得到具体的字段信息.

构造响应包-->Json化-->pack-->加密-->响应!

今天的主要内容是并发Socket的使用,在Python中,使用SocketServer模块建立连接,SocketServer.ThreadingTCPServer类支持并发TCP连接。那么该怎么使用这个并发TCP服务呢?让我们一步步慢慢来。

首先就是实现一个自定义的TCPHandle类了,我是这样定义的:

1 class MyTCPHandle(SocketServer.StreamRequestHandler):

在该自定义类中,需要实现handle方法:

1 def handle(self):

最后就是在main中去建立TCP连接:

1 mockserver = SocketServer.ThreadingTCPServer(('', int(sys.argv[1])), MyTCPHandle)

第二个参数是服务的端口,我是通过传参的方式去完成的。

最后,TCP开始了忙碌的工作:

1 mockserver.serve_forever()

这篇日志,从7月28就开始写,一直忙工作,时间抽不出来,今天算是下定决心给写完了。不过看内容方面,明显和我当时打算写日志时候差了很多,就这样吧,希望能多少帮到大家一点!

Published with Windows LiveWriter.

posted @ 2014-08-01 12:49  薛定谔の喵  阅读(2259)  评论(0编辑  收藏  举报