Лабораторная работа №7
Иллюстрация
$ make
# run gateway
$ make run-gateway
Server listening on 0.0.0.0:8080
# in the new window run grpc service
$ make run-grpc-service
Server listening on 0.0.0.0:9090
# send request to gRPC server via gateway
$ curl --header "Content-Type: application/json" \
--request POST \
--data '
{
"data": "world"
}
' \
http://localhost:8080/v1/hello
{
"data": "Hello world"
}
# send request to gRPC server
$ grpc_cli ls 0.0.0.0:9090
$ grpc_cli ls 0.0.0.0:9090 echo.Echo -l
$ grpc_cli call 0.0.0.0:9090 echo.Echo.Hello "data: 'world'"
# build grpc_cli see: https://github.com/grpc/grpc/blob/master/doc/command_line_tool.md
Задание
Реализовать suggest сервис, обрабатывающий POST запрос по следующему URL: /v1/api/suggest
.
Клиент отправляет запрос следующего формата:
{
"input": "hel"
}
В поле input
находится часть текста, который клиент хочет ввести.
На данный запрос сервис должен предложить варианты того, что клиент возможно хочет ввести.
Пример ответа:
{
"suggestions": [
{
"text": "hello",
"position": 0
},
{
"text": "hello world",
"position": 1
},
{
"text": "helm",
"position": 2
}
]
}
В случае если сервису нечего предложить он возвращает пустой массив suggestions
.
Сервис варианты ответа считывает при инициализации и обновляет в ходе работы
из конфигурационного файла suggestions.json в коллекцию suggestions
.
Обновление коллекции suggestions
происходит каждые 15 минут.
Пример содержимого фала suggestions.json:
[
{
"id": "hel",
"name": "hello world",
"cost": 70
},
{
"id": "hel",
"name": "hello",
"cost": 10
},
{
"id": "hel",
"name": "helm",
"cost": 200
}
]
Для синхронизации доступа к коллекции suggestions
стоит использовать std::shared_mutex
.
Read блокировка осуществляется в коде обработчика, а Write блокировка в функции обновления коллекции suggestions
.
Поле cost
определяет значение поля position
: чем больше cost
тем меньше значение position
.
(чем ниже стоимость, тем выше вариант)
Tips
Использую шаблон данной лабораторной работы необходимо выполнить, согласно заданию, следующие шаги:
- Создать директорию
$HOME/go/src/github.com/<group-repo>/
и склонировать в нее данный репозиторий
- Выполните следующую инструкцию
export PATH=$PATH:$HOME/.linuxbrew/bin
- Выполнить команду
make config
внутри репозитория для настройки конфигурации компонента gateway.
- Изменить спецификацию protos/echo.proto
- Изменить код обработчика в sources/main.cpp
- Проверить работособность с помощью curl (пример смотри в секции Иллюстрация)
message Suggest {
string text = 1;
uint32 position = 2;
}
message SuggestResponse {
repeated Suggest suggestions = 1;
}
Links