目錄
一、編譯、安裝ATS
二哪廓、ATS原理與使用
三强经、插件開(kāi)發(fā)過(guò)程
一、編譯掘殴、安裝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中添加,這樣在開(kāi)發(fā)插件的時(shí)候就能以root的方式運(yùn)行traffic_server,擁有綁定1-1023端口的權(quán)限
#if !defined(BIG_SECURITY_HOLE)
#define BIG_SECURITY_HOLE 0
#endif
編譯安裝
make & sudo make install
當(dāng)然,ats也支持apt-get install安裝千所,但是我有時(shí)候需要改動(dòng)里面的源碼,因此我選擇了利用源碼編譯來(lái)安裝的方式蒜埋。
二淫痰、ATS原理與使用
原理:
大家目前能體驗(yàn)到的極速的上網(wǎng)速度,除了帶寬不斷擴(kuò)大所帶來(lái)的效益外整份,最大的功臣當(dāng)屬CDN待错,CDN即報(bào)文分發(fā)網(wǎng)絡(luò)籽孙,它是通過(guò)將源站的內(nèi)容存至離用戶比較近的地方,方便用戶要用的時(shí)候去取火俄,從而減少了回源的時(shí)間犯建,而這一系統(tǒng)得以運(yùn)轉(zhuǎn)的根本在于緩存機(jī)制——cache」峡停可能看起來(lái)有點(diǎn)抽象适瓦,舉個(gè)例子來(lái)說(shuō),京東就是現(xiàn)實(shí)世界的CDN谱仪,京東的物流很快玻熙,這得益于京東發(fā)貨的時(shí)候采用就近原則,從最近的倉(cāng)庫(kù)取出貨物派發(fā)給用戶疯攒。
本文所說(shuō)的ATS就相當(dāng)于jd的倉(cāng)庫(kù)嗦随,將院站的數(shù)據(jù)不斷拉取到靠近用戶的節(jié)點(diǎn),當(dāng)用戶請(qǐng)求時(shí)卸例,再分發(fā)給用戶称杨。本文中,將以ATS的使用筷转、配置姑原、插件的開(kāi)發(fā)(主要在于此)介紹。
看一段來(lái)自百度百科的性能介紹
緩存:改進(jìn)響應(yīng)時(shí)間的同時(shí)降低了服務(wù)器負(fù)載與對(duì)帶寬的需求呜舒,這是通過(guò)緩存并且重用經(jīng)常請(qǐng)求的網(wǎng)頁(yè)锭汛、圖片和Web Service調(diào)用實(shí)現(xiàn)的。
代理:很容易添加持續(xù)連接袭蝗、過(guò)濾器或異步內(nèi)容請(qǐng)求唤殴,還可以通過(guò)添加代理層實(shí)現(xiàn)負(fù)載平衡。
速度:在現(xiàn)代的SMP硬件上具有很好的可伸縮性到腥,每秒鐘可以處理數(shù)以萬(wàn)計(jì)的請(qǐng)求朵逝。
可擴(kuò)展性:API考慮到了自定義插件,可以修改頭與內(nèi)容乡范,還可以實(shí)現(xiàn)新的協(xié)議處理器配名。
可靠性:能夠完美處理TB級(jí)別的數(shù)據(jù),包括正向與反向代理晋辆。
緩存渠脉、代理,不必說(shuō)最基本的功能瓶佳;
速度方面芋膘,具有很強(qiáng)的并發(fā)能力,nginx采用的master+work的方式,多線程多進(jìn)程下一般能開(kāi)的work不多为朋,而ats采用協(xié)程(continuations)的方式臂拓,理論上可以隨便開(kāi),百萬(wàn)級(jí)別都不是問(wèn)題潜腻,但是性能肯定會(huì)下降埃儿,凡是都是雙刃劍,所以不說(shuō)哪個(gè)好融涣,適用才是王道童番。
可擴(kuò)展性,ATS提供了方便的插件開(kāi)發(fā)結(jié)構(gòu)威鹿,整個(gè)的架構(gòu)如圖所示
ATS采用事件驅(qū)動(dòng)方式來(lái)安排工作剃斧,通過(guò)事件喚醒所要操作的功能。處理器在于事件系統(tǒng)進(jìn)行交談過(guò)程中對(duì)線程安排工作忽你,線程在工作過(guò)程中會(huì)發(fā)送一些事件幼东,這些事件用于回調(diào)響應(yīng)的continuations,每個(gè)continuations被喚醒后會(huì)做一些工作科雳,完成后要嗎銷毀要嗎回到睡眠狀態(tài)等待下一事件的到來(lái)根蟹。比如說(shuō)在監(jiān)聽(tīng)到客戶端請(qǐng)求連接后會(huì)創(chuàng)建狀態(tài)機(jī)來(lái)完成每個(gè)連接所需要的操作,這些事件會(huì)作用到ATS平臺(tái)下的線程中糟秘。大概就是這么個(gè)流程简逮,然后事件則是通過(guò)hook的機(jī)制將事件發(fā)送給這些continuations。
基本命令:
sudo /usr/local/ats/bin/trafficserver restart
sudo /usr/local/ats/bin/trafficserver start
sudo /usr/local/ats/bin/trafficserver stop
三尿赚、插件的開(kāi)發(fā)
前面說(shuō)到ATS擴(kuò)展性好散庶,表現(xiàn)在用戶能利用ATS所提供的API開(kāi)發(fā)自己的插件,那么用戶如何開(kāi)發(fā)一個(gè)正常使用的插件呢凌净?
根據(jù)官方給出的SDK文檔悲龟,開(kāi)發(fā)一個(gè)plugin需要滿足以下5個(gè)條件。
1冰寻、確保你的插件源碼中包含TSPluginInit初始化函數(shù)须教;
2、編譯源碼斩芭,創(chuàng)建鏈接庫(kù)没卸;
3、在plugin.config中添加該插件入口秒旋;
4、在record.config中聲明插件對(duì)應(yīng)的鏈接庫(kù)所在的位置诀拭;
5迁筛、重啟ATS讓配置生效。
針對(duì)這五點(diǎn),我們來(lái)寫個(gè)簡(jiǎn)單的helloworld插件细卧。
針對(duì)第一個(gè)要求尉桩,需要注意的是程序的入口都是main函數(shù),而這里的main函數(shù)已經(jīng)在ATS中了贪庙,因此插件函數(shù)的入口將其設(shè)計(jì)為TSPluginInit蜘犁,第二個(gè)注意的地方在于該采用c還是c++編寫呢?答案肯定是都可以止邮,但是如果用C++的話这橙,需要按C的編譯器來(lái)編譯,而不是C++导披,針對(duì)這兩點(diǎn)屈扎,我采用C++做個(gè)示范,代碼如下撩匕。
#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
這樣就滿足了第一個(gè)條件。
針對(duì)第二個(gè)要求止毕,我們需要將源碼編譯成動(dòng)態(tài)鏈接庫(kù)模蜡。這里直接通過(guò)ATS提供的編譯器tsxs進(jìn)行編譯,命令如下:
/usr/local/ats/bin/tsxs-o hello.so -c hello.cpp
另外扁凛,通過(guò)這個(gè)命令可以將生成的動(dòng)態(tài)鏈接庫(kù)安裝到默認(rèn)的插件目錄/usr/local/ats/libexec下忍疾,安裝命令如下
sudo/usr/local/ats/bin/tsxs -o hello.so -i
接下來(lái),配置第三個(gè)要求令漂,在/usr/local/ats/etc/trafficserver/plugin.config中加入膝昆,hello.so。
最后是配置第四個(gè)要求叠必,在record.config中配置動(dòng)態(tài)鏈接庫(kù)所在的位置荚孵,即在末尾中加入
CONFIGproxy.config.plugin.plugin_dir STRING /usr/local/ats/libexec/trafficserver/