Автор: Томаш Лелек

Stargate упрощает разработчикам создание приложений на Apache Cassandra®. Новый gRPC API Stargate позволяет использовать Java для вызова любого микросервиса в любом облаке.

Разработчики должны иметь возможность создавать приложения с высокой степенью масштабируемости, даже если они вызывают многоязычные и многооблачные микросервисы. Вот почему команда Stargate недавно сделала общедоступным новый API, чтобы помочь разработчикам создавать приложения на предпочитаемом ими языке.

Новый API называется Удаленный вызов процедур gRPC (gRPC), и мы построили его на платформе, созданной Google. В этом посте мы покажем вам, как легко начать использовать этот API из экосистемы Java. Мы также объясним основные методы, предоставляемые клиентам, которые позволяют нам взаимодействовать с gRPC API.

Установка проста. Сгенерированный код на основе файлов protobufquery.proto» и «stargate.proto») поставляется с зависимостью grpc-proto. В вашем клиентском приложении вам нужно добавить только две зависимости: клиент и поставщик услуг функционального канала. В этом примере мы выбрали netty:

Если вы не добавите grpc-netty-shaded, вы получите следующую ошибку:

Когда у нас будут все необходимые зависимости, мы сможем использовать API-интерфейс Stargate gRPC-stub.

После этого шага у вас должен быть StargateGrpc в пути к классам из зависимости grpc-proto. Он содержит логику взаимодействия с API Stargate gRPC.

Использование Stargate gRPC API

Когда у нас есть сгенерированный код с классом StargateGrpc, поставляемым в зависимости grpc-proto, мы готовы создать клиент.

Прежде чем углубляться в код, нам нужно сгенерировать токен авторизации, который будет использоваться для выполнения авторизации. Пожалуйста, посетите Документацию Stargate Authz для получения руководства по этому вопросу. Вот некоторый код, который будет работать для наших нужд:

В этом фрагменте мы предполагаем, что Stargate работает на localhost:8081. Получив это, мы можем подключиться к gRPC API. Во-первых, нам нужно сгенерировать Channel, который используется для выполнения соединения:

Обратите внимание, что usePlaintext() следует использовать только для разработки и тестирования. При использовании в производственной среде следует использовать балансировщик нагрузки, завершающий безопасность транспортного уровня (TLS). Для локальной разработки Stargate это будет:

Далее мы можем сгенерировать заглушку StargateGrpc. Существует два способа взаимодействия с gRPC API. Первый — синхронный (блокирующий):

Второй способ взаимодействия — асинхронный (неблокирующий):

В этом примере мы сосредоточимся на подходе с блокировкой, поскольку его проще проиллюстрировать. Имейте в виду, что для вашего варианта использования вам может потребоваться использовать второй подход.

Нам нужно настроить CallCredentials, используя token-value, сгенерированный на предыдущем шаге. Будем считать, что все запросы выполняются в пределах существующего пространства ключей ksи таблицы test. Определение таблицы следующее:

API Stargate gRPC позволяет выполнять два типа запросов: стандартные запросы CQL и пакетные запросы, содержащие N запросов CQL.

Создайте и выполните стандартный запрос с помощью gRPC API.

Когда мы хотим выполнить стандартный запрос, мы можем начать с вставки записи с помощью заглушки gRPC:

Это создаст и выполнит один запрос. Затем мы можем получить вставленные записи:

Если мы распечатаем результирующий набор, он будет иметь следующую структуру:

Значение содержит двоичные данные, которые мы можем десериализовать. Во-первых, нам нужно развернуть результирующий набор:

Мы можем получить все строки с помощью метода getRowsList() и перебрать результат или получить конкретную строку, используя ее индекс, и передать ее методу getRows(int index). Мы выбрали последний подход в приведенном выше примере.

В нашем поисковом запросе (SELECT k, v FROM ks.test) явно указано, какие столбцы следует извлечь. Из-за этого мы можем безопасно получать значения, используя их позиции с помощью метода getValues().

getString() и getInt() выполняют десериализацию данных. Эти методы использовались, потому что мы знали базовый тип соответствующих столбцов. API также предоставляет служебные методы для десериализации большего количества типов. Полный список доступных типов см. в разделе value файла query.proto. Если вы хотите перебрать все результаты, вы можете использовать этот фрагмент:

Это позволит вам работать с одной строкой. Выполнив его, вы получите следующее:

Выполнение пакетных запросов с помощью Stargate gRPC API

Если мы хотим выполнить N запросов, мы можем использовать метод executeBatch:

Это принимает Batch в качестве аргумента. Batch может содержать N запросов типа INSERT, UPDATE или DELETE. Мы добавляем два запроса через метод addQueries. Подробнее об обработке запроса Batch можно узнать в Пакетной документации.

Теперь вы знаете, как интегрировать клиент gRPC через blockingStub. Если вы хотите углубиться в это, взгляните на Документацию Java Client по gRPC.

Подпишитесь на Технический блог DataStax, чтобы узнать больше историй разработчиков. Посетите наш канал YouTube для учебных пособий и здесь для разработчиков DataStax в Twitter, чтобы узнать последние новости о нашем сообществе разработчиков.

Ресурсы

  1. Присоединяйтесь к сообществу Звездных врат
  2. Создавайте приложения быстрее с помощью API Stargate
  3. Использование клиентов Stargate gRPC API для Rust, Go и Node.js
  4. Представляем дизайн для Stargate v2
  5. Взрыв в Звездные врата с помощью HTTPie