Share This
Связаться со мной
Крути в низ
Categories
//☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

Domain Driven Design дает большие возможности по созданию крупных проектов, которые в будущем становятся надежными и легко масштабируемыми. Как пройти полный проектный цикл, от бизнес-модели до AWS? Обсудить

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 a4ace95 - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

В первой части цикла мы подготовили необходимый инструментарий: Git/GitHub, SSH, Spring Boot и Docker. Завершая настройку среды для реализации проекта, мы продолжим разбираться с Docker и Spring Boot, а также познакомимся с Docker Hub и WS ECS Fargate. ***

Устанавливаем Docker на локальную машину Ubuntu

В консоли набираем команды, обновляем систему:

         $ sudo apt update && sudo apt upgrade     

Устанавливаем дополнительные пакеты ядра для Docker контейнеров:

         $ sudo apt install --reinstall linux-image-generic     

Перезагружаем машину и вводим следующую команду:

         $ sudo apt install linux-modules-extra-$(uname -r) linux-image-extra-virtual     

Также устанавливаем пакеты для работы по HTTPS:

         $ 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 -     

Добавляем сам репозиторий Docker:

         $ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"     

Еще раз обновляемся:

         $ sudo apt update && apt-cache policy docker-ce     

Устанавливаем Docker:

         $ sudo apt install -y docker-ce     

Добавляем локального пользователя в группу docker:

         $ sudo usermod -aG docker $(whoami)     

Перезагружаем машину и проверяем состояние установленного Docker:

         $ sudo systemctl status docker     

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 f0039b8 - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

Состояние активности Docker

Далее устанавливаем Docker Compose:

         $ 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     

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 dc19642 - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

Состояние активности Docker Compose

Пробуем создать и запустить контейнер

Наш проект Spring Boot из предыдущей статьи нужно упаковать в контейнер. В корневой папке проекта в терминале вводим следующую команду:

         $ ./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”]      

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 dcbea92 - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

В интегрированной среде STS 4, Dockerfile должен выглядеть так.

Здесь:

  • 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.

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 f97416e - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

Результат выполнения команды build.

Проверяем созданный образ:

         $ docker images     

Видим присутствие образа emc:

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 f7b6c95 - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

Запускаем контейнер Docker

В терминале, выполним команду run:

         $ docker run -d -p 8080:8080 -t emc:0.0.1     

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 558ac40 - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

Результат команды run должен быть таким.

Здесь:

  • параметр -d означает запуск в фоновом режиме;
  • параметр -p 8080:8080 означает соответствие портов между локальной машиной (левый 8080) и контейнером (правый 8080);
  • параметр -t , задает имя образа (имя:версия).

Проверяем контейнер Docker

Запущенный контейнер можно проверить двумя способами:

1. через команду curl:.

         $ curl http://localhost:8080/hello     

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 ad0e582 - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

Результат должен быть таким.

2. набрав в браузере адрес localhost:8080/hello.

Далее останавливаем запущенные контейнеры:

         $ docker stop $(docker ps -a -q)     

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 e60aefa - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

Контейнеры остановлены, образы присутствуют.

Не забываем зафиксировать изменения и отправить на GitHub

На локальной машине

В корневой папке текущего проекта выполняем последовательность git-команд. Проверяем состояние файлов и папок в нашем проекте:

         $ git status     

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 e5482f9 - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

При изменениях в файлах или папках, появится следующее.

Здесь наш новый Dockerfile не отслеживается.

Индексируем изменения командой add:

         $ git add Dockerfile     

Еще раз проверяем состояние:

         $ git status     

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 76dafcd - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

Измененный Dockerfile добавился в commit.

Выполним команду commit:

         $ git commit -m "Dockerfile added to project"     

Вносим изменения в удаленный репозиторий командой push:

         $ git push origin master     

Конечный результат должен быть таким:

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 95c7a6e - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

В репозитории GitHub

Идем на GitHub и проверяем присутствие файла Dockerfile:

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 cbc1df5 - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

С Docker и GitHub мы разобрались.

Используем Docker Hub

Если обратить внимание на код в Dockerfile, первая строка начинается так:

         FROM adoptopenjdk/openjdk11:alpine-jre     

Здесь говорится о том, что образ (заготовка) adoptopenjdk/openjdk11:alpine-jre загрузится “откуда то”.

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 e705969 - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

Эти “заготовки” готовых образов располагаются в реестре Docker Hub – в дальнейшем нам придется воспользоваться этим реестром.

Регистрация в Docker Hub

Для начала регистрируемся в Docker Hub, запоминаем Docker ID и пароль. На странице приветствия выбираем Create a Repository.

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 50fa05b - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

В окне создания нового репозитория вводим имя emc и видимость репозитория public.

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 bb93dbe - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

На локальной машине

Переименуем локальный образ следующей командой:

         $ docker tag old_image_name:tagname new_image_name:new_tag     

Как пример. К имени образа emc:0.0.1 я добавил свой Docker ID через знак слеша, и у меня получилось так:

         $ docker tag emc:0.0.1 barust67/emc:0.0.1     

Проверяем результат:

         $ docker images     

На локальной машине логинимся в Docker Hub со своим Docker ID:

         $ docker login -u barust67     

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 4577f32 - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

Результат должен быть таким.

Забрасываем (push) локальный образ в Docker Hub в репозиторий emc:

         $ docker push image_name:tag     

В моем случае команда выглядит следующим образом:

         $ docker push barust67/emc:0.0.1     

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 f6ba04b - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

Результат должен быть таким.

Идем в Docker Hub и убеждаемся в результате:

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 bf6315d - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 0a7c6b1 - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

С Docker Hub тоже разобрались. Этот образ нам понадобится, когда будем настраивать AWS.

Переходим к последнему этапу подготовительной части: нам нужно будет запустить проект в Amazon Web Services.

AWS

Мы будем использовать AWS ECS Fargate. С регистрацией в AWS проблем не должно возникнуть: чтобы использовать Free версию, достаточно представить Visa карту с $1 на счету. В процессе работы с AWS вы можете использовать AWS CLI на локальной машине или AWS Management Console непосредственно на сайте AWS. Для большей наглядности начнем с AWS Management Console.

Работаем с AWS Management Console и настраиваем кластер под Fargate

В AWS Management Console, выберите Elastic Container Service (ECS):

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 223d9dd - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

Выберите опцию Clusters:

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 a8059d8 - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 5a03356 - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

Если вы еще не создавали кластеры, окно должно выглядеть так.

Выберите Create Cluster, опцию Networking only и нажмите кнопку Next step.

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 172f875 - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

Задайте имя кластера (я назвал свой AWS-Fargate-Claster) и отметьте опцию CloudWatch Container Insights. Нажмите на кнопку Create.

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 70e7e6f - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 e0cafb0 - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

Кластер должен выглядеть так.

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 18a4685 - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

Создаем Task Definitions

В окне Task Definitions выберите Create new Task Definition:

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 96f1880 - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

На первом шаге выберите тип запуска Fargate и нажмите на кнопку Next step:

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 d316a1f - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

Далее задайте имя задачи (в нашем случае – emc), выберите task role (ecsTaskExecutionRole), в Task memory выберите 0,5GB, а в опции Task CPU (vCPU) – 0,25 vCPU, затем нажмите на кнопку Add container:

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 041a630 - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

Окно Add container состоит из двух разделов: Standard и Advanced container configuration.

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 fcf2cc6 - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

Заносим данные в разделе Standard. В Container name я задал имя emc, в поле Imagebarust67/emc:0.0.1, в поле Port mappings8080. В конце нужно нажать на кнопку Add.

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 ea7b248 - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 b7674e9 - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

Мы добавили контейнер.

Для завершения в самом низу окна второго шага нажмите кнопку Create. В результате должно появиться такое окно:

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 ff3133c - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 b20e3f8 - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

Задачу мы определили и окно Task Definitions должно выглядеть так.

Возвращаемся в раздел Clusters и заходим в наш кластер AWS-Fargate-Cluster.

Создаем сервис для кластера AWS-Fargate-Cluster

Создаем новый сервис для нашего кластера, нажав на кнопку Create:

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 6ed5090 - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

Создание сервиса состоит из четырех шагов. На первом выбираем Launch type – Fargate, Task Definition определяем как – emc, в Service name задаем имя – emc-service, Number of tasks определяем как – 1.

Нажимаем кнопку Next step.

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 0eef5f5 - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

Выберите Cluster VPS – здесь по умолчанию, выберите Subnets (любой) и далее в опции Security groups нажмите на кнопку Edit

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 5eed986 - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

Так как в проекте мы определили порт TCP 8080, необходимо открыть в нашем сервисе этот порт. В окне Configure security groups нажмите на кнопку Add rule, в добавленной строке поменяйте тип на Custom TCP, пропишите порт 8080 и нажмите на кнопку Save

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 e1d5a5f - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

Оставляя другие опции по умолчанию, нажимаем на кнопку Next step и переходим к третьему шагу. Здесь оставляем все как есть, нажимаем на кнопку Next step и переходим к четвертому шагу.

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 240f824 - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

Нажмите на кнопку Create service и завершите создание сервиса. Если немного подождать, в появившемся окне данные должны быть примерно такими:

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 7a2ca92 - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

Далее нажимаем на кнопку View service и просматриваем наш сервис. В категории Tasks выбираем нашу задачу

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 5ebcfe7 - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

В окне задачи убеждаемся, что это наша задача и запоминаем Public IP. В вашем случае, IP будет другим

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 be0623a - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

В адресной строке браузера вводим http://3.21.190.246:8080/hello , где вместо localhost мы прописали IP задачи на AWS.

primer proekta java backend ddd mikroservisy spring cloud i aws chast 2 ba54364 - ☕ Пример проекта Java Backend: DDD, микросервисы, Spring Cloud и AWS (Часть 2)

Наше приложение запущено в облаке AWS. Можно налить чашку кофе и наслаждаться работой своего «Hello World!» в облаке Amazon.

Примечание Все команды и картинки были проверены выполнены в реальном режиме. Ошибок у вас не должно быть.

Резюме

Мы завершили рассмотрение Docker, настроили Docker Hub для проекта и смогли развернуть его на AWS ECS Fargate.

***

В следующей статье мы перейдем ко второму этапу цикла по DDD, Microservices, Spring Cloud и AWS: подробнее рассмотрим подход DDD (Domain Driven Design) и сделаем наброски будущей модели проекта.

  • 2 views
  • 0 Comment

Leave a Reply

Ваш адрес email не будет опубликован.

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Свежие комментарии

    Рубрики

    About Author 01.

    blank
    Roman Spiridonov

    Моя специальность - Back-end Developer, Software Engineer Python. Мне 39 лет, я работаю в области информационных технологий более 5 лет. Опыт программирования на Python более 3 лет. На Django более 2 лет.

    Categories 05.

    © Speccy 2022 / All rights reserved

    Связаться со мной
    Close