Он использует фреймворк удаленного вызова процедур (RPC) и объединяет программный стек с механизмом генерации кода для создания кроссплатформенных сервисов. Thrift может подключать приложения, написанные на различных языках и фреймворках, включая ActionScript , C , C++ , [4] C# , [5] Cocoa , Delphi , Erlang , Go , Haskell , Java , JavaScript , Objective-C , OCaml , Perl , PHP , Python , Ruby , Elixir , Rust , Scala , Smalltalk и Swift . [6] Реализация была описана в технической статье, выпущенной Facebook в апреле 2007 года, которая теперь размещена на Apache. [7] [8]
Архитектура
Thrift включает в себя полный стек для создания клиентов и серверов. [9] Верхняя часть — это сгенерированный код из определения Thrift. Из этого файла службы генерируют клиентские и процессорные коды. В отличие от встроенных типов, созданные структуры данных отправляются в результате сгенерированного кода. Протокол и транспортный уровень являются частью библиотеки времени выполнения . С помощью Thrift можно определить службу и изменить протокол и транспорт без перекомпиляции кода. Помимо клиентской части, Thrift включает в себя серверную инфраструктуру, такую как блокирующие, неблокирующие и многопоточные серверы. Базовая часть ввода-вывода стека реализована по-разному для разных языков программирования. [9]
Thrift поддерживает ряд протоколов: [9]
TBinaryProtocol – двоичный формат, не оптимизированный для экономии места . Быстрее обрабатывается, чем текстовый протокол.
TCompactProtocol – более компактный двоичный формат.
TJSONProtocol – использует JSON для кодирования данных.
TSimpleJSONProtocol – протокол только для записи, который не может быть проанализирован Thrift, поскольку он удаляет метаданные с помощью JSON. Подходит для анализа скриптовыми языками. [10]
Поддерживаемые транспорты :
TSimpleFileTransport – этот транспорт записывает данные в файл.
TFramedTransport – Этот транспорт требуется при использовании неблокирующего сервера. Он отправляет данные в кадрах, каждому из которых предшествует информация о длине.
TMemoryTransport – Использует память для ввода-вывода . Реализация Java использует простую ByteArrayOutputStreamвнутреннюю.
TSocket – использует блокирующий сокет ввода-вывода для транспорта.
TZlibTransport – Выполняет сжатие с использованием zlib . Используется совместно с другим транспортом.
Thrift также предоставляет ряд серверов, среди которых:
TNonblockingServer – многопоточный сервер, использующий неблокируемый ввод-вывод (реализация Java использует каналы NIO ). С этим сервером необходимо использовать TFramedTransport.
Thrift написан на C++, но может создавать код для некоторых других языков программирования. Чтобы создать Thrift-сервис, нужно написать Thrift-файлы, которые его описывают, сгенерировать код на целевом языке, написать код для запуска сервера и вызвать его из клиента. Пример такого файла описания:
enum PhoneType { ДОМАШНИЙ , РАБОЧИЙ , МОБИЛЬНЫЙ , ДРУГОЙ }структура Phone { 1 : идентификатор i32 , 2 : номер строки , 3 : тип PhoneType }служба PhoneService { Телефон findById ( 1 : i32 id ), список < Телефон > findAll ( ) }
Thrift сгенерирует код из этой описательной информации. Например, в Java, PhoneTypeбудет enumвнутри Phoneкласса.
^ "Apache Thrift - Загрузки" . Получено 27 сентября 2024 г. .
^ "Установка и использование Apache Cassandra с Java Часть 4 (Thrift Client)". Sodeso – Software Development Solutions. Архивировано из оригинала 31 марта 2022 г. Получено 30 марта 2011 г. Thrift — это отдельный проект Apache, который представляет собой двоичный протокол связи
^ Prunicki, Andrew. "Apache Thrift: Introduction". Object Computing . Архивировано из оригинала 23 июля 2011 г. Получено 11 апреля 2011 г. Используя генерацию кода, Thrift создает набор файлов, которые затем можно использовать для создания клиентов и/или серверов.
^ "ThriftRequirements". Apache Software Foundation . Архивировано из оригинала 26 февраля 2024 г. Получено 22 июня 2024 г.{{cite web}}: CS1 maint: unfit URL (link)
↑ Фред Поттер, «Использование бережливости с капучино». Архивировано 12 августа 2011 г. в Wayback Machine , невероятно сочном блоге parallel48, 10 июня 2010 г.
^ Эндрю Пруницкий. "Apache Thrift: Code Generation". Object Computing . Архивировано из оригинала 23 июля 2011 г. Получено 12 апреля 2011 г.
^ Марк Сли, Адитья Агарвал, Марк Квятковски, Thrift: Реализация масштабируемых кросс-языковых сервисов
^ "LibraryFeatures". Apache Software Foundation . 11 июля 2019 г. Архивировано из оригинала 3 мая 2024 г. Получено 21 апреля 2016 г.
^ abc Andrew Prunicki. "Apache Thrift: Introduction". Object Computing . Архивировано из оригинала 23 июля 2011 г. Получено 11 апреля 2011 г.
^ Скелтон, Стивен (3 августа 2013 г.). «Дружественное разработчикам журналирование запросов Thrift». stevenskelton.ca . Архивировано из оригинала 24 января 2024 г. . Получено 3 июля 2014 г. .