Использование бинарного протокола iproto
TDG поддерживает работу с хранилищем данных и пользовательскими сервисами через бинарный протокол Tarantool (iproto). В частности, бинарный протокол используется коннекторами к Tarantool из разных языков программирования, таких как Python, Java, Go и другие. Полный список доступных коннекторов и примеры их использования приведены в документации Tarantool.
Бинарный протокол Tarantool обеспечивает лучшее быстродействие по сравнению с HTTP и таким образом позволяет наиболее эффективно создавать промежуточные слои бизнес-логики перед TDG. При этом выбор языка для реализации этой логики предоставляется разработчику.
В этом руководстве демонстрируется работа с данными и сервисами TDG через бинарный протокол Tarantool. Руководство включает следующие шаги:
- Настройка коннектора
- Подключение
- Запросы GraphQL
- Использование интерфейса репозитория
- Вызов сервисов
В примерах используется:
- модель данных из раздела по настройке модели данных;
- сервисы из руководства по созданию сервис-функций.
Для вызовов используется язык Python и коннектор tarantool-python. Чтобы узнать, как делать аналогичные вызовы из других языков, обратитесь к документации соответствующего коннектора.
Для возможности подключения к TDG через бинарный протокол
используется коннектор типа tarantool_protocol. Настроить коннектор
можно двумя способами:
- Через веб-интерфейс на вкладке Connectors;
- В YAML-конфигурации TDG в блоке connectors.
Пример YAML-конфигурации входящего коннектора iproto:
input:- routing_key: nulltype: tarantool_protocolis_async: truename: iproto
Подробнее о параметрах коннектора рассказывается в справочнике по настройке коннекторов.
Клиенты, которые подключаются к TDG через бинарный протокол,
используют подключение напрямую к экземпляру Tarantool, имеющему
кластерную роль connector. В связи с этим для подключения используется
учетная запись пользователя Tarantool.
Пример подключения через Python-коннектор:
from tarantool.connection import Connectionconn = Connection(server.host, server.binary_port, user='tdg_service_user', password='')
По умолчанию для подключения доступны пользователи:
tdg_service_userс пустым паролем;adminc паролем, совпадающим с cluster cookie.
При необходимости вы можете добавить других пользователей Tarantool c нужными привилегиями. Инструкции по управлению пользователями в Tarantool приведены в документации по контролю доступа в Tarantool.
После того, как подключение установлено, TDG проверяет права
клиента на выполнение каждого входящего вызова с помощью
токенов приложений. Токен передается непосредственно в вызовах функций через
iproto-соединение в аргументе credentials. Пример:
conn.call('repository.put', 'Users', obj, {}, {}, {'token': token})
Подробнее об использовании токенов приложений рассказывается в главе Авторизация.
Для отправки запросов GraphQL через бинарный протокол используется
функция execute_graphql. Её основные аргументы:
query- строка, содержащая GraphQL-запрос;variables- значения переменных, если они используются в запросе;schema- схема данных:default(пользовательские данные) илиadmin.
Пример отправки GraphQL-запроса через бинарный протокол без переменных:
resp, _ = conn.call('execute_graphql', {"query": '''query {Country {title}}''',"schema": "default",})
Пример отправки GraphQL-запроса через бинарный протокол с переменными:
resp, _ = conn.call('execute_graphql', {"query": '''query ($title: String!) {Country(title: $title) {title,phone_code}}''',"variables": {"title": "Russia"},"schema": "default",})
Пример GraphQL-вызова сервиса через бинарный протокол:
resp, _ = conn.call('execute_graphql', {"query": '''query {hello_world}''',"schema": "default",})
Пример GraphQL-вызова сервиса ` с аргументами через бинарный протокол:
resp, _ = conn.call('execute_graphql', {"query": '''query ($title: String!) {Country(title: $title) {title,phone_code}}''',"variables": {"title": "Russia"},"schema": "default",})
Подробнее о доступе к данным в TDG через GraphQL рассказываeтся в главе Запросы данных.
Функции Repository API доступны для вызова через бинарный протокол напрямую. Для вызова необходимо указать вызываемую функцию (например, repository.get) и передать её аргументы.
Пример запроса объекта по ключу через интерфейс репозитория:
resp, _ = conn.call('repository.get', ( 'Country', ['Russia']))
Пример вставки объекта через интерфейс репозитория:
resp, _ = conn.call('repository.put', ( 'Country', {'title': 'China', 'phone_code': '+86'}))
Для вызова сервисов через бинарный протокол используется функция
call_service. Её основной аргумент - имя вызываемого сервиса. Если у
него есть аргументы, они передаются в виде таблицы в следующем
аргументе.
Пример вызова сервиса без аргументов через бинарный протокол:
resp, _ = conn.call('call_service', 'hello_world')
Пример вызова сервиса с аргументами через бинарный протокол:
resp, _ = conn.call('call_service', 'get_cities', {'country': 'Russia'})