Thrift — это язык определения интерфейса и двоичный протокол связи [2] , используемый для определения и создания сервисов для языков программирования. [3] Он был разработан в Facebook . По состоянию на 2020 год это проект с открытым исходным кодом в Apache Software Foundation .
Он использует структуру удаленного вызова процедур (RPC) и объединяет программный стек с механизмом генерации кода для создания кроссплатформенных сервисов. В конечном итоге, Thrift может подключать приложения, написанные на различных языках и платформах, включая ActionScript , C , C++ , [4] C# , [5] Cocoa , Delphi , Erlang , Go , Haskell , Java , JavaScript , Objective-C , OCaml , Perl , PHP , Python , Ruby , Elixir , [6] Rust , Scala , Smalltalk и Swift . [7] Реализация была описана в техническом документе, опубликованном Facebook в апреле 2007 года и сейчас размещенном на Apache. [8] [9]
Thrift включает в себя полный стек для создания клиентов и серверов. [10] Верхняя часть генерируется кодом из определения Thrift. Из этого файла сервисы генерируют коды клиента и процессора. В отличие от встроенных типов, созданные структуры данных передаются в результате сгенерированного кода. Протокол и транспортный уровень являются частью библиотеки времени выполнения . С помощью Thrift можно определить службу и изменить протокол и транспорт без перекомпиляции кода. Помимо клиентской части, Thrift включает в себя серверную инфраструктуру для объединения протоколов и транспорта, например, блокирующие, неблокирующие и многопоточные серверы. Базовая часть стека ввода-вывода реализована по-разному для разных языков.
Thrift поддерживает ряд протоколов: [10]
Поддерживаемые транспорты :
ByteArrayOutputStream
внутренний код.Thrift также предоставляет ряд серверов, которые
Некоторые заявленные преимущества бережливости включают: [12]
ArrayList<String>
. С++ использует std::vector<std::string>
.Thrift написан на C++, но может создавать код для ряда языков. Чтобы создать службу Thrift, необходимо написать файлы Thrift, которые ее описывают, сгенерировать код на целевом языке, написать некоторый код для запуска сервера и вызвать его из клиента. Вот пример кода такого файла описания:
enum PhoneType { ДОМ , РАБОТА , МОБИЛЬНЫЙ , ДРУГОЙ } struct Phone { 1 : идентификатор i32 , 2 : номер строки , 3 : тип PhoneType } service PhoneService { Phone findById ( 1 : i32 id ) , list <Phone> findAll ( ) } _
Thrift сгенерирует код на основе этой описательной информации. Например, в Java это PhoneType
будет простой элемент enumвнутри Phone
класса.
Thrift — это отдельный проект Apache, который представляет собой двоичный протокол связи.
Благодаря простому и понятному языку определения интерфейса (IDL) Thrift позволяет [пользователям] определять и создавать сервисы, которые одновременно могут использоваться и обслуживаться на многих языках.
Используя генерацию кода, Thrift создает набор файлов, которые затем можно использовать для создания клиентов и/или серверов.
Помимо совместимости, Thrift может быть очень эффективным благодаря уникальному механизму сериализации, который эффективен как во времени, так и в пространстве.
Thrift поддерживает многие языки программирования тоже в разной степени.
Полный список приведен ниже.
Будьте осторожны, прежде чем предполагать, что именно потому, что ваш язык имеет некоторую поддержку, он поддерживает все функции Thrift.
Например, Python поддерживает только TBinaryProtocol.
Cocoa, C++, C#, Erlang, Haskell, Java, OCaml, Perl, PHP, Python, Ruby и Smalltalk.
Верхняя часть стека генерируется кодом из файла определения Thrift.
Результатом бережливых сервисов является создание кода клиента и процессора.
На схеме они обозначены коричневыми прямоугольниками.
Отправляемые структуры данных (кроме встроенных типов) также приводят к созданию сгенерированного кода.
В результате появляются красные прямоугольники.
Протокол и транспорт являются частью библиотеки времени выполнения Thrift.
Таким образом, с помощью Thrift вы можете определить службу и свободно менять протокол и транспорт без повторной генерации кода.
Thrift также включает в себя серверную инфраструктуру для объединения протоколов и транспорта.
Доступны блокирующие, неблокирующие, одно- и многопоточные серверы.
Часть стека «Базовый ввод-вывод» различается в зависимости от рассматриваемого языка.
Для сетевого ввода-вывода Java и Python встроенные библиотеки используются библиотекой Thrift, а реализация C++ использует свою собственную реализацию.