Shardy

Shardy — это фреймворк для онлайн игр и приложений на Node.js. Он предоставляет базовую функциональность для построения микросервисных решений: мобильных, социальных, веб, многопользовательских игр, приложений реального времени, чатов, middleware сервисов и т.п.

Зачем использовать Shardy?

Начните свой проект или backend для мобильной игры с Shardy и будьте уверены в:

  • простоте использования: работайте с удобным API и не задумывайтесь о том, как это работает под капотом
  • масштабируемой архитектуре: используйте существующие или создавайте свои собственные микросервисы, связывайте их вместе и масштабируйте свое приложение
  • быстродействии и легкости: основная сетевая архитектура, основанная на Node.js, без использования сторонних библиотек
  • полноте документации: Shardy предоставляет хорошую документацию со всеми необходимыми разделами и ссылками на API, также весь код снабжен комментариями

Возможности

  • микросервисная парадигма
  • простой API: запросы, команды, подписки и т.п.
  • транспорт данных через сокеты и вебсокеты
  • легкость и быстрота: Node.js и TypeScript
  • поддержка пользовательской сериализации
  • поддержка пользовательской валидации рукопожатий (handshake)
  • продвинутый логгер: теги, фильтры, области
  • встроенный клиент на Typescript
  • гибкое расширение
  • справочные материалы: документация, сниппеты, примеры
  • почти нулевая конфигурация

Основная цель Shardy — предоставить простое бесплатное решение для создания многопользовательских онлайн игр.

Громко сказано конечно 😁 Но такие планы есть. Не претендую на академическую правильность архитектуры и кода, делал в первую очередь для своих нужд. Но как показал опыт: зачастую многие принципы ООП, чистого кода, использование паттернов в «нужных» местах, разбиваются о реальность конкретного проекта.

Документация

Старался написать исчерпывающую документацию и добавить примеров, со всем этим добром можно ознакомиться на Github. Английский да, куда ж без него. Содержание доки примерно такое:

  • что такое Shardy
  • для кого и почему
  • библиотеки
  • зачем использовать Shardy
  • планы
  • структура команды
  • запуск HelloWorld
  • описание окружения
  • связь между сервисами
  • создание сервиса с нуля
  • валидация
  • сериализация
  • загрузка команд
  • использование шаблона
  • дебаг и логирование
  • использование БД
  • масштабирование
  • запуск в прод
  • справочник всех классов

Unity клиент

Клиент Shardy поддерживает сборки под iOS, Android и WebGL. Он предоставляет RPC-фреймворк с простым и удобным API для взаимодействия с Shardy-сервисами.

  • простой API: запросы, команды, подписки и т.п.
  • транспорт данных через сокеты и вебсокеты
  • iOS, Android и WebGL поддержка
  • легкий и быстрый
  • поддержка пользовательской сериализации
  • поддержка пользовательской валидации рукопожатий (handshake)
  • настраиваемый heartbeat для соединения
  • не используются сторонние библиотеки

Установить можно как пакет, через Package Manager или скачать со страницы релизов и добавить в проект.

Есть своя, тоже довольно полная документация и демо в котором можно посмотреть как использовать методы клиента и какие есть опции.

Простой пример инициализации клиента и выполнение RPC запроса:

_client = new Client(new MyHandshake(), new MySerializer());
_client.OnConnect += OnConnect;
_client.OnDisconnect += OnDisconnect;
_client.OnReady += OnReady;

void OnConnect(bool status) {
// connect event
// status is a flag indicating whether the connection is successful or not

// here you can send the handshake data if it was not passed through constructor
//
// if handshake data passed through constructor you shouldn't invoke Handshake() method manually
    if (status) {
        var data = Encoding.UTF8.GetBytes("handshake_data");
        _client.Handshake(data);
    }
}

void OnDisconnect(DisconnectReason reason) {
// disconnect event with reason
}

void OnReady() {
// ready event, client has successfully completed the handshake
//
// ready for receive and send data
    _client.Request("test", (response) => {
        Console.WriteLine($"received test data: ${response.ToString()}");
    });
}

_client.Connect("127.0.0.1", 30000);

Все исходники Unity клиента доступны на Github

Шаблон сервиса

Для того чтобы лучше разобраться как начать использовать Shardy, сделал шаблон сервиса в котором есть несколько примеров, показывающих как использовать Shardy API с помощью бота:

  • стартер приложения
  • заглушка валидатора
  • простой сериализатор
  • пример сервиса
  • примеры команды и запросов
  • загрузчик команд
// запрос
const response = await this.bot.fetch('status');
this.bot.log.info(`test fetch answer: ${response.data}`);

// запрос с колбеком
this.bot.request('status', (response) => {
    this.bot.log.info(`test request answer: ${response.data}`);
});

// запрос с данными
this.bot.request('status', (response) => {
    this.bot.log.info(`test request with data, answer: ${response.data}`);
}, Buffer.from('request_data'));

// запрос с ошибкой в ответе
this.bot.request('fail', (response) => {
    if (response.error.length > 0) {
        this.bot.log.error(`test request fail: ${response.data}`);
    }
});

// команда
this.bot.command('notify');

// команда с данными
this.bot.command('notify', Buffer.from('command_data'));

Кроме того, шаблон включает простые примеры валидатора (handshake) и сериализации.

Пример игры

Ну и конечно есть исходники простенькой онлайн игры «Крестики-Нолики»: как серверная часть, так и клиентская. Всё можно посмотреть, поковырять, запустить у себя и попробовать поиграть. Весь код старался комментировать, иногда даже излишне.

Вот список того, что вы не найдёте в примере

  • переподключение к игре
  • сохранение результатов в БД
  • различная «защита от дурака»
  • правильная структура файлов

Это простейший сервер для Крестиков-Ноликов, не ожидайте что тут будет полная функциональность, это демо :)

Планы

Планы реально грандиозные! Развитие экосистемы для разработчиков, которые смогут создавать свои игры на основе существующих или собственных Shardy-сервисов, почти как из готовых блоков.

Ниже список сервисов которые планирую сделать:

  • сервис обнаружения
  • мониторинг
  • резервное копирование

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

  • сервис статики
  • авторизация
  • уведомления
  • чаты
  • покупки
  • достижения
  • реклама
  • удалённый конфиг
  • liveops штуки

Но пока это довольно голый фреймворк, основа, без полезной нагрузки в виде готовых каких-то модулей, сервисов, примеров.

Все исходники доступны на Github