В этой статье мы рассмотрим, как начать работу с определением, написанием и публикацией сервисов на языке C++. Мы создадим простое приложение, чтобы помочь вам быстро понять концепцию. Основные шаги включают:
- Определение файла IDL.
- Использование репозитория для генерации кода.
- Написание сервера с использованием сгенерированного кода.
- Публикация сервиса.
- Тестирование сервиса.
Для более подробной информации о C++ см. полное руководство.
Это служба управления игровыми сценами, которая позволяет управлять персонажами, записывать информацию о персонажах, входить в сцену, перемещаться и отправлять данные о положении персонажа. Полный проект можно найти в руководстве по использованию C++Demo, где представлены основные этапы создания, сборки, публикации и тестирования.
Service-box использует свой собственный язык описания интерфейсов (IDL), который вы можете узнать из этого руководства по IDL. Вот пример того, как выглядят ваши IDL-файлы.
// demodata.idl
// Коды ошибок, связанные с бизнес-коммуникациями
enum ErrorCode {
SUCCESS,
INVALID_SCENE,
INVALID_POSITION,
ROLE_NOT_EXIST
}
// Информация о координатах
struct Position {
float x;
float y;
float z;
}
``````markdown
## Основная информация о персонаже
Структура данных `Role` содержит следующую информацию:
```cpp
struct Role {
uint64_t role_uid; // Уникальный идентификатор роли
int32_t scene_id; // ID сцены
Position pos; // Позиция персонажа
}
Структура данных SyncData
используется для синхронизации информации о персонаже:
struct SyncData {
std::vector<Role> role_info; // Информация о всех ролях
}
Файл demoscene.idl
содержит определение интерфейсов службы сцены:
// demoscene.idl
#import "demodata.idl"
// Определение интерфейса службы сцены
service dynamic Scene multiple=18 {
[no_service:csharp]
void EnterScene(uint64_t, int32_t, Position) timeout = 5000;
void Move(uint64_t, Position) timeout = 5000;
}
Файл demosynchronize.idl
содержит определение интерфейсов службы синхронизации:
// demosynchronize.idl
#import "demodata.idl"
// Определение интерфейса службы синхронизации
service Synchronize reentrant {
void SyncRoleData(SyncData);
void EnterScene(ErrorCode, uint64_t, int32_t, Position);
void Move(ErrorCode, uint64_t, Position);
}
Для написания сервера требуется начать с IDL-файла, который содержит необходимые интерфейсы и структуры данных для связи. Для демонстрационного примера используются три вышеупомянутых IDL-файла. Эти IDL-файлы должны быть расположены в директории src/repo/example
:
example
├── demodata.idl
├── demoscene.idl
└── demosynchronize.idl
Подробную информацию можно найти здесь: rpc-repo.
cd src/repo # Переходим в директорию repo
python init.py # Выполняем инициализацию репозитория
python repo.py -t cpp -i # Устанавливаем зависимости для C++
python repo.py -t cpp -a example/demodata.idl # Добавляем три idl файла, связанных с демонстрационными данными
python repo.py -t cpp -a example/demoscene.idl
python repo.py -t cpp -a example/demosynchronize.idl
> После завершения реализации `impl`, пользователю потребуется скомпилировать службу. Для быстрой компиляции также предоставлены команды в скрипте `repo`.
После завершения работы над stub'ами нам нужно будет скомпилировать их. Здесь также можно использовать `repo`.
```bash
python repo.py -t cpp -b demodata # Компиляция трех idl файлов
python repo.py -t cpp -b demoscene
python repo.py -t cpp -b demosynchronize
Публикация службы заключается в упаковывании необходимых служб в контейнер
service-box
, а затем запуске через конфигурацию.
service-box/
└── publish
├── bin
│ ├── config.default.cfg # Базовая конфигурация для запуска сервера
│ ├── pub.py # Скрипт публикации
│ └── root.html # Основная страница консоли
└── config
├── box.cfg
└── box.json # Конфигурация публикации
Необходимо создать box.json
в соответствии с вашими службами, открыть его и изменить содержимое следующим образом:
{
"binary_name" : "box",
"bundle" :
[
{
"name" : "demoscene",
"service" : "Scene"
}
],
"proxy" :
[
{
"name": "demoscene",
"proxy": "Scene"
},
{
"name": "demosynchronize",
"proxy": "Synchronize"
}
],
"stage" : "alpha",
"version" : "1.0.10"
}
Перейти в каталог bin и выполнить:
cd ../bin # Переходим в каталог сценария публикации
python pub.py -c ../config/box.json # Публикуем согласно конфигурации box.json
```publish/
└── bin
└── box # Рабочий каталог box; если это Windows, то здесь будут еще два каталога Debug и Release
├── box # Бинарник
├── box.cfg # Конфигурация запуска
└── root.html
```Наконец, используйте скрипты из директории `tools`, чтобы запустить сервис:
cd ../../tools Windows:
После успешного запуска сервера в рабочей директории box будут созданы соответствующие логи с названием в формате `box_yyyymmdd.log.0`.
## Как тестировать сервис
> В репозитории есть возможность быстро создать мок для тестирования. Подробнее о принципах работы мока читайте здесь: [mock](README-mock.md)
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )