$30 off During Our Annual Pro Sale. View Details »

Владимир Ушаков – «Кодогенерация Python gRPC клиентов»

Ozon Tech
September 22, 2023

Владимир Ушаков – «Кодогенерация Python gRPC клиентов»

Ozon Tech

September 22, 2023
Tweet

More Decks by Ozon Tech

Other Decks in Technology

Transcript

  1. Ozon Tech 2023
    Автоматическая генерация
    Python gRPC клиентов
    Владимир Ушаков, специалист по тестированию
    в группе «Производство и возвраты»

    View Slide

  2. 1. Небольшое введение в gRPC
    2. Проблематика
    3. Наше решение автоматической
    генерации клиентов
    4. Итоги
    План выступления
    2

    View Slide

  3. Конвенция
    3

    View Slide

  4. Небольшое введение в gRPC
    1

    View Slide

  5. Определение
    Небольшое введение в gRPC
    5
    (Remote Procedure Calls)
    — это система удаленного вызова
    процедур (RPC) с открытым исходным кодом,
    первоначально разработанная в Google
    в 2015 году. В качестве транспорта
    используется HTTP/2, в качестве языка
    описания интерфейса — Protocol Buffers

    View Slide

  6. Примитивная схема взаимодействия микросервисов
    6
    Сервис 2
    (C#)
    Сервис 1
    (Golang)
    gPRC
    Proto-контракты
    Kafka

    View Slide

  7. Файл с расширением .proto
    Пример контракта
    7
    1. Описывается имя пакета
    2. Может быть описан сервис
    с методами
    3. Описываются типизированные
    модели запросов и ответов
    4. Protocol Buffer Compiler

    View Slide

  8. Проблематика
    2

    View Slide

  9. Как мы работаем?
    9
    • Пишем тесты на Python
    • Отдельный тестовый фреймворк
    • 30+ человек
    • Тестируем сотни микросервисов

    View Slide

  10. Проблема
    10
    • Тратим много времени на описание gRPC клиентов
    (рутинная работа)
    • Нет единого стиля, подхода работы с gRPC
    • Регулярные изменения контрактов

    View Slide

  11. Пакет grpcio-tools
    Как взаимодействовать из Python?
    11
    С помощью компилятора буфера протокола
    генерируем код из *.proto контракта под Python

    View Slide

  12. instance_picking_pb2.py
    12

    View Slide

  13. instance_picking_pb2_grpc.py
    13

    View Slide

  14. 14

    View Slide

  15. Требования
    15
    • Единообразный подход
    • Автоматизация (CI/CD)
    • Работоспособность для всех сервисов

    View Slide

  16. Как решать проблему?
    16
    • Посмотреть на решения,
    используемые в других командах
    • При условии, если что-то подойдет,
    внедрить к нам
    • Или написать свое, которое могла бы
    использовать любая команда Ozon

    View Slide

  17. Анализ решений других команд
    17
    Python client generator от смежной команды

    View Slide

  18. Анализ решений других команд
    18
    Ozbetterproto (форк проекта betterproto)

    View Slide

  19. Наше решение автоматической генерации
    3

    View Slide

  20. Общая схема процесса
    20
    Генератор
    клиентов
    Клиент 1
    Клиент 2
    Клиент 3
    Базовый
    клиент

    View Slide

  21. Пакет с базовым клиентом
    21
    • Содержит в себе логику выполнения вызова
    • Логгирование
    • Авторизацию
    • Другие вспомогательные интерсепторы

    View Slide

  22. Какие данные нужны
    для генерации клиента?
    Данные
    22
    1. Сервисы, методы, сообщения
    (grpcio-tools файлы)
    2. Знать путь до файла,
    для составления импортов

    View Slide

  23. • Принимает путь до контракта
    • Принимает версию (ветвь в git)
    • Скачивает контракт со всеми
    зависимостями
    • Все раскладывает в правильной
    структуре, в соответствии с импортами
    в контракте
    Платформа
    23
    Mimir
    Инструмент получения
    контрактов

    View Slide

  24. Запрос по рефлексии
    на gRPC сервер
    Получение контрактов
    24
    gRPC вызов на сервер
    по контракту reflection.proto,
    который позволяет понять,
    какие вообще сервисы,
    RPC-вызовы и сообщения
    есть у сервиса
    Рефлексия —

    View Slide

  25. grpcio-tools
    Генерация python-кода из контрактов
    25
    С помощью компилятора получаем python-код из полученных контрактов
    Получаем правильную
    структуру сгенерированных
    файлов

    View Slide

  26. 26
    Поиск объектов ServiceDescriptor
    Получение данных

    View Slide

  27. 27
    Jinja — это быстрый, выразительный и расширяемый шаблонизатор. Специальные
    заполнители в шаблоне позволяют писать код, аналогичный синтаксису Python.
    Затем шаблону передаются данные для визуализации окончательного документа
    Передача данных в шаблонизатор

    View Slide

  28. 28
    Пример работы с объектами в шаблоне Jinja

    View Slide

  29. Сохранение кода и сборка пакета
    29
    Jinja
    services_1.py
    services_2.py
    services_3.py
    pip package

    View Slide

  30. Общая схема генератора gRPC клиента
    30
    Получение
    контрактов
    Компилятор
    (protoc)
    Поиск
    ServiceDescriptor
    Jinja
    Сборка пакета

    View Slide

  31. Пример контракта
    асинхронного
    взаимодействия

    View Slide

  32. 32
    Git
    Второй вариант получения контрактов
    1. Клонируем репозиторий
    3. Приватные репозитории
    2. Рекурсивный поиск
    контрактов

    View Slide

  33. Proto-registry
    Третий вариант получения контрактов
    33

    View Slide

  34. Настройка CI/CD
    34
    2. Добавляем джобу в
    пайплайн сервиса
    1. Делаем джобу генерации
    клиента

    View Slide

  35. Рабочая job в pipeline разработки
    Результат
    35
    Автогенерация клиента
    при изменении
    контрактов

    View Slide

  36. Версионирование
    36
    generate
    client job
    master
    branch_1
    branch_1
    next stable
    (1.0.0 —> 1.0.1)
    next release candidat
    (1.0.0 —> 1.0.0rc0)
    next release candidat
    (1.0.0 —> 1.0.0rc1)

    View Slide

  37. Применение в тестах
    37

    View Slide

  38. Итоги
    4

    View Slide

  39. Итоги
    39
    • Имеем единый автоматизированный подход
    генерации gRPC клиентов
    • Тестировщик не выполняет рутинную работу
    по написанию/изменению клиента

    View Slide

  40. [email protected]
    Спасибо за внимание
    Владимир Ушаков, специалист по тестированию
    в группе «Производство и возвраты»

    View Slide