目錄
一、編譯、安裝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/