Pull to refresh

Comments 20

Для начала нам нужно найти библиотеку в системе, для этого необходимо написать FindLibEvent.cmake

но зачем? Насколько я понимаю, libevent ожидает что его будут искать через pkg-config. А для работы с ним в cmake есть соответствующий модуль, FindPkgConfig


Рассматривали ли какие-нибудь другие библиотеки, например lithium?

pkg-config показался менее лаконичным. Вообще это один из способов который меня устроил и я не настаиваю на нем как на единственно правильном. С литиумом не работал, но думаю можно посмотреть что это такое.

Ну и с чего же начать писать микросервис на Си++?
Вы тут показали как с горем пополам обработать хттп запрос на си++. Это конечно очень круто, но право же не понятно как связанно с микросервисом.
Лучше расскажите как ваш микросервис пишет логи, как общается с базами и другими сервисами, как обрабатывает ошибки, как он скейлится, живет в контейнере или просто так и почему, в чем для вашего проекта выигрыш от микросервисов и насколько они микро, как реализованно управление деплоями и версионированием всего этого добра, есть ли явные преимущества у сервиса на плюсах с сервисами написанными на других ЯП, используете ли крутые фишки 20 плюсов или все по-старинке на 11 (а может даже на 03 )?
Не было ли попыток создать свой опен-сорсный враппер над libevhttp чтобы было удобней им пользоваться?

Не думаю что эти темы для "начала" и + это не обзор микросервисов и стандартов языка

с чего начинается Родина…
С чего начать писать микросервис на C++

С молитвы и жертвоприношения :-)
Не понятно почему RPC (от Google) не подойдет под задачи микросервисов. При том что там так же есть Stream-ы в любое направление.
для работы по http рассматривали boost::beast?

Не хочется использовать сокеты. Libevent подкупил встроенным маршрутизатором.

Библиотека libevent предоставляется в составе пакета libevent-dev и стоит из коробки на множестве unix-подобных ОС.
Так как это микросервис и должен быть в контейнере (о чём в статье ни слова), то наличие этого пакета в дистрибутиве не принципиально, тем более, что для контейнеров чаще всего используют минимальный Alpine, а не Debian.
Далее, устанавливать пакет для разработки опять же не обязательно, так как libevent лежит в публичном доступе: github.com/libevent/libevent
Поэтому всё вышеописанное применение CMake можно значительно упростить (и будет работать под любой ОС, не придётся ни чего переписывать для Windows), примерно так
        FetchContent_Declare(
          libevent
          GIT_REPOSITORY https://github.com/libevent/libevent
          GIT_TAG        ${LIBEVENT_VERSION}
        )

        # setup specific options

        # fetch libevent
        FetchContent_MakeAvailable( libevent )

    set( LIBEVENT_FOUND true PARENT_SCOPE )
    set( LIBEVENT_VERSION ${LIBEVENT_VERSION} PARENT_SCOPE )
    set( LIBEVENT_ROOT ${libevent_SOURCE_DIR} PARENT_SCOPE )
    set( LIBEVENT_INCLUDE_DIRS ${libevent_SOURCE_DIR}/include PARENT_SCOPE )
    set( LIBEVENT_LIBRARIES libevent )
    set( LIBEVENT_LIBRARIES ${LIBEVENT_LIBRARIES} PARENT_SCOPE )

пример написан тут, возможны ошибки. Правильно было бы ещё использовать mark_as_advanced, но не обязательно.

В контейнерах использую минимальный дебиан(не полноценный), а сами сервисы крутятся в закрытой сети. А про то как их паковать в контейнеры, я планировал отдельный пост.

Суть комментария была в том, что можно каждый раз при полной сборке, клонировать репозиторий libevent и брать нужную версию для своего сервиса, и делать это будет CMake самостоятельно, при этом это переносимо, потому что libevent будет модулем для вашего приложения, а не системной библиотекой.
Плюсы — быстрое обновление до новой версии и полный контроль над версиями библиотеки. Для классического сервера это скорее недостаток, а для контейнера, где «всё своё ношу с собой» это достоинство.
Ну и я, лично, не уверен, что минимальный (неполноценный) Debian, как Вы сами пишите, будет безопасней полноценного Alpine для которого так же существует отдельный пакет
pkgs.alpinelinux.org/package/edge/main/x86_64/libevent-dev
если уж не хочется связываться с модульной сборкой.
Но решать конечно Вам.

Спасибо за комментарий, будет интересно про это почитать)

// Так лучше память не выделять

например можно использовать std::unique_ptr<char[]> или shared_ptr
в конкретном случае можно вообще создать std::string длинны length и скопировать данные прямо в него — у него есть гарантия размера и непрерывности

На c++ лучше boost::beast — тут тебе и умные указатели, и современный c++, да еще и вебсокеты.
вместо:
char* data = new char[length]; 
evbuffer_copyout(input, data, length); 
std::string body(data, length);
delete[] data;
можно:
auto data = std::make_unique<char[]>(length + 1); // уже будет заполнен '\0'
evbuffer_copyout(input, data.get(), length);
return std::string(data.get())
Sign up to leave a comment.

Articles

Change theme settings