Микросервис изготовления превью для изображений, хранящихся на внешних ресурсах. Проектная работа по курсу 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"}
Для запуска проекта в оркестраторе выполните следующую команду:
$ 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