1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/dennis-kk-service-box

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README-cpp_quick_start.md 8.6 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 10.03.2025 00:55 ea35d5f

Быстрый старт: Демо на C++

В этой статье мы рассмотрим, как начать работу с определением, написанием и публикацией сервисов на языке C++. Мы создадим простое приложение, чтобы помочь вам быстро понять концепцию. Основные шаги включают:

  1. Определение файла IDL.
  2. Использование репозитория для генерации кода.
  3. Написание сервера с использованием сгенерированного кода.
  4. Публикация сервиса.
  5. Тестирование сервиса.

Для более подробной информации о C++ см. полное руководство.

Обзор

Это служба управления игровыми сценами, которая позволяет управлять персонажами, записывать информацию о персонажах, входить в сцену, перемещаться и отправлять данные о положении персонажа. Полный проект можно найти в руководстве по использованию C++Demo, где представлены основные этапы создания, сборки, публикации и тестирования.

Определение вашего файла IDL

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);
}

Использование repo для генерации кода

Для написания сервера требуется начать с IDL-файла, который содержит необходимые интерфейсы и структуры данных для связи. Для демонстрационного примера используются три вышеупомянутых IDL-файла. Эти IDL-файлы должны быть расположены в директории src/repo/example:

example
├── demodata.idl
├── demoscene.idl
└── demosynchronize.idl

Подробная информация

Подробную информацию можно найти здесь: rpc-repo.

Команды для работы с 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:

  1. start start_win_local_env.bat
  2. start start_win_box.bat Linux: bash start_linux_local_env.sh bash start_linux_box.sh

После успешного запуска сервера в рабочей директории box будут созданы соответствующие логи с названием в формате `box_yyyymmdd.log.0`.


## Как тестировать сервис

> В репозитории есть возможность быстро создать мок для тестирования. Подробнее о принципах работы мока читайте здесь: [mock](README-mock.md)

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/dennis-kk-service-box.git
git@api.gitlife.ru:oschina-mirror/dennis-kk-service-box.git
oschina-mirror
dennis-kk-service-box
dennis-kk-service-box
v0.4.0-alpha