Проект "Превьювер изображений"
Микросервис изготовления превью для изображений, хранящихся на внешних ресурсах. Проектная работа по курсу OTUS «Разработчик Golang».
Техническое задание на сервис Превьювер изображений
Сборка проекта
После выгрузки проекта из репозитория выполните команду:
$ make build
В результате чего будут собраны образы Docker для микросервисов. Для проверки образов выполните команду:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
deployments_proxy latest 353f62bd7ed8 6 seconds ago 40MB
deployments_previewer latest 64503cb66993 7 seconds ago 37MB
deployments_cache latest d6c8cd04631f 28 seconds ago 26.5MB
deployments_builder latest f674951a4062 43 seconds ago 1.23GB
golang alpine dda4232b2bd5 18 hours ago 370MB
alpine latest f70734b6a266 32 hours ago 5.61MB
Порядок запуска микросервисов
Для запуска микросервисов выполните следующую команду:
$ make run
Проверить работу микросервисов можно командой:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ed992d61da01 deployments_previewer "dockerize -wait tcp…" 15 seconds ago Up 3 seconds deployments_previewer_1
983f9f3f4c2c flashspys/nginx-static "nginx -g 'daemon of…" 16 seconds ago Up 15 seconds 0.0.0.0:80->80/tcp deployments_imagesource_1
518bc8530204 rabbitmq:3.8.3-management "docker-entrypoint.s…" 16 seconds ago Up 15 seconds 4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp deployments_rabbitmq_1
e7537efad24a deployments_proxy "dockerize -wait tcp…" 16 seconds ago Up 2 seconds 0.0.0.0:8080->8080/tcp deployments_proxy_1
b084683cc068 deployments_cache "/bin/cache" 16 seconds ago Up 14 seconds 0.0.0.0:50051->50051/tcp deployments_cache_1
Чтобы запустить интеграционные тесты, выполните команду:
$ make test
> Making integration tests
...
Creating deployments_integration_tests_1 ... done
................... 19
7 scenarios (7 passed)
19 steps (19 passed)
46.637408ms
testing: warning: no tests to run
PASS
ok github.com/ahamtat/micropic/test/integration 0.057s
Чтобы остановить микросервисы, выполните команду:
$ make down
Очистка проекта
Для очистки проекта от Docker-образов микросервисов выполните команду:
$ make clean
Масштабирование микросервисов
Рассмотрим пример, когда к сервису обращается большое количество
клиентов (например, при нагрузочном тестировании).
Тогда возможно возникновение ситуации, в которой производительность
микросервисов будет недостаточной для обработки всех запросов.
Чтобы промоделировать такую ситуацию, запустите микросервисы и
выполните команду:
$ make run
$ go run ./cmd/warmer/*.go -number 100 -workers 2 -proxy http://localhost:8080/fill
HTTP-прокси при обработке запроса от клиента устанавливает
таймаут по времени. Если микросервисы не успевают обработать
запрос, то прокси возвращает ошибку HTTP 500 Internal Server Error:
...
{"level":"error","time":"2020-04-30T17:18:32.605+0300","message":"returned error response","code":500,"body":"dGltZW91dCBlbGFwc2VkIG9uIFJNUVJQQyByZXF1ZXN0IHNlbmRpbmc="}
{"level":"error","time":"2020-04-30T17:18:32.629+0300","message":"returned error response","code":500,"body":"dGltZW91dCBlbGFwc2VkIG9uIFJNUVJQQyByZXF1ZXN0IHNlbmRpbmc="}
{"level":"error","time":"2020-04-30T17:18:32.689+0300","message":"returned error response","code":500,"body":"dGltZW91dCBlbGFwc2VkIG9uIFJNUVJQQyByZXF1ZXN0IHNlbmRpbmc="}
{"level":"info","time":"2020-04-30T17:18:32.689+0300","message":"Application working time is 13.562350365s"}
Теперь выполним масштабирование сервиса, увеличив количество
его компонентов. Для этого выполните команду:
$ make scale-up
> Scaling previewers up
Starting deployments_previewer_1 ... done
Creating deployments_previewer_2 ... done
Creating deployments_previewer_3 ... done
Creating deployments_previewer_4 ... done
Creating deployments_previewer_5 ... done
Проверьте список микросервисов. Теперь он содержит реплики:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce0e0012a8a2 deployments_previewer "dockerize -wait tcp…" 11 seconds ago Up 9 seconds deployments_previewer_2
55d1f4df0131 deployments_previewer "dockerize -wait tcp…" 11 seconds ago Up 9 seconds deployments_previewer_5
7220b2600b80 deployments_previewer "dockerize -wait tcp…" 11 seconds ago Up 10 seconds deployments_previewer_3
2306fd4b3d17 deployments_previewer "dockerize -wait tcp…" 11 seconds ago Up 8 seconds deployments_previewer_4
e1de710ef1d7 deployments_previewer "dockerize -wait tcp…" 2 hours ago Up 2 hours deployments_previewer_1
23212432d1e8 flashspys/nginx-static "nginx -g 'daemon of…" 2 hours ago Up 2 hours 0.0.0.0:80->80/tcp deployments_imagesource_1
3119713b0af2 deployments_cache "/bin/cache" 2 hours ago Up 2 hours 0.0.0.0:50051->50051/tcp deployments_cache_1
84e67e032fe3 rabbitmq:3.8.3-management "docker-entrypoint.s…" 2 hours ago Up 2 hours 4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp deployments_rabbitmq_1
464178e1679d deployments_proxy "dockerize -wait tcp…" 2 hours ago Up 2 hours 0.0.0.0:8080->8080/tcp deployments_proxy_1
Повторим запуск команды для нагрузочного тестирования.
Убедитесь, что логи больше не содержат ошибок, и время
выполнения программы уменьшилось:
$ go run ./cmd/warmer/*.go -number 100 -workers 2 -proxy http://localhost:8080/fill
...
{"level":"debug","time":"2020-04-30T17:34:24.558+0300","message":"preview returned successfully"}
{"level":"debug","time":"2020-04-30T17:34:24.706+0300","message":"preview returned successfully"}
{"level":"debug","time":"2020-04-30T17:34:24.754+0300","message":"preview returned successfully"}
{"level":"info","time":"2020-04-30T17:34:24.754+0300","message":"Application working time is 9.491443441s"}
Запуск микросервисов в Kubernetes
Для запуска проекта в оркестраторе выполните следующую команду:
$ make kube-up
> Starting services in kubernetes
😄 minikube v1.9.2 on Debian 9.12
...
deployment.apps/cache created
service/cache created
deployment.apps/previewer created
deployment.apps/proxy created
service/proxy created
ingress.extensions/proxy created
Starting microservices in Kubernetes cluster. Please wait a minute...
Microservices are running
Проверьте список запущенных подов:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
cache-dd77ccf74-mdjsr 1/1 Running 0 3m49s
previewer-544cf4f95c-24cv9 1/1 Running 5 3m49s
previewer-544cf4f95c-5qc7c 1/1 Running 4 3m48s
previewer-544cf4f95c-cm9lz 1/1 Running 4 3m49s
previewer-544cf4f95c-kj8cr 1/1 Running 4 3m48s
previewer-544cf4f95c-nfvxp 1/1 Running 4 3m49s
proxy-7599f84886-mlvzk 1/1 Running 3 3m49s
rabbitmq-0 1/1 Running 0 3m49s
Добавим тестовый домен:
$ echo "$(minikube ip) micropic.otus" | sudo tee -a /etc/hosts
Запустите следующую команду, чтобы получить превью с помощью
микросервисов внутри кластера:
$ curl -X GET -H "Content-Type: image/jpeg" \
http://micropic.otus:80/fill/300/200/www.audubon.org/sites/default/files/a1_1902_16_barred-owl_sandra_rothenberg_kk.jpg \
> preview.jpg