腾 讯 大 讲 堂 第四十六期 研发管理部 大讲堂主页: http://km.oa.com/class 与讲师互动: http://km.oa.com/group/class
自由 CGI 之路 V3 ----- 面向对象的可配置的 CGI 编程 互联网运营部   tommyyan 2008-09-03
新的 CGI 系统介绍 在 cgi 的开发实践中,通过不断的系统重构,完成了一个基于配置的 cgi 系统。一般情况下,系统中添加一个传统意义上的 cgi 请求,只需要进行几个配置文件的少量修改即可完成,而不需要进行编码工作。通过驱动模块的扩充可以使系统不断增加新的功能。 良好的扩充性:可以基于点的控制也可以基于流程的控制, 中间件的技术:使接口在上层表现出了一致的特点 重复性的工作的处理:在这个系统中基本上看不到 系统的规模的控制:使变更的影响范围在合理的范围内进行; 全配置的系统:即使在配置上也很注重细节,做到了基于模板的配置和默认值选取,使一次新的配置也许只是个别字段的修改。
   神奇的 tcgi   #include "cgi.h" #define CGI_CONF_PATH "/usr/local/MKT_Act/conf/" int main(int argc,char*argv[]){ TCgi theCgi; theCgi.RunEx(CGI_CONF_PATH); }
发展历程
cgi 层次结构
CGI 处理流程
CGI 处理流程
CGI 基础层
CGI 基础层 完成所有与外部应用系统无关的封装 完成一个 CGI 完整的逻辑封装 提供基于中间件的驱动接口 提供可以重载的流程接口 提供二次开发接口 提供配置项管理的接口
系统基础层 完成所有公司、系统级别的可重用性的封装 提供类似 cgiex 类似的 web 方式 cgi 访问 对基础库的功能封装 TLib 、  TBase 及其他公司、部门相关库 提供公用数据源接口的驱动封装 TTC 、 mysql 、 c4a 、支付 portal 等 相关的业务统计、运维统计、告警操作
业务基础层 完成所有业务级别的可重用性的封装 业务级别的检查 例如:用户注册的检查、黑名单检查、 业务公用信息的获取 用户的性别、城市、时间戳、个人账户, 可配置的数据读取和操作 高级用户状态、好友资料
业务层 特殊业务逻辑的处理 统计点、监控点的添加
CGI 基础层 完成所有与外部应用系统无关的封装 参数处理 模板管理 操作管理 驱动管理 项目、模块管理 配置系统
基础层 - 配置系统
项目管理、接口描述 -cgi.ini 按照一定规模组织的外部接口( cgi )的集合,接口包含一下描述 输入特性 输出特性 操作列表 全局的检查点 公共功能
# 发起抽奖 [lotterybid] templateFile=/template/lotterybid.xml templateType=1 templateCode=utf-8 checklogin=true oplist=bidlottery args=actid|type starttime=2008-02-01 08:30:00 endtime=2008-03-01 23:59:59
参数处理 - 输入 参数输入类型 整形 / 字符类型 / 特殊类型(文件等) 取值范围 默认值 错误返回对应的描述,返回码 是否允许为空
参数处理  -  输出 输出的格式多样( web 支持的各类格式) xml 、 html 、图片文件等等 返回类型多样 错误返回、正确返回,基于模版的返回 是否记录执行结果的多样性 日志、告警、统计等
参数中心类  -  CgiArgCenter 字符编码( xml 、 html 、 js 、 url 。。。) 参数检查(整形大小,字符型长度) 输入输出参数的缓冲区 根据指定的模板类型进行字符编码
模板管理 根据不同的错误代码、某一个字段的返回值取不同的模板 各种格式模板的支持和自动转译 基于操作名的模板替换
模板示例 <%$RETURN_ERROR_begin$%> <%RETURN=default_begin%> try{  var rc1=&quot;<%RETURN_CODE%>&quot; ; rc2=&quot;<%RETURN_SUBCODE%>&quot;;  MPPresentlist=&quot;&quot;; callback(rc1, rc2, MPPresentlist);  } catch(e) {status=&quot;callback is not exist!&quot;} <%RETURN=default_end%> <%$RETURN_ERROR_end$%> <%$campusdui_begin$%> try{    var rc1=&quot;0&quot;;  rc2=&quot;<%MPResultCode%>&quot;;  MPPresentlist=&quot;<%MPPresentList%>&quot;;  callback(rc1, rc2, MPPresentlist);  } catch(e) {status=&quot;callback is not exist!&quot;} <%$campusdui_end$%>
操作 原子级的对一个驱动接口访问的描述 底层驱动接口 操作类型:查询、修改、删除、新增、赠送、抽奖。。。 参数变换 输入参数和返回结果参数指定 服务器相关信息
抽奖操作 [bidlottery] driver=Portal type=mod fielddisplay=LotteryRank arglist=actid|URL|LOGIN_UIN|type argmaplist=actid,MPRuleID|type,LotteryType subargs=MPRuleID|LotteryTyperesultarglist=LotteryItem,1|LotteryRank,1|ListID,1 serverinfo=172.16.60.16:30008|172.16.244.170:30008 testserverinfo=172.16.68.141:30007|172.16.68.141:30007
驱动 对一个外部接口的统一接口的封装 加载方式:动态、静态 服务器信息 支持的操作类型
驱动 - 统一接口 对一个外部接口的统一封装,一致性的接口,系统启动时注册到操作管理器中 初始化接口 typedef  void *(*FUNC_DRIVER_INIT)(map<string,string>&); 操作接口 typedef int (*FUNC_DRIVER_OP)(void *, const char* ,map<string,string>&,void*); 取一条数据接口 typedef int (*FUNC_DRIVER_FETCH_ROW)(void *, const char* ,map<string,string>&); 释放数据接口 typedef int (*FUNC_DRIVER_FREE_RESULT)(void *, const char* ); 结束接口 typedef int (*FUNC_DRIVER_END)(void *context);
驱动 - 已经实现的接口 TTC 支付 Portal 字符串协议 MGW
高级应用 - 系统扩展性 扩充新的驱动 建立业务级别的操作 建立操作之间的衔接和处理 数据源 - 基于模板的配置 流程的特殊处理
公用模块 - 系统级别 GET/POST 方式检查 参数相关 模板相关 生效时间、结束时间
公用模块 - 公司级别 社区登录态检查 脏话过滤 验证码检查 增值中心位判断 功能性 tips 发放
公用模块 - 业务级别 物品管理: 赠送、购买、限制 包月业务购买 动态用户群判断 加锁、频率限制模块 兑换规则 业务统计数据上报 模块间调用监控告警
谢  谢!

腾讯大讲堂46 自由cgi之路v3

  • 1.
    腾 讯 大讲 堂 第四十六期 研发管理部 大讲堂主页: http://km.oa.com/class 与讲师互动: http://km.oa.com/group/class
  • 2.
    自由 CGI 之路V3 ----- 面向对象的可配置的 CGI 编程 互联网运营部 tommyyan 2008-09-03
  • 3.
    新的 CGI 系统介绍在 cgi 的开发实践中,通过不断的系统重构,完成了一个基于配置的 cgi 系统。一般情况下,系统中添加一个传统意义上的 cgi 请求,只需要进行几个配置文件的少量修改即可完成,而不需要进行编码工作。通过驱动模块的扩充可以使系统不断增加新的功能。 良好的扩充性:可以基于点的控制也可以基于流程的控制, 中间件的技术:使接口在上层表现出了一致的特点 重复性的工作的处理:在这个系统中基本上看不到 系统的规模的控制:使变更的影响范围在合理的范围内进行; 全配置的系统:即使在配置上也很注重细节,做到了基于模板的配置和默认值选取,使一次新的配置也许只是个别字段的修改。
  • 4.
       神奇的 tcgi #include &quot;cgi.h&quot; #define CGI_CONF_PATH &quot;/usr/local/MKT_Act/conf/&quot; int main(int argc,char*argv[]){ TCgi theCgi; theCgi.RunEx(CGI_CONF_PATH); }
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
    CGI 基础层 完成所有与外部应用系统无关的封装完成一个 CGI 完整的逻辑封装 提供基于中间件的驱动接口 提供可以重载的流程接口 提供二次开发接口 提供配置项管理的接口
  • 11.
    系统基础层 完成所有公司、系统级别的可重用性的封装 提供类似cgiex 类似的 web 方式 cgi 访问 对基础库的功能封装 TLib 、 TBase 及其他公司、部门相关库 提供公用数据源接口的驱动封装 TTC 、 mysql 、 c4a 、支付 portal 等 相关的业务统计、运维统计、告警操作
  • 12.
    业务基础层 完成所有业务级别的可重用性的封装 业务级别的检查例如:用户注册的检查、黑名单检查、 业务公用信息的获取 用户的性别、城市、时间戳、个人账户, 可配置的数据读取和操作 高级用户状态、好友资料
  • 13.
  • 14.
    CGI 基础层 完成所有与外部应用系统无关的封装参数处理 模板管理 操作管理 驱动管理 项目、模块管理 配置系统
  • 15.
  • 16.
    项目管理、接口描述 -cgi.ini 按照一定规模组织的外部接口(cgi )的集合,接口包含一下描述 输入特性 输出特性 操作列表 全局的检查点 公共功能
  • 17.
    # 发起抽奖 [lotterybid]templateFile=/template/lotterybid.xml templateType=1 templateCode=utf-8 checklogin=true oplist=bidlottery args=actid|type starttime=2008-02-01 08:30:00 endtime=2008-03-01 23:59:59
  • 18.
    参数处理 - 输入参数输入类型 整形 / 字符类型 / 特殊类型(文件等) 取值范围 默认值 错误返回对应的描述,返回码 是否允许为空
  • 19.
    参数处理 - 输出 输出的格式多样( web 支持的各类格式) xml 、 html 、图片文件等等 返回类型多样 错误返回、正确返回,基于模版的返回 是否记录执行结果的多样性 日志、告警、统计等
  • 20.
    参数中心类 - CgiArgCenter 字符编码( xml 、 html 、 js 、 url 。。。) 参数检查(整形大小,字符型长度) 输入输出参数的缓冲区 根据指定的模板类型进行字符编码
  • 21.
  • 22.
    模板示例 <%$RETURN_ERROR_begin$%> <%RETURN=default_begin%>try{ var rc1=&quot;<%RETURN_CODE%>&quot; ; rc2=&quot;<%RETURN_SUBCODE%>&quot;; MPPresentlist=&quot;&quot;; callback(rc1, rc2, MPPresentlist); } catch(e) {status=&quot;callback is not exist!&quot;} <%RETURN=default_end%> <%$RETURN_ERROR_end$%> <%$campusdui_begin$%> try{ var rc1=&quot;0&quot;; rc2=&quot;<%MPResultCode%>&quot;; MPPresentlist=&quot;<%MPPresentList%>&quot;; callback(rc1, rc2, MPPresentlist); } catch(e) {status=&quot;callback is not exist!&quot;} <%$campusdui_end$%>
  • 23.
    操作 原子级的对一个驱动接口访问的描述 底层驱动接口操作类型:查询、修改、删除、新增、赠送、抽奖。。。 参数变换 输入参数和返回结果参数指定 服务器相关信息
  • 24.
    抽奖操作 [bidlottery] driver=Portaltype=mod fielddisplay=LotteryRank arglist=actid|URL|LOGIN_UIN|type argmaplist=actid,MPRuleID|type,LotteryType subargs=MPRuleID|LotteryTyperesultarglist=LotteryItem,1|LotteryRank,1|ListID,1 serverinfo=172.16.60.16:30008|172.16.244.170:30008 testserverinfo=172.16.68.141:30007|172.16.68.141:30007
  • 25.
  • 26.
    驱动 - 统一接口对一个外部接口的统一封装,一致性的接口,系统启动时注册到操作管理器中 初始化接口 typedef void *(*FUNC_DRIVER_INIT)(map<string,string>&); 操作接口 typedef int (*FUNC_DRIVER_OP)(void *, const char* ,map<string,string>&,void*); 取一条数据接口 typedef int (*FUNC_DRIVER_FETCH_ROW)(void *, const char* ,map<string,string>&); 释放数据接口 typedef int (*FUNC_DRIVER_FREE_RESULT)(void *, const char* ); 结束接口 typedef int (*FUNC_DRIVER_END)(void *context);
  • 27.
    驱动 - 已经实现的接口TTC 支付 Portal 字符串协议 MGW
  • 28.
    高级应用 - 系统扩展性扩充新的驱动 建立业务级别的操作 建立操作之间的衔接和处理 数据源 - 基于模板的配置 流程的特殊处理
  • 29.
    公用模块 - 系统级别GET/POST 方式检查 参数相关 模板相关 生效时间、结束时间
  • 30.
    公用模块 - 公司级别社区登录态检查 脏话过滤 验证码检查 增值中心位判断 功能性 tips 发放
  • 31.
    公用模块 - 业务级别物品管理: 赠送、购买、限制 包月业务购买 动态用户群判断 加锁、频率限制模块 兑换规则 业务统计数据上报 模块间调用监控告警
  • 32.