lab-07-grpc-service-yuna

command module
v0.0.0-...-6cce464 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 19, 2021 License: MIT Imports: 8 Imported by: 0

README

Лабораторная работа №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

Использую шаблон данной лабораторной работы необходимо выполнить, согласно заданию, следующие шаги:

  1. Создать директорию $HOME/go/src/github.com/<group-repo>/ и склонировать в нее данный репозиторий
  2. Выполните следующую инструкцию export PATH=$PATH:$HOME/.linuxbrew/bin
  3. Выполнить команду make config внутри репозитория для настройки конфигурации компонента gateway.
  4. Изменить спецификацию protos/echo.proto
  5. Изменить код обработчика в sources/main.cpp
  6. Проверить работособность с помощью curl (пример смотри в секции Иллюстрация)
message Suggest {
  string text = 1;
  uint32 position = 2;
}

message SuggestResponse {
  repeated Suggest suggestions = 1;
}

Documentation

The Go Gopher

There is no documentation for this package.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL