2016-02-05 9 views
0

Я прочитал official Apache Thrift docs. Я прочитал отличный Thrift By Example Docs. Я даже прочитал еще более превосходный Thrift: The Missing Guide.Как указать нестандартные протоколы Транспорта и Транспорта

Нигде не могу понять, как определить, скажем, TCompactProtocol по умолчанию (TBinaryProtocol). Или, скажем, TFramedSocket по умолчанию (TSocket).

Может кто-нибудь здесь уточнить?

ответ

1

Протокол в Thrift описывает формат, в котором фактические биты данных записываются/считываются с базового носителя данных. Обычно требуется только одна такая вещь, укладка их не требуется, так как для сериализации данных требуется только один физический макет.

Напротив, то, что предназначено для укладки, это так называемые «слоистые транспорты». Транспорты работают на более низком уровне абстракции. Очень типичными примерами являются TFramedTransport и TBufferedTransport. Слоистые транспорты добавляют функциональность к потоку байтов, например добавление размера кадра, буферизации данных или возможности мультиплексирования. Технически они расположены между протоколом и базовыми «транспортными средствами конечных точек», которые фактически записывают/считывают байты на/из носителя данных (например, Socket).

Следовательно, если вам нужно изменить преобразование из и в байты, вы пишете другой протокол. Всякий раз, когда требуется дополнительный носитель данных, напишите транспорт конечной точки. Если байты должны обрабатываться только между процессом сериализации/десериализации, скажем, вы хотите добавить новый алгоритм сжатия «Schrippe», который позволяет Brotli и Zopfli выглядеть старым хлебом (каламбур очень предназначен), писать многоуровневый транспорт.

Хороший пример того, как складывать все вместе, можно найти в языковой зависимости Thrift Test Suite (за несколькими исключениями, расположенной под /test/yourlanguage). Набор тестов предназначен для тестирования всех комбинаций. Если вы закончили с учебником, я рекомендую взглянуть на этот код, так как он объясняет множество дополнительных функций как для client end, так и для server end.

Подобно тому, как, например, это соответствующая часть from the C++ Test Client, где все выбранные компоненты устанавливаются:

boost::shared_ptr<TTransport> transport; 
    boost::shared_ptr<TProtocol> protocol; 

    boost::shared_ptr<TSocket> socket; 
    boost::shared_ptr<TSSLSocketFactory> factory; 

    if (ssl) { 
    factory = boost::shared_ptr<TSSLSocketFactory>(new TSSLSocketFactory()); 
    factory->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"); 
    factory->loadTrustedCertificates((dir_path + "../keys/CA.pem").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; 
    } 

    if (protocol_type.compare("json") == 0) { 
    boost::shared_ptr<TProtocol> jsonProtocol(new TJSONProtocol(transport)); 
    protocol = jsonProtocol; 
    } else if (protocol_type.compare("compact") == 0) { 
    boost::shared_ptr<TProtocol> compactProtocol(new TCompactProtocol(transport)); 
    protocol = compactProtocol; 
    } else if (protocol_type == "header") { 
    boost::shared_ptr<TProtocol> headerProtocol(new THeaderProtocol(transport)); 
    protocol = headerProtocol; 
    } else { 
    boost::shared_ptr<TBinaryProtocol> binaryProtocol(new TBinaryProtocol(transport)); 
    protocol = binaryProtocol; 
    } 

    // Connection info 
    cout << "Connecting (" << transport_type << "/" << protocol_type << ") to: "; 
    if (abstract_namespace) { 
    cout << '@'; 
    } 
    cout << domain_socket; 
    if (port != 0) { 
    cout << host << ":" << port; 
    } 
    cout << endl; 

 Смежные вопросы

  • Нет связанных вопросов^_^