Linux企業級專案實踐之網路爬蟲(20)——擴充套件成為規則外掛模式

尹成發表於2014-08-31



為了方便我們爬蟲功能的擴充套件,最好使用外掛機制。
使用外掛技術能夠在分析、設計、開發、專案計劃、協作生產和產品擴充套件等很多方面帶來好處:
(1)結構清晰、易於理解。由於借鑑了硬體匯流排的結構,而且各個外掛之間是相互獨立的,所以結構非常清晰也更容易理解。
(2)易修改、可維護性強。由於外掛與宿主程式之間通過介面聯絡,就像硬體插卡一樣,可以被隨時刪除,插入和修改,所以結構很靈活,容易修改,方便軟體的升級和維護。
(3)可移植性強、重用力度大。因為外掛本身就是由一系列小的功能結構組成,而且通過介面向外部提供自己的服務,所以複用力度更大,移植也更加方便。
(4)結構容易調整。系統功能的增加或減少,只需相應的增刪外掛,而不影響整個體系結構,因此能方便的實現結構調整。:
(5)外掛之間的耦合度較低。由於外掛通過與宿主程式通訊來實現外掛與外掛,外掛與宿主程式間的通訊,所以外掛之間的耦合度更低。
(6)可以在軟體開發的過程中修改應用程式。由於採用了外掛的結構,可以在軟體的開發過程中隨時修改外掛,也可以在應用程式發行之後,通過補丁包的形式增刪外掛,通過這種形式達到修改應用程式的目的。
(7)靈活多變的軟體開發方式。可以根據資源的實際情況來調整開發的方式,資源充足可以開發所有的外掛,資源不充足可以選擇開發部分外掛,也可以請第三方的廠商開發,使用者也可以根據自己的需要進行開發。


vector<Module *> modules_pre_surl;
vector<Module *> modules_post_header;
vector<Module *> modules_post_html;

Module * dso_load(const char *path, const char *name)
{
    void *rv = NULL;
    void *handle = NULL;
    Module *module = NULL;

    char * npath = strcat2(3, path, name, ".so");

    if ((handle = dlopen(npath, RTLD_GLOBAL | RTLD_NOW)) == NULL) {	
        SPIDER_LOG(SPIDER_LEVEL_ERROR, "Load module fail(dlopen): %s", dlerror());
    }
    if ((rv = dlsym(handle, name)) == NULL) {
        SPIDER_LOG(SPIDER_LEVEL_ERROR, "Load module fail(dlsym): %s", dlerror());
    }
    module = (Module *)rv;
    module->init(module);

    return module;
}


#include "dso.h"
#include "socket.h"
#include <fcntl.h>
 
static int handler(void * data) {
    Response *r = (Response *)data;
    
    if (strstr(r->header->content_type, "text/html") == NULL)
        return MODULE_ERR;

    char *fn = url2fn(r->url);
    int fd = -1;
    if ((fd = open(fn, O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0) {
        return MODULE_ERR;
    }

    int left = r->body_len;
    int n = -1;
    while (left) {
        if ((n = write(fd, r->body, left)) < 0) {
            // error
            close(fd);
            unlink(fn);
            free(fn);
            return MODULE_ERR;
        } else {
            left -= n;
        }
    }
    close(fd);
    free(fn);
    return MODULE_OK;
}

static void init(Module *mod)
{
    SPIDER_ADD_MODULE_POST_HTML(mod);
}

Module savehtml = {
    STANDARD_MODULE_STUFF,
    init,
    handler
};



相關文章