//用於根據請求獲取內容並返回響應
Download(req *Request) (*Response, error)
//Module代表元件的基礎介面型別。 //該介面的實現型別必須是並行安全的 type Module interface { //用於獲取當前元件的ID ID() MID //用於獲取當前元件的網路地址的字串形式 Addr() string //用於荻取當前元件的評分 Score() uint64 //用於設定當前元件的評分 SetScore(score uint64) //用於獲取評分計算器 ScoreCalculator() CalculateScore //用於獲取當前元件被呼叫的計數 CalledCount() uint64 //用於獲取當前元件接受的呼叫的計數, //元件一般會由於超負荷或引數有誤而拒絕呼叫 AcceptedCount() uint64 //用於獲取當前元件已成功完成的呼叫的計數 CompletedCount() uint64 //用於獲取當前元件正在處理的呼叫的數量 HandlingNumber() uint64 //用於一次性獲取所有計數 Counts() Counts //用於獲取元件摘要 Summary() SummaryStruet }處理模組之所以又稱為元件,是因為它們實現的都是擴充套件功能,可組裝到網路爬蟲框架上。但同時它們又是重要的,因為如果沒有它們,就無法使用這個框架編寫出一個可以運轉起來的網路爬蟲。
//元件ID的模板
var midTemplate = "%s%d|%s"
//元件的型別 type Type string //當前認可的元件型別的常數 const ( //下載器 TYPE_DOWNLOADER Type = "downloader" //分析器 TYPE_ANALYZER Type = "analyzer" //棗目處理管道 TYPE_PIPELINE Type = "pipeline" )元件型別常數的值已經直白地表達了其含義。基於此,我可以明確它們與字母之間的對應關係:
//合法的元件型別-字母的對映 var legalTypeLetterMap = map[Type]string{ TYPE_DOWNLOADER: "D", TYPE_ANALYZER: "A", TYPE_PIPELINE: "P", }元件 ID 中的序列號可以由網路爬蟲框架的使用方提供。這就需要我們在框架內提供一個工具,以便於統一序列號的生成和獲取。序列號原則上是不能重複的,也是順序給出的。但是如果序列號超出了給定範圍,就可以迴圈使用。據此,我編寫了一個序列號生成器的介面型別:
//序列號生成器的介面型別 type SNGenertor interface { //用於獲取預設的最小序列號 Start() uint64 //用於獲取預設的最大序列號 Max() uint64 //用於獲取下一個序列號 Next() uint64 //用於獲取迴圈計數 CycleCount() uint64 //用於獲得一個序列號並準備下一個序列號 Get() uint64 }其中最小序列號和最大序列號都可以由使用方在初始化序列號生成器時給定。迴圈計數代表了生成器生成的序列號在前兩者指定的範圍內迴圈的次數。