Apache Traffic Server插件开发手记(一)

目录

一、编译、安装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/

至此,条件都满足了,接下来重启ATS,可以在ATS的日志中看到打印出来的信息。查看/usr/local/ats/var/trafficserver/下的diags.log和error.log


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容