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