gRPC и приведение числовых типов

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

В отличие от int, тип unsigned int может хранить только положительные целые числа.

В языке Dart нет такого понятия как unsigned int, в то время как в языке go есть возможность использовать данные числовые типы (uint8 , uint16 , uint32 , uint64).

В языке proto3 тоже есть возможность использования uint32 и uint64.

Я решил провести эксперимент и сделать клиент на Dart, сервер на go, и попробовать отправить отрицательные значения в полях предназначенных для uint32 и uint64.

Сейчас представлю четыре варианта потенциального исхода (что же произойдет если отправить -1 или -9223372036854775808 в поле предназначенном для uint)?

Как вы думаете, что произойдет в данном случае?

  1. gRPC плагин на Dart не соберет файлы для клиента

  2. При отправке сообщения возникнет ошибка

  3. Сообщение c числом x будет отправлено, сервер интерпретирует его как 0

Любопытные могут посмотреть ответ в конце статьи. А я расскажу о том, как проводился сам эксперимент.

Шаг 1 - пишем необходимый для теста proto файл.

Определяем тип синтаксиса, пакеты, сервис и заветное сообщение содержащие положительные int.

Шаг 2 - Делаем пустое приложение dart, go, генерируем код для grpc и добавляем зависимости

Для всех этих действий нужен следующий ряд команд:

  • dart create console-full

  • protoc some/folder/api.proto --dart_out=grpc:.

  • protoc other/folder/api.proto --go-grpc_out=. --go_out=.

  • dart pub add fixnum

  • dart pub add protobuf

  • dart pub add grpc

  • go mod tidy

Шаг 3 - Пишем сервер на го

Шаг 4 - Пишем клиент на dart

Шаг 5 - проверяем

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

Запускаем сервер, клиента и получаем:

Ошибка содержит следующий текст:

Illegal to set field first (3) of api.Inp to value (-1): out of range for unsigned 32-bit int

Что означает, что ошибка типа была обнаружена в рантайме.

Следует быть аккуратнее при использовании данных типов вызовов из dart, так как на этапе компиляции никаких ошибок не было, ошибка произошла при вызове метода в рантайме, что является большей проблемой в виду необходимости написания дополнительного кода для проверки чисел на клиентской стороне.

Как можно проичтать в официальной [документации](https://developers.google.com/protocol-buffers/docs/proto3), gRPC поддерживает приведение типов между несколькими языками, но некоторые пограничные случаи лучше дополнительно проверять вручную.

Источник: https://habr.com/ru/post/596785/


Интересные статьи

Интересные статьи

Если вы используете монорепозиторий, то взаимодействие между клиентом и сервером с общей моделью данных будет проблемой. Без обслуживания дублирование кода приведет к рассинхронизации.Если модель данн...
Сегодня я расскажу о том, как мы можем с помощью типов написать простое расширение для ExpressJS.А если вы в&n...
В предыдущих постах серии о service mesh мы говорили о настройке инфраструктуры для модернизации нашей микросервисной архитектуры и архитектуры балансировки нагрузки, а т...
VUE.JS - это javascript фрэймворк, с версии 18.5 его добавили в ядро битрикса, поэтому можно его использовать из коробки.
Сравнивать CRM системы – дело неблагодарное. Очень уж сильно они отличаются в целях создания, реализации, в деталях.