Использование бинарного протокола iproto¶
TDG поддерживает работу с хранилищем данных и пользовательскими сервисами через бинарный протокол Tarantool (iproto). В частности, бинарный протокол используется коннекторами к Tarantool из разных языков программирования, таких как Python, Java, Go и другие. Полный список доступных коннекторов и примеры их использования приведены в документации Tarantool.
Бинарный протокол Tarantool обеспечивает лучшее быстродействие по сравнению с HTTP и таким образом позволяет наиболее эффективно создавать промежуточные слои бизнес-логики перед TDG. При этом выбор языка для реализации этой логики предоставляется разработчику.
В этом руководстве демонстрируется работа с данными и сервисами TDG через бинарный протокол Tarantool. Руководство включает следующие шаги:
В примерах используется:
модель данных из раздела по настройке модели данных;
сервисы из руководства по созданию сервис-функций.
Для вызовов используется язык Python и коннектор tarantool-python. Чтобы узнать, как делать аналогичные вызовы из других языков, обратитесь к документации соответствующего коннектора.
Настройка коннектора¶
Для возможности подключения к TDG через бинарный протокол используется
коннектор типа tarantool_protocol
. Настроить коннектор можно двумя способами:
Через веб-интерфейс на вкладке Connectors;
В YAML-конфигурации TDG в блоке connectors.
Пример YAML-конфигурации входящего коннектора iproto:
input:
- routing_key: null
type: tarantool_protocol
is_async: true
name: iproto
Подробнее о параметрах коннектора рассказывается в справочнике по настройке коннекторов.
Подключение¶
Клиенты, которые подключаются к TDG через бинарный протокол, используют
подключение напрямую к экземпляру Tarantool, имеющему кластерную роль connector
.
В связи с этим для подключения используется учетная запись пользователя Tarantool.
Important
Здесь используются пользователи, созданные в самом Tarantool, а не пользователи TDG. Подробнее об управлении пользователями Tarantool рассказывается в документации по контролю доступа в Tarantool.
Пример подключения через Python-коннектор:
from tarantool.connection import Connection
conn = Connection(server.host, server.binary_port, user='tdg_service_user', password='')
По умолчанию для подключения доступны пользователи:
tdg_service_user
с пустым паролем;admin
c паролем, совпадающим с cluster cookie.
При необходимости вы можете добавить других пользователей Tarantool c нужными привилегиями. Инструкции по управлению пользователями в Tarantool приведены в документации по контролю доступа в Tarantool.
После того, как подключение установлено, TDG проверяет права клиента
на выполнение каждого входящего вызова с помощью токенов приложений.
Токен передается непосредственно в вызовах функций через iproto-соединение
в аргументе credentials
. Пример:
conn.call('repository.put', 'Users', obj, {}, {}, {'token': token})
Подробнее об использовании токенов приложений рассказывается в главе Авторизация.
Запросы GraphQL¶
Для отправки запросов 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",
})
Note
Вызов сервисов через бинарный протокол напрямую описан в разделе Вызов сервисов.
Подробнее о доступе к данным в 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'})