Apache Traffic Server插件開發(fā)手記(一)

目錄

一、編譯、安裝ATS

二、ATS原理與使用

三、插件開發(fā)過程


一、編譯、安裝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中添加,這樣在開發(fā)插件的時候就能以root的方式運行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安裝,但是我有時候需要改動里面的源碼,因此我選擇了利用源碼編譯來安裝的方式。

二、ATS原理與使用

原理:

大家目前能體驗到的極速的上網(wǎng)速度,除了帶寬不斷擴大所帶來的效益外,最大的功臣當(dāng)屬CDN,CDN即報文分發(fā)網(wǎng)絡(luò),它是通過將源站的內(nèi)容存至離用戶比較近的地方,方便用戶要用的時候去取,從而減少了回源的時間,而這一系統(tǒng)得以運轉(zhuǎn)的根本在于緩存機制——cache??赡芸雌饋碛悬c抽象,舉個例子來說,京東就是現(xiàn)實世界的CDN,京東的物流很快,這得益于京東發(fā)貨的時候采用就近原則,從最近的倉庫取出貨物派發(fā)給用戶。

本文所說的ATS就相當(dāng)于jd的倉庫,將院站的數(shù)據(jù)不斷拉取到靠近用戶的節(jié)點,當(dāng)用戶請求時,再分發(fā)給用戶。本文中,將以ATS的使用、配置、插件的開發(fā)(主要在于此)介紹。

看一段來自百度百科的性能介紹

緩存:改進(jìn)響應(yīng)時間的同時降低了服務(wù)器負(fù)載與對帶寬的需求,這是通過緩存并且重用經(jīng)常請求的網(wǎng)頁、圖片和Web Service調(diào)用實現(xiàn)的。

代理:很容易添加持續(xù)連接、過濾器或異步內(nèi)容請求,還可以通過添加代理層實現(xiàn)負(fù)載平衡。

速度:在現(xiàn)代的SMP硬件上具有很好的可伸縮性,每秒鐘可以處理數(shù)以萬計的請求。

可擴展性:API考慮到了自定義插件,可以修改頭與內(nèi)容,還可以實現(xiàn)新的協(xié)議處理器。

可靠性:能夠完美處理TB級別的數(shù)據(jù),包括正向與反向代理。

緩存、代理,不必說最基本的功能;

速度方面,具有很強的并發(fā)能力,nginx采用的master+work的方式,多線程多進(jìn)程下一般能開的work不多,而ats采用協(xié)程(continuations)的方式,理論上可以隨便開,百萬級別都不是問題,但是性能肯定會下降,凡是都是雙刃劍,所以不說哪個好,適用才是王道。

可擴展性,ATS提供了方便的插件開發(fā)結(jié)構(gòu),整個的架構(gòu)如圖所示


ATS采用事件驅(qū)動方式來安排工作,通過事件喚醒所要操作的功能。處理器在于事件系統(tǒng)進(jìn)行交談過程中對線程安排工作,線程在工作過程中會發(fā)送一些事件,這些事件用于回調(diào)響應(yīng)的continuations,每個continuations被喚醒后會做一些工作,完成后要嗎銷毀要嗎回到睡眠狀態(tài)等待下一事件的到來。比如說在監(jiān)聽到客戶端請求連接后會創(chuàng)建狀態(tài)機來完成每個連接所需要的操作,這些事件會作用到ATS平臺下的線程中。大概就是這么個流程,然后事件則是通過hook的機制將事件發(fā)送給這些continuations。

基本命令:

sudo /usr/local/ats/bin/trafficserver restart

sudo /usr/local/ats/bin/trafficserver start

sudo /usr/local/ats/bin/trafficserver stop

三、插件的開發(fā)

前面說到ATS擴展性好,表現(xiàn)在用戶能利用ATS所提供的API開發(fā)自己的插件,那么用戶如何開發(fā)一個正常使用的插件呢?

根據(jù)官方給出的SDK文檔,開發(fā)一個plugin需要滿足以下5個條件。

1、確保你的插件源碼中包含TSPluginInit初始化函數(shù);

2、編譯源碼,創(chuàng)建鏈接庫;

3、在plugin.config中添加該插件入口;

4、在record.config中聲明插件對應(yīng)的鏈接庫所在的位置;

5、重啟ATS讓配置生效。

針對這五點,我們來寫個簡單的helloworld插件。

針對第一個要求,需要注意的是程序的入口都是main函數(shù),而這里的main函數(shù)已經(jīng)在ATS中了,因此插件函數(shù)的入口將其設(shè)計為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

這樣就滿足了第一個條件。

針對第二個要求,我們需要將源碼編譯成動態(tài)鏈接庫。這里直接通過ATS提供的編譯器tsxs進(jìn)行編譯,命令如下:

/usr/local/ats/bin/tsxs-o hello.so -c hello.cpp

另外,通過這個命令可以將生成的動態(tài)鏈接庫安裝到默認(rèn)的插件目錄/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中配置動態(tài)鏈接庫所在的位置,即在末尾中加入

CONFIGproxy.config.plugin.plugin_dir STRING /usr/local/ats/libexec/trafficserver/

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


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容