softpro-junior-assignment
Деплой руками (как только разберусь до конца с Docker + CI обязательно пофиксю это):
- Скомпилируйте приложение с помощью инструмента
go
.
- Установите PostgreSQL Server и создайте базу данных с именем "sja_dev"
или с вашим кастомным именем, но нужно чтоб оно было таким же, как и в конфиге, про который будет рассказано далее.
- Составьте конфиг приложения и положите его рядом с исполняемым файлом. Этот шаг можно пропустить, тогда приложение запустится
с дефолтной конфигурацией.
- Один раз запустите приложение с флагом
-setschema
, это создаст таблицы в базе данных (но уничтожит существующие данные!).
- Приложение готово к работе. Также у приложения есть еще один флаг:
-prod
. Этот флаг
не позволяет запустить приложение без конфига. Также если предоставлен этот флаг, то флаг -setschema
будет проигнорирован.
Еще можно запустить приложение с флагом -help
который выведет сводную информацию по имеющимся у приложения флагам.
- Для корректного останова сервиса нажмите enter (это завершит воркеры и закроет соединение с db).
Конфиг
Если конфиг не предоставлен (файл .config), то приложение запустится с дефолтной конфигурацией, указанной ниже.
Конфиг должен находится в той же папке, что и исполняемый файл. Данные в нем указываются в формате JSON.
Пример конфигурационного файла с настройками по умолчанию:
{
"http_port": 9000,
"http_ip": "localhost",
"grpc_port": 9001,
"grpc_ip": "localhost",
"lines_provider_port": 8000,
"lines_provider_ip": "localhost",
"log_mode": false, // если включено, то будет производиться логирование запросов к бд в файл log.log рядом с исполняемым файлом
"first_sync_num_of_attempts": 3, // кол-во попыток подключения к LinesProvider
"first_sync_interval_bw_attempts": 1, // интервал м/д попытками в секундах
"intervals": {
"baseball": 1,
"football": 1,
"soccer": 1
},
"database": {
"host": "localhost",
"port": 5432,
"user": "postgres",
"password": "123",
"name": "sja_dev"
}
}
О реализации:
- Прошу прежде всего заметить, что в силу того, что мне выдали задание на неделю позже,
я успел разобраться только с gRPC+protobufs, но не с Docker-ом и CI, поэтому высылаю то, что есть, а именно:
полностью реализованный в соответствии с требованиями задания сервис.
- Не знаю, как организовывать правильно код в MVC паттерне с gRPC и вообще, подходит ли он здесь, поэтому
никакой паттерн не использовал, только разбиение на исходники.
- Если логирование отключено (параметр "log_mode" в конфиге),
то будут только ошибки от db в stdout логироваться + любые сообщения (включая ошибки) от приложения.
- По ходу реализации возникало множество вопросов, некоторые неразрешенные из них остались в виде "todo" в коде.
- В директории /client располагается тестовый gRPC клиент. Все остальные файлы и директории относятся к gRPC серверу.
- protobuf определения сервиса и сообщений находятся в /pb/softpro-junior-assignment.proto