Балансировка на основании содержимого запроса JSON с валидацией#
Немного модифицируем условия, добавив необходимость предварительной валидации тела запроса, т.е. сначала проверим на соответствие схеме, и, если запрос соответствует схеме валидации, тогда пропускаем его и балансируем на нужную группу.
Добавим еще один сервис со следующей конфигурацией:
- id: 2
allowed_queries:
- method: post
url: /balancer_with_validation$
listen:
- port: 20201
modifiers:
set_output_headers:
- headers:
- REGION $clj_region
chains:
request_chains:
- actions:
- action: JsonValidation
params:
validation_schema: {type: file, path: schemas/test_schema.json}
actions:
- action: JsonPathExtractToVars
params:
expressions:
- path: $.region
var: clj_region
message: $clj_request_body
upstream_bind_variable: $sel_upstream
upstream_groups:
- id: 2
servers:
- server: 127.0.0.1:30000
bind_condition: group_2
rewrite_uri:
- from: /balancer_with_validation
to: /test
- id: 1
servers:
- server: 127.0.0.1:30001
bind_condition: group_1
rewrite_uri:
- from: /balancer_with_validation
to: /test
default: True
Здесь, кроме url сервиса, отличия заключаются только в модификации цепочки действий над запросами - в ней мы определяем корневым действием JsonValidation, а в нем, как дочернее, определяем описанное нами ранее действие JsonPathExtractToVars.
Опишем простую схему валидации test_schema.json, в котором для запроса определено единственное возможное свойство - region с типом string, при этом запретим наличие других свойств в объекте:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"region": {
"type": "string"
}
},
"additionalProperties": false,
"required": [
"region"
]
}
Создадим каталог /sowa/profile_storage/custom/test_chain/schemas и поместим туда файл test_schema.json. Остановим профиль, переконфигурируем его и запустим. После чего отправим запрос для проверки:

Как видим, запрос не прошел, так как он не соответствует схеме валидации. Отправим корректный запрос:

В данном случае запрос обработан корректно.