目录
一、编译、安装ATS
二、ATS原理与使用
三、插件开发过程
一、编译、安装ATS
下载解压源代码
wget http://mirrors.shuosc.org/apache/trafficserver/trafficserver-5.3.2.tar.bz2
tar -jxvf trafficserver-5.3.2.tar.bz2
安装依赖
sudo apt-get install g++ make pkg-config libssl-dev tcl-dev libexpat1-dev libpcre3-dev libmodule-install-perl
sudo apt-get install bison flex
sudo apt-get install bison flex
配置
./configure --prefix=/usr/local/ats --with-user=carl --with-group=carl --enable-debug --enable-experimental-plugins --enable-example-plugins
修改Main.cc源码
在Main.cc中添加,这样在开发插件的时候就能以root的方式运行traffic_server,拥有绑定1-1023端口的权限
#if !defined(BIG_SECURITY_HOLE)
#define BIG_SECURITY_HOLE 0
#endif
编译安装
make & sudo make install
当然,ats也支持apt-get install安装,但是我有时候需要改动里面的源码,因此我选择了利用源码编译来安装的方式。
二、ATS原理与使用
原理:
大家目前能体验到的极速的上网速度,除了带宽不断扩大所带来的效益外,最大的功臣当属CDN,CDN即报文分发网络,它是通过将源站的内容存至离用户比较近的地方,方便用户要用的时候去取,从而减少了回源的时间,而这一系统得以运转的根本在于缓存机制——cache。可能看起来有点抽象,举个例子来说,京东就是现实世界的CDN,京东的物流很快,这得益于京东发货的时候采用就近原则,从最近的仓库取出货物派发给用户。
本文所说的ATS就相当于jd的仓库,将院站的数据不断拉取到靠近用户的节点,当用户请求时,再分发给用户。本文中,将以ATS的使用、配置、插件的开发(主要在于此)介绍。
看一段来自百度百科的性能介绍
缓存:改进响应时间的同时降低了服务器负载与对带宽的需求,这是通过缓存并且重用经常请求的网页、图片和Web Service调用实现的。
代理:很容易添加持续连接、过滤器或异步内容请求,还可以通过添加代理层实现负载平衡。
速度:在现代的SMP硬件上具有很好的可伸缩性,每秒钟可以处理数以万计的请求。
可扩展性:API考虑到了自定义插件,可以修改头与内容,还可以实现新的协议处理器。
可靠性:能够完美处理TB级别的数据,包括正向与反向代理。
缓存、代理,不必说最基本的功能;
速度方面,具有很强的并发能力,nginx采用的master+work的方式,多线程多进程下一般能开的work不多,而ats采用协程(continuations)的方式,理论上可以随便开,百万级别都不是问题,但是性能肯定会下降,凡是都是双刃剑,所以不说哪个好,适用才是王道。
可扩展性,ATS提供了方便的插件开发结构,整个的架构如图所示
ATS采用事件驱动方式来安排工作,通过事件唤醒所要操作的功能。处理器在于事件系统进行交谈过程中对线程安排工作,线程在工作过程中会发送一些事件,这些事件用于回调响应的continuations,每个continuations被唤醒后会做一些工作,完成后要吗销毁要吗回到睡眠状态等待下一事件的到来。比如说在监听到客户端请求连接后会创建状态机来完成每个连接所需要的操作,这些事件会作用到ATS平台下的线程中。大概就是这么个流程,然后事件则是通过hook的机制将事件发送给这些continuations。
基本命令:
sudo /usr/local/ats/bin/trafficserver restart
sudo /usr/local/ats/bin/trafficserver start
sudo /usr/local/ats/bin/trafficserver stop
三、插件的开发
前面说到ATS扩展性好,表现在用户能利用ATS所提供的API开发自己的插件,那么用户如何开发一个正常使用的插件呢?
根据官方给出的SDK文档,开发一个plugin需要满足以下5个条件。
1、确保你的插件源码中包含TSPluginInit初始化函数;
2、编译源码,创建链接库;
3、在plugin.config中添加该插件入口;
4、在record.config中声明插件对应的链接库所在的位置;
5、重启ATS让配置生效。
针对这五点,我们来写个简单的helloworld插件。
针对第一个要求,需要注意的是程序的入口都是main函数,而这里的main函数已经在ATS中了,因此插件函数的入口将其设计为TSPluginInit,第二个注意的地方在于该采用c还是c++编写呢?答案肯定是都可以,但是如果用C++的话,需要按C的编译器来编译,而不是C++,针对这两点,我采用C++做个示范,代码如下。
#include
#include
#include "hello.h"
extern "C" void TSPluginInit (int argc, const char *argv[]);
void TSPluginInit (int argc, const char *argv[])
{
TSPluginRegistrationInfo info;
info.plugin_name = "hello-world";
info.vendor_name = "carlpc";
info.support_email = "carl@ carlpc.com";
if (TSPluginRegister(&info) != TS_SUCCESS) {
TSError("load error");
}
TSError("Hello World!");
}
#ifndef __HELLO_H__
#define __HELLO_H__
void TSPluginInit (int argc, const char *argv[]);
#endif
这样就满足了第一个条件。
针对第二个要求,我们需要将源码编译成动态链接库。这里直接通过ATS提供的编译器tsxs进行编译,命令如下:
/usr/local/ats/bin/tsxs-o hello.so -c hello.cpp
另外,通过这个命令可以将生成的动态链接库安装到默认的插件目录/usr/local/ats/libexec下,安装命令如下
sudo/usr/local/ats/bin/tsxs -o hello.so -i
接下来,配置第三个要求,在/usr/local/ats/etc/trafficserver/plugin.config中加入,hello.so。
最后是配置第四个要求,在record.config中配置动态链接库所在的位置,即在末尾中加入
CONFIGproxy.config.plugin.plugin_dir STRING /usr/local/ats/libexec/trafficserver/