☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)
Domain Driven Design дает большие возможности по созданию крупных проектов, которые в будущем становятся надежными и легко масштабируемыми. Как пройти полный проектный цикл, от бизнес-модели до AWS? Обсудить В первой части цикла мы подготовили необходимый инструментарий: Git/GitHub, SSH, Spring Boot и Docker. Завершая настройку среды для реализации проекта, мы продолжим разбираться с Docker и Spring Boot, а также познакомимся с Docker Hub и WS ECS Fargate. *** В консоли набираем команды, обновляем систему: Устанавливаем дополнительные пакеты ядра для Docker контейнеров: Перезагружаем машину и вводим следующую команду: Также устанавливаем пакеты для работы по HTTPS: Добавляем ключ репозитория: Добавляем сам репозиторий Docker: Еще раз обновляемся: Устанавливаем Docker: Добавляем локального пользователя в группу Перезагружаем машину и проверяем состояние установленного Docker: Состояние активности Docker Далее устанавливаем Docker Compose: Даем права на исполнение файла: Проверяем: Состояние активности Docker Compose Наш проект Spring Boot из предыдущей статьи нужно упаковать в контейнер. В корневой папке проекта в терминале вводим следующую команду: В корневой папке проекта создаем В интегрированной среде STS 4, Dockerfile должен выглядеть так. Здесь: Далее в корневой папке проекта запускаем следующую команду: Примечание: Обратите внимание, в конце команды стоит точка, это означает что, создаем образ в текущей папке, а именно в папке Результат выполнения команды Проверяем созданный образ: Видим присутствие образа В терминале, выполним команду Результат команды Здесь: Запущенный контейнер можно проверить двумя способами: 1. через команду Результат должен быть таким. 2. набрав в браузере адрес Далее останавливаем запущенные контейнеры: Контейнеры остановлены, образы присутствуют. В корневой папке текущего проекта выполняем последовательность git-команд. Проверяем состояние файлов и папок в нашем проекте: При изменениях в файлах или папках, появится следующее. Здесь наш новый Индексируем изменения командой Еще раз проверяем состояние: Измененный Выполним команду Вносим изменения в удаленный репозиторий командой Конечный результат должен быть таким: Идем на GitHub и проверяем присутствие файла С Docker и GitHub мы разобрались. Если обратить внимание на код в Здесь говорится о том, что образ (заготовка) Эти “заготовки” готовых образов располагаются в реестре Docker Hub – в дальнейшем нам придется воспользоваться этим реестром. Для начала регистрируемся в Docker Hub, запоминаем Docker ID и пароль. На странице приветствия выбираем Create a Repository. В окне создания нового репозитория вводим имя Переименуем локальный образ следующей командой: Как пример. К имени образа emc:0.0.1 я добавил свой Docker ID через знак слеша, и у меня получилось так: Проверяем результат: На локальной машине логинимся в Docker Hub со своим Docker ID: Результат должен быть таким. Забрасываем (push) локальный образ в Docker Hub в репозиторий В моем случае команда выглядит следующим образом: Результат должен быть таким. Идем в Docker Hub и убеждаемся в результате: С Docker Hub тоже разобрались. Этот образ нам понадобится, когда будем настраивать AWS. Переходим к последнему этапу подготовительной части: нам нужно будет запустить проект в Amazon Web Services. Мы будем использовать AWS ECS Fargate. С регистрацией в AWS проблем не должно возникнуть: чтобы использовать Free версию, достаточно представить Visa карту с $1 на счету. В процессе работы с AWS вы можете использовать AWS CLI на локальной машине или AWS Management Console непосредственно на сайте AWS. Для большей наглядности начнем с AWS Management Console. В AWS Management Console, выберите Elastic Container Service (ECS): Выберите опцию Clusters: Если вы еще не создавали кластеры, окно должно выглядеть так. Выберите Create Cluster, опцию Networking only и нажмите кнопку Next step. Задайте имя кластера (я назвал свой AWS-Fargate-Claster) и отметьте опцию CloudWatch Container Insights. Нажмите на кнопку Create. Кластер должен выглядеть так. В окне Task Definitions выберите Create new Task Definition: На первом шаге выберите тип запуска Fargate и нажмите на кнопку Next step: Далее задайте имя задачи (в нашем случае – emc), выберите task role (ecsTaskExecutionRole), в Task memory выберите 0,5GB, а в опции Task CPU (vCPU) – 0,25 vCPU, затем нажмите на кнопку Add container: Окно Add container состоит из двух разделов: Standard и Advanced container configuration. Заносим данные в разделе Standard. В Container name я задал имя Мы добавили контейнер. Для завершения в самом низу окна второго шага нажмите кнопку Create. В результате должно появиться такое окно: Задачу мы определили и окно Task Definitions должно выглядеть так. Возвращаемся в раздел Clusters и заходим в наш кластер AWS-Fargate-Cluster. Создаем новый сервис для нашего кластера, нажав на кнопку Create: Создание сервиса состоит из четырех шагов. На первом выбираем Launch type – Fargate, Task Definition определяем как – emc, в Service name задаем имя – emc-service, Number of tasks определяем как – 1. Нажимаем кнопку Next step. Выберите Cluster VPS – здесь по умолчанию, выберите Subnets (любой) и далее в опции Security groups нажмите на кнопку Edit Так как в проекте мы определили порт TCP 8080, необходимо открыть в нашем сервисе этот порт. В окне Configure security groups нажмите на кнопку Add rule, в добавленной строке поменяйте тип на Custom TCP, пропишите порт 8080 и нажмите на кнопку Save Оставляя другие опции по умолчанию, нажимаем на кнопку Next step и переходим к третьему шагу. Здесь оставляем все как есть, нажимаем на кнопку Next step и переходим к четвертому шагу. Нажмите на кнопку Create service и завершите создание сервиса. Если немного подождать, в появившемся окне данные должны быть примерно такими: Далее нажимаем на кнопку View service и просматриваем наш сервис. В категории Tasks выбираем нашу задачу В окне задачи убеждаемся, что это наша задача и запоминаем Public IP. В вашем случае, IP будет другим В адресной строке браузера вводим http://3.21.190.246:8080/hello , где вместо localhost мы прописали IP задачи на AWS. Наше приложение запущено в облаке AWS. Можно налить чашку кофе и наслаждаться работой своего «Hello World!» в облаке Amazon. Примечание Все команды и картинки были проверены выполнены в реальном режиме. Ошибок у вас не должно быть. Мы завершили рассмотрение Docker, настроили Docker Hub для проекта и смогли развернуть его на AWS ECS Fargate. *** В следующей статье мы перейдем ко второму этапу цикла по DDD, Microservices, Spring Cloud и AWS: подробнее рассмотрим подход DDD (Domain Driven Design) и сделаем наброски будущей модели проекта.Устанавливаем Docker на локальную машину Ubuntu
$ sudo apt update && sudo apt upgrade
$ sudo apt install --reinstall linux-image-generic
$ sudo apt install linux-modules-extra-$(uname -r) linux-image-extra-virtual
$ sudo apt install apt-transport-https ca-certificates curl software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
$ sudo apt update && apt-cache policy docker-ce
$ sudo apt install -y docker-ce
docker
:
$ sudo usermod -aG docker $(whoami)
$ sudo systemctl status docker
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose --version
Пробуем создать и запустить контейнер
$ ./mvnw package && java -jar target/emc-0.0.1-SNAPSHOT.jar
Создаем Dockerfile
Dockerfile
со следующим кодом
FROM adoptopenjdk/openjdk11:alpine-jre ARG JAR_FILE=target/emc-0.0.1-SNAPSHOT.jar WORKDIR /opr/app COPY $(JAR_FILE) app.jar ENTRYPOINT [“java”,”-jar”,“app.jar”]
FROM adoptopenjdk/openjdk11:alpine-jre
– загружается образ Alpine Linux с версией openjdk 11.ARG JAR_FILE=target/emc-0.0.1-SNAPSHOT.jar
– инструкция ARG создает переменную JAR_FILE, указывающую на местоположение jar-файла.WORKDIR /opt/app
– назначаем рабочую директорию.COPY ${JAR_FILE} app.jar
– скомпилированный jar файл emc-0.0.1-SNAPSHOT.jar копируется в рабочую директорию с новым именем app.jar.ENTRYPOINT ["java","-jar","app.jar"]
– из заданной рабочей директории запускается приложение app.jar.Создаем Docker образ
$ docker build -t emc:0.0.1 .
/opt/app
. build
.
$ docker images
emc
: Запускаем контейнер Docker
run
:
$ docker run -d -p 8080:8080 -t emc:0.0.1
run
должен быть таким. -d
означает запуск в фоновом режиме;-p 8080:8080
означает соответствие портов между локальной машиной (левый 8080) и контейнером (правый 8080); -t
, задает имя образа (имя:версия).Проверяем контейнер Docker
curl
:.
$ curl http://localhost:8080/hello
localhost:8080/hello
.
$ docker stop $(docker ps -a -q)
Не забываем зафиксировать изменения и отправить на GitHub
На локальной машине
$ git status
Dockerfile
не отслеживается.add
:
$ git add Dockerfile
$ git status
Dockerfile
добавился в commit
. commit
:
$ git commit -m "Dockerfile added to project"
push
:
$ git push origin master
В репозитории GitHub
Dockerfile
:Используем Docker Hub
Dockerfile
, первая строка начинается так:
FROM adoptopenjdk/openjdk11:alpine-jre
adoptopenjdk/openjdk11:alpine-jre
загрузится “откуда то”.Регистрация в Docker Hub
emc
и видимость репозитория public
.На локальной машине
$ docker tag old_image_name:tagname new_image_name:new_tag
$ docker tag emc:0.0.1 barust67/emc:0.0.1
$ docker images
$ docker login -u barust67
emc
:
$ docker push image_name:tag
$ docker push barust67/emc:0.0.1
AWS
Работаем с AWS Management Console и настраиваем кластер под Fargate
Создаем Task Definitions
emc
, в поле Image – barust67/emc:0.0.1
, в поле Port mappings – 8080
. В конце нужно нажать на кнопку Add.Создаем сервис для кластера AWS-Fargate-Cluster
Резюме
- 2 views
- 0 Comment
Свежие комментарии