Создание заглушки#

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

Для этого создадим в домашнем каталоге пользователя sowacfg, каталог /examples, а в нем каталог /stubs, где будем размещать наши конфигурационные файлы.

Далее создадим файл sample_stub.yml и поместим туда следующее содержимое:

profile: sample_stub
version: 2.0.3
system:
  conn_count: 4096
  wrk_count: 1
  optional:
   log_level: error
service:
  !include: services/plain_service.yml

Здесь:

  • profile - имя профиля, которое впоследствии используется в качестве уникального идентификатора во всех операциях конфигурирования;

  • version - версия шаблона конфигурации, узнать версию можно с использованием команды

[sowacfg@e0085e94608b ~]$ sowa-config --version
2.0.3
  • system - секция системных настроек, которая распространяется на все сервисы профиля, если они не переопределены на уровне сервисов;

  • wrk_count - в настоящий момент обязательный параметр, определяющий количество параллельно функционирующих рабочих процессов SOWA, предназначенных для обработки запросов. В большинстве случаев рекомендуется указывать значение auto, при этом количество процессов будет равно количеству ядер процессора;

  • conn_count - в настоящий момент обязательный параметр, определяющий максимальное количество подключений на один рабочий процесс. Важно понимать, что данное значение в общем случае не равно максимальному количеству соединений, т.к. число соединений, создаваемых на одного клиента, зависит от конфигурации сервиса.

    В простейшем случае, как в заглушке, это значение будет равно максимальному количеству клиентских подключений, в случае простого http-прокси, количество максимальных подключений клиента будет ~ 4096/2, в случае использования примитива main_proxy ~4096/3 и т.д.

    В общем случае, максимальное количество одновременно обслуживаемых клиентов SOWA можно рассчитать следующим образом:

    client_max_conn = wrk_count * (conn_count/(conn_for_one_client))

  • optional - секция опциональных параметров. В настоящий момент необходимо объявить хотя бы один опциональный параметр. В качестве примера, у нас задан параметр log_level, определяющий уровень логирования информации (может быть задано одно из значений: debug, info, notice, warn, error, crit, alert, off). Ознакомиться с параметрами, которые также могут быть использованы, можно в разделе "Базовая конфигурация".

В секции service перечисляются сервисы, которые входят в состав профиля. Чтобы не перегружать конфигурационные файлы, рекомендуется давать описания сервисов в отдельных конфигурационных файлах, которые будут располагаться в подкаталоге services, а в конфигурационном файле будет использоваться их включение с использованием директивы !include.

Создадим файл plain_service.yml, который был упомянут в конфигурационном файле профиля, в каталоге services, и поместим туда следующее содержимое:

service_static:
   - id: hello_world_plain_service
     optional:
       response_code: 200
       response_body: "Hello world"
     response_headers:
       - name: Content-Type
         value: text/plain
     url: ^/hello/world
     listen:
      - port: 10012

Здесь:

  • service_static - секция определяет, что сервис реализует поведение примитива статичного веб-ресурса. Далее идет перечисление сервисов, которые реализуют данный примитив в рамках профиля (на данный момент имеется единственный сервис с идентификатором hello_world_plain_service);

  • id - идентификатор сервиса внутри профиля, данное значение является обязательным и уникальным в контексте профиля;

  • optional - секция, определяющая опциональные параметры сервиса, в данном случае мы используем два параметра:

    • response_code - HTTP - статус ответа, который будет возвращен клиенту в результате обращения;

    • response_body - тело ответа в виде строки.

  • response_headers - перечисление возвращаемых заголовков ответа в виде имя/значение;

  • url - обязательный параметр, определяющий регулярное выражение, ограничивающее контекст сервиса (с учетом регистра символов);

  • listen - параметры слушателя, перечисление структур вида параметр listen, которые определяют настройки приема соединения с клиентом. В нашем случае используется только параметр port, определяющий, на каком порту будут приниматься соединения с клиентом (может использоваться и несколько портов, в этом случае должно быть соответствующее количество элементов в перечислении);

После того как изменения были сохранены, нужно добавить профиль в реестр и сконфигурировать его.

Добавить новый профиль в реестр профилей:

[sowacfg@tkle-ish0038 stubs]$ sowa-config --add-profile sample_stub
Profile "sample_stub" was successfully created

Сконфигурировать профиль:

[sowacfg@tkle-ish0038 stubs]$ sowa-config --config sample_stub.yml
Profile "sample_stub" was successfully configured.

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

[sowacfg@tkle-ish0038 stubs]$ sowa-config --config sample_stub.yml --log-type=file
Inclusion of the incorrect path: services/plain_servic.yml(/home/sowacfg/examples/stubs/services/plain_servic.yml)

Проверим, что профиль корректно создался:

[sowacfg@tkle-ish0038 stubs]$ sowa-config --show-profile
Profiles:
 sample_stub, configured=True, MainPID=0

Попробуем запустить профиль:

[sowacfg@tkle-ish0038 stubs]$ sowa-config --run sample_stub
Profile "sample_stub" was successfully started.

Проверим, что профиль запущен:

[sowacfg@tkle-ish0038 stubs]$ sowa-config --show-profile
Profiles:
 sample_stub, configured=True, MainPID=14710

Отличное от нуля значение в MainPID говорит о том, что профиль запущен корректно.

Для проверки работоспособности нашего сервиса необходимо отправить простой GET запрос:

[sowacfg@tkle-ish0038 stubs]$ curl -v http://localhost:10012/hello/world
* About to connect() to localhost port 10012 (#0)
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 10012 (#0)
> GET /hello/world HTTP/1.1
> User-Agent: curl/7.29.0
> Host: localhost:10012
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Mon, 05 Apr 2021 08:45:12 GMT
< Content-Type: text/plain
< Content-Length: 11
< Connection: keep-alive
< Server: SOWA
<
* Connection #0 to host localhost left intact