Цель лабораторной работы: Проектирование многослойной архитектуры Web-API (веб-приложений, микро-сервисов). Создание API микросервиса с учётом современных архитектурных паттернов, CRUD-приложение написанное на JAVA.
Инструкция по сборке и запуску:
Для работы потребуется установленная среда разработки IntelliJ IDEA 2021.3 (Ultimate Edition). А также Docker — проект для автоматизации развертывания приложений в виде переносимых автономных контейнеров, выполняемых в облаке или локальной среде. Используется операционная система Windows 10 и кроссплатформенная оболочка PowerShell.
- Необходимо написать код на языке JAVA используя среду разработки IntelliJ IDEA 2021.3.
- Запустим контейнер с базой данных Postgresql для теста приложения с помощью команды:
docker run -e POSTGRES_PASSWORD=root -p 5432:5432 postgres
- Запустим файлы schema.sql, data.sql (src/main/resources/...) для создания таблиц и добавления данных в эти таблицы.
- С помощью сборщика проектов MAVEN необходимо собрать образ для Docker. Во вкладке Maven/SimpleApi1/Lifecycle/package по двойному клику будет создан *.jar архив.
- Далее необходимо произвести сборку образа:
docker build . -t $IMAGE_NAME:latest
- Запустим созданный образ командой:
docker run -p 8080:8080 $IMAGE_NAME:latest
После запуска приложения его тестируем с помощью следующих команд:
- Получим hostname:
curl http://localhost:8080/api/v1/status
- Получим список всех строк в таблице:
curl http://localhost:8080/api/v1/drivers
- Получим определённую строку из таблицы по его id:
curl http://localhost:8080/api/v1/drivers/{id}
- Сохранение позиции в таблице:
curl -x POST http://localhost:8080/api/v1/drivers/
{
"last_name": "Кудрявцев",
"first_name": "Анатолий",
"mid_name": "Иванович",
"phone": "8-926-000-00-06",
"rating": 8
}
- Удаление позиции в таблице по id:
curl -x DELETE http://localhost:8080/api/v1/drivers/{id}
Цель лабораторной работы: знакомство с кластерной архитектурой на примере Kubernetes, а также деплоем приложения в кластер. В данной лабораторной работе необходимо развернуть кластер Kubernetes на локальной рабочей станции посредством MiniKube.
Инструкция:
- Развернём локально кластер на Kubernetes с использованием MiniKube.
Установим MiniKube по инструкции https://minikube.sigs.k8s.io/docs/start/ Установим kubectl https://kubernetes.io/ru/docs/tasks/tools/install-kubectl/ Убедимся, что kubectl работает и произведём осмотр кластера с помощью команд:
kubectl get node
kubectl get po
kubectl get po -A
kubectl get svc
-
Установим графический интерфейс Dashboard https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/ - необходимо выполнить шаги Deploying the Dashboard UI и Accessing the Dashboard UI. В последнем не забудьте кликнуть по ссылке creating a sample user и выполнить там инструкции.
-
Произведём деплой приложения в кластер. Для того, чтобы MiniKube видел образы docker, необходимо создавать docker-образы внутри MiniKube. Для обеспечения этого, выполним команду в PowerShell:
minikube -p minikube docker-env | Invoke-Expression
Перейдём в папку с API в PowerShell:
cd C:\Users\denis\IdeaProjects\SimpleApi
Пересоберём докер образ в PowerShell:
minikube -p minikube docker-env | Invoke-Expression
Решеним проблему с обращением из MiniKube к приложению, либо БД на localhost. Определим локальный адрес нашей машины, который будет вписан в манифест deployment.yaml (https://minikube.sigs.k8s.io/docs/handbook/host-access/) - IP of localhost from MiniKube используя команду в PowerShell:
ping host.minikube.internal
Создадим манифест Deployment и сохранить в файл, например deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 2
selector:
matchLabels:
app: my-app
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
type: RollingUpdate
template:
metadata:
labels:
app: my-app
spec:
containers:
- image: myapi:latest
# https://medium.com/bb-tutorials-and-thoughts/how-to-use-own-local-doker-images-with-minikube-2c1ed0b0968
# указыаает на то, что образы нужно брать только из локального registry. В продакшене никогда не использовать
imagePullPolicy: Never
name: myapi
ports:
- containerPort: 8080
hostAliases:
- ip: "192.168.65.2" # The IP of localhost from MiniKube
hostnames:
- postgres.local
Выполним данный код командой в PowerShell:
kubectl apply -f deployment.yaml
Создадим манифест Service и сохранить в файл, например service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: NodePort
ports:
- nodePort: 31317
port: 8080
protocol: TCP
targetPort: 8080
selector:
app: my-app
Выполним данный код командой в PowerShell:
kubectl apply -f service.yaml
Для того, чтобы проверить доступность localhost изнутри Minikube, надо зайти внутрь Minikube путем выполнения команды в PowerShell:
minikube ssh
Далее выполним в PowerShell curl к какому-нибудь нашему сервису на 192.168.65.2:
curl http://192.168.65.2:8080/api/v1/status
Если запрос выпоолнился, успешно, то адрес верный!
- Увеличим количество реплик до 10 и проверим отображение hostname.
В манифесте deployment.yaml изменим количество реплик до 10:
spec.replicas: 10
Применим изменения:
kubectl apply -f deployment.yaml
- Произведём осмотр подов в графическом интерфейсе, предварительно выполнив пункт №2 данной инструкции и далее перейдём по ссылке http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/:
- Далее реализуем непрерывную интеграцию (Continuous Integration) посредством Travis CI для своего приложения, а также непрерывную доставку (Continuous Deployment) обновлений в Heroku посредством Travis CI и DockerHUB. После регистрации на http://travis-ci.com создадим в папке с приложеннием SImpleApi файл .travis.yml:
dist: trusty
jdk: oraclejdk8
language: java
sudo: true
services:
- postgresql
- docker
addons:
apt:
packages:
- oracle-java8-installer
before_install:
- chmod +x mvnw
env:
global:
- COMMIT=${TRAVIS_COMMIT::7}
script:
- ./mvnw clean install -B
after_success:
- docker login -u $DOCKER_USER -p $DOCKER_PASS
- export TAG=`if [ "$TRAVIS_BRANCH" == "master" ]; then echo "latest"; else echo "$TRAVIS_BRANCH"; fi`
- export IMAGE_NAME=myapi/main-repo
- docker build -t $IMAGE_NAME:latest .
- docker tag $IMAGE_NAME:latest $IMAGE_NAME:$TAG
- docker push $IMAGE_NAME:$TAG
deploy:
provider: heroku
api_key: $HEROKU_API_KEY
app: myapi-api
Запушим изменения в репозиторий GitHub, предварительно перейдя в папку с проектом и запустив Git Bash:
git add .
git commit -m "<commit>"
git push -u git push <remote-name> master
Подключим наш репозиторий на GitHub с приложением SimpleApi к Travis CI. После чего убедимся что Travis CI их обнаружил и сделал успешную сборку.
-
Зарегистрируемся на http://heroku.com и создадим там приложение с любым именем, которое потом будет отображаться в url.
-
Перейдём во вкладку Resources и добавим Add-on: Heroku Postgres. Подключимся к созданной базе из IntelliJ IDEA. Для этого на странице, где был добавлен Add-on, кликнем на появившуюся иконку Heroku Postgres, затем нажмём вкладку Settings, после чего кнопку View Credentials. Необходимо использовать эти параметры доступа для подключения к БД. Загрузим в БД схему данных из data.sql.
-
Зарегистрируемся на http://hub.docker.com и создадим там свой репозиторий для докер образов.
-
Перейдём на сайте в настройки нашего репозитория https://app.travis-ci.com во вкладку "Settings". Добавим значения трёх переменных среды: HEROKU_API_KEY, DOCKER_USER, DOCKER_PASS. Далее Travis CI автоматически осуществит шифрование значений этих переменных.
-
Ссылка на развернутое приложение на платформе Heroku: https://myapi-api.herokuapp.com/api/v1/drivers