自定义脚本技术介绍

     在应用交付产品的使用过程中,客户实际应用的需求往往各不相同,如果有相同需求的客户较多或者提出个性化需求的用户是大型客户,各厂商会尽量在后续的版本中开发相应特性。如果客户需求本身是比较少见的需求,厂家通常不会专门为个别用户开发相关特性。如何让应用交付设备提供的特性满足各种用户千变万化的需求,而厂商又不需要投入太多精力为每一个客户定制个性化软件?自定义脚本技术基本解决了这个问题,并已经成为应用交付产品能否被普遍接受和长久发展的一个关键因素。
 
     目前市场上现有的应用交付产品中,支持自定义脚本功能的厂商有 A10和F5。A10的aFleX和 F5的iRule均采用行业标准 Tcl( Tool Command Language)编程语言,而且大部分命令是通用的。如下图所示,通过使用自定义脚本,应用交付设备可以按照用户需求进行深度精细的数据包分析并将连接分配到相应的服务器或采取其它相应的动作(过滤、丢弃、重定向等)。本文的自定义脚本介绍以 A10公司的aFleX为例。
 

 

aFleX自定义脚本的组成三元素

 
 事件(Event)
aFleX是事件驱动的,特定事件触发相应脚本。常见的事件根据协议分为 GLOBAL、HTTP、IP、TCP、UDP、SSL等几大类。具体事件如HTTP大类中的HTTP_REQUEST表示完整解析HTTP请求的头数据时触发的事件,TCP大类中的CLIENT_ACCEPTED表示TCP连接建立时触发的事件。
 
操作符(Operators)
操作符用来比较表达式中两个操作数,是标准的 TCL语言操作,包括关系操作符(如 contains、equals)和逻辑操作符(and、or、not)。
 
命令(Commands)
命令是应用交付设备根据相应条件进行相应的操作,应用交付设备厂家会根据功能需求不断增加新的命令。命令分为以下几类:
-     查询命令( Query)
搜索数据包头或数据内容返回相应信息,如 IP::remote_addr 返回远端IP地址。
-     动作 /修改命令(Action/Modification)
修改数据包头或数据内容,如 HTTP::header remove <name> 删除HTTP头中的相应字段。
-     陈述命令( Statement)
定义数据流量目的服务器组、服务器或 URL。如pool <name> 定向流量到相应服务器组。
-     功能命令( Function)
进行深度包检查,以便应用交付设备根据搜索结果选择相应服务器。如 findstr在一个字符串中搜索指定字符串并返回一定偏移位置的字符串。
 

aFleX 脚本简单实例

 
实例 1:将特定客户请求转发到指定的服务器组
When CLIENT_ACCEPTED {
       if { [IP::addr [IP::client_addr] equals 10.10.10.10] } {
              pool sg2
       }
}    
  
实例2:当HTTP响应中包含‘404 not found’时重定向到其他服务器
when HTTP_RESPONSE{
       if { [HTTP::status] ends_with "404"} {
              [HTTP::redirect "http://server2nd/index.html"]
          }
          }
 
实例3:将HTTP响应中的相应HTTP字段删除
when HTTP_RESPONSE {
 HTTP::header remove "Via"
}
 

aFleX自定义脚本的配置方式

 
1. 直接通过 AX设备进行aFleX 脚本编辑
 
a.命令行方式
先在个人电脑上通过任意的文本编辑工具完成 aFleX脚本并保存为文件
在 AX设备使用 “import aflex”命令导入上一步编写好的aFleX 文件.
在 AX设备通过命令行查验aFleX 脚本: "aflex check <name>".
 
b.WebUI方式
通过 AX的web管理界面, 用户可以直接进行 aFleX脚本编辑和保存, "Config > Service > aFleX".
 
c.使用 A10提供的 aFleX 编辑器软件
aFleX 编辑器软件可以使用电脑方便的上传 /下载aFleX 脚本到AX设备. 并提供编辑器软件通用的一些特性,如语syntax highlighting,关键字自动补全等功能.
 
2. 将 aFleX 脚本配置在相应的VIP port(虚拟服务器端口)
 
a.WebUI: Config > Service > SLB > Virtual Server > Port
b. CLI: AX(config)# slb virtual-server <name>
   AX(config-slb vserver)# port N tcp
   AX(config-slb vserver-vport)# aflex <name>
 

采用自定义脚本对应用交付设备处理性能的影响

 
通过前面的介绍和举例可以看出,自定义脚本应该是一个非常完美的用以解决用户千变万化需求的特性。但真正使用过自定义脚本功能的用户却会尽可能的回避使用它,其根源就是自定义脚本的处理性能。这也是自定义脚本未能更大范围应用的主要原因。自定义脚本应用在虚拟 IP的某个应用端口后,所有到该应用端口的流量除了正常配置的处理外,都必须通过自定义脚本处理,这些处理都必须由CPU来执行。而传统应用交付设备不具备足够的 CPU资源,或者其基于单核处理器的操作系统不能很好地发挥多核处理器的性能,导致自定义脚本处理性能极差(性能下降50%甚至更高),很难被具有高性能要求的用户所接受。
 
A10网络的 AX系列应用交付设备的推出改变了自定义脚本的这种尴尬局面。其专门设计的基于多核处理器的操作系统 ACOS可以实现多处理器接近零开销的并行处理,因此只需要通过增加处理器数量即可以保证足够的性能。而传统的操作系统由于处理器间的额外开销,当处理器数量超过3个时就很难再有性能提升。在具备足够的处理器资源以后,自定义脚本的处理性能自然迎刃而解。( K.Y)