2016-06-03 4 views
1

Apache Thrift netstack аккуратно объясняет, что транспортный протокол может быть необработанным TCP, HTTP и т. Д. Однако я не смог найти подходящую документацию, которая описывает, как я могу переключаться между использованием транспортных протоколов под ним , может быть, я что-то упустил.Как переключить транспортные протоколы в Apache Thrift

Кроме того, небольшой следить за вопросом, как я настроить перед созданием бережливость на моей системе Ubuntu (./configure), я вижу следующее:

C++ Library: 
    Build TZlibTransport ...... : yes 
    Build TNonblockingServer .. : yes 
    Build TQTcpServer (Qt4) .... : no 
    Build TQTcpServer (Qt5) .... : no 

Должен ли я быть встревожены, что TQTcpServer не был настроен, чтобы быть построенный, учитывая, что я хочу использовать транспортный протокол TCP?

Я новичок в Thrift, извиняюсь за недостаток опыта для создания вопроса лучше.

+0

«* Должен ли я быть встревожен тем, что TQTcpServer не был сконфигурирован для создания *» - только если вы планируете использовать Qt – JensG

ответ

2

Компания Thrift придерживается концепции транспорта конечных точек, многоуровневых транспортов и протоколов, сложенных друг на друга, чтобы сформировать конкретную реализацию. tutorial показывает основной принцип (это C++ версии):

boost::shared_ptr<TTransport> socket(new TSocket("localhost", 9090)); 
    boost::shared_ptr<TTransport> transport(new TBufferedTransport(socket)); 
    boost::shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport)); 
    CalculatorClient client(protocol); 

Если вам нужно переключить транспорты, в теории вы просто удалите TSocket линию и подключить другой транспорт по вашему выбору. На практике может быть несколько тонкостей, но это основная идея. test suite code может служить достаточно хорошим примером, как сделать это на практике:

if (ssl) { 
    factory = boost::shared_ptr<TSSLSocketFactory>(new TSSLSocketFactory()); 
    factory->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"); 
    factory->loadTrustedCertificates(pemPath.c_str()); 
    factory->authenticate(true); 
    socket = factory->createSocket(host, port); 
    } else { 
    if (domain_socket != "") { 
     if (abstract_namespace) { 
     std::string abstract_socket("\0", 1); 
     abstract_socket += domain_socket; 
     socket = boost::shared_ptr<TSocket>(new TSocket(abstract_socket)); 
     } else { 
     socket = boost::shared_ptr<TSocket>(new TSocket(domain_socket)); 
     } 
     port = 0; 
    } else { 
     socket = boost::shared_ptr<TSocket>(new TSocket(host, port)); 
    } 
    } 

    if (transport_type.compare("http") == 0) { 
    boost::shared_ptr<TTransport> httpSocket(new THttpClient(socket, host, "/service")); 
    transport = httpSocket; 
    } else if (transport_type.compare("framed") == 0) { 
    boost::shared_ptr<TFramedTransport> framedSocket(new TFramedTransport(socket)); 
    transport = framedSocket; 
    } else { 
    boost::shared_ptr<TBufferedTransport> bufferedSocket(new TBufferedTransport(socket)); 
    transport = bufferedSocket; 
    } 

Это опять C++ и только на стороне клиента. Там также есть counterpart for the server end, который работает очень похоже.

+0

Спасибо за объяснение! – Segmented