From 5700e759652ae2ec7704b5bea5e61ae61aaf2647 Mon Sep 17 00:00:00 2001 From: NAP Date: Fri, 25 Oct 2024 01:10:46 +0400 Subject: [PATCH] kadyrov_aydar_lab_3 --- kadyrov_aydar_lab_3/README.md | 42 +++++++++++++++ kadyrov_aydar_lab_3/docker-compose.yml | 26 ++++++++++ kadyrov_aydar_lab_3/hero_service/Dockerfile | 10 ++++ kadyrov_aydar_lab_3/hero_service/main.py | 51 +++++++++++++++++++ .../hero_service/requirements.txt | 1 + kadyrov_aydar_lab_3/item_service/Dockerfile | 10 ++++ kadyrov_aydar_lab_3/item_service/main.py | 51 +++++++++++++++++++ .../item_service/requirements.txt | 1 + kadyrov_aydar_lab_3/nginx/nginx.conf | 11 ++++ 9 files changed, 203 insertions(+) create mode 100644 kadyrov_aydar_lab_3/README.md create mode 100644 kadyrov_aydar_lab_3/docker-compose.yml create mode 100644 kadyrov_aydar_lab_3/hero_service/Dockerfile create mode 100644 kadyrov_aydar_lab_3/hero_service/main.py create mode 100644 kadyrov_aydar_lab_3/hero_service/requirements.txt create mode 100644 kadyrov_aydar_lab_3/item_service/Dockerfile create mode 100644 kadyrov_aydar_lab_3/item_service/main.py create mode 100644 kadyrov_aydar_lab_3/item_service/requirements.txt create mode 100644 kadyrov_aydar_lab_3/nginx/nginx.conf diff --git a/kadyrov_aydar_lab_3/README.md b/kadyrov_aydar_lab_3/README.md new file mode 100644 index 0000000..1cbbb4f --- /dev/null +++ b/kadyrov_aydar_lab_3/README.md @@ -0,0 +1,42 @@ + +# Лабораторная работа №3 - REST API, шлюз и синхронный обмен данными между микросервисами + +## Задание + +### Цель: +Изучение принципов проектирования с использованием паттерна шлюза, организации синхронной передачи данных между микросервисами и применения архитектурного стиля RESTful API. + +### Задачи: +1. Создание двух микросервисов, которые реализуют операции CRUD для связанных сущностей. +2. Реализация механизма синхронного обмена данными между микросервисами. +3. Настройка шлюза на базе Nginx в качестве прозрачного прокси-сервера. + +### Микросервисы: +1. **hero_service** — сервис, который управляет информацией о героях. +2. **item_service** — сервис, который обрабатывает данные о предметах, принадлежащих героям. + +### Связь между микросервисами: +- Один документ (hero) может иметь множество связанных предметов (items) (соотношение 1 ко многим). + +## Как запустить проект: +Для запуска приложения необходимо выполнить команду: +```bash +docker-compose up +``` + +## Описание работы: + +Для разработки микросервисов был выбран язык программирования Python. + +### Синхронный обмен данными +Сервис `hero_service` отправляет HTTP-запросы к `item_service` при выполнении определенных операций CRUD. Это позволяет получать актуальную информацию о предметах, связанных с конкретными героями. + +### Docker Compose +Конфигурационный файл `docker-compose.yml` представляет собой многоконтейнерное приложение, которое включает в себя три сервиса: `hero_service`, `item_service` и `nginx`. Функция маршрутизации возложена на сервер Nginx, который обрабатывает запросы и перенаправляет их на соответствующие микросервисы. + +### Nginx +Конфигурационный файл Nginx определяет настройки веб-сервера и обратного прокси, который управляет входящими запросами и направляет их на соответствующие сервисы. + +### ВК ВИДЕО + +https://vk.com/video64471408_456239206?list=ln-eG1UX8zXWbZkc651DD \ No newline at end of file diff --git a/kadyrov_aydar_lab_3/docker-compose.yml b/kadyrov_aydar_lab_3/docker-compose.yml new file mode 100644 index 0000000..eaa095c --- /dev/null +++ b/kadyrov_aydar_lab_3/docker-compose.yml @@ -0,0 +1,26 @@ +version: '3.8' + +services: + hero_service: + build: + context: ./hero_service + dockerfile: Dockerfile + ports: + - "5000:5000" + + item_service: + build: + context: ./item_service + dockerfile: Dockerfile + ports: + - "5001:5001" + + nginx: + image: nginx:latest + volumes: + - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf + ports: + - "80:80" + depends_on: + - hero_service + - item_service diff --git a/kadyrov_aydar_lab_3/hero_service/Dockerfile b/kadyrov_aydar_lab_3/hero_service/Dockerfile new file mode 100644 index 0000000..7a7319a --- /dev/null +++ b/kadyrov_aydar_lab_3/hero_service/Dockerfile @@ -0,0 +1,10 @@ +FROM python:3.11 + +WORKDIR /app + +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +COPY . . + +CMD ["python", "main.py"] diff --git a/kadyrov_aydar_lab_3/hero_service/main.py b/kadyrov_aydar_lab_3/hero_service/main.py new file mode 100644 index 0000000..9efb650 --- /dev/null +++ b/kadyrov_aydar_lab_3/hero_service/main.py @@ -0,0 +1,51 @@ +from flask import Flask, jsonify, request +import uuid + +app = Flask(__name__) + +heroes = {} + +@app.route('/heroes', methods=['GET']) +def get_heroes(): + return jsonify(list(heroes.values())) + +@app.route('/heroes/', methods=['GET']) +def get_hero(hero_uuid): + hero = heroes.get(str(hero_uuid)) + if hero: + return jsonify(hero) + return jsonify({'error': 'Not found'}), 404 + +@app.route('/heroes', methods=['POST']) +def create_hero(): + data = request.get_json() + hero_uuid = str(uuid.uuid4()) + hero = { + 'uuid': hero_uuid, + 'name': data['name'], + 'role': data['role'], + 'strength': data['strength'] + } + heroes[hero_uuid] = hero + return jsonify(hero), 201 + +@app.route('/heroes/', methods=['PUT']) +def update_hero(hero_uuid): + hero = heroes.get(str(hero_uuid)) + if not hero: + return jsonify({'error': 'Not found'}), 404 + data = request.get_json() + hero['name'] = data['name'] + hero['role'] = data['role'] + hero['strength'] = data['strength'] + return jsonify(hero) + +@app.route('/heroes/', methods=['DELETE']) +def delete_hero(hero_uuid): + if str(hero_uuid) in heroes: + del heroes[str(hero_uuid)] + return '', 204 + return jsonify({'error': 'Not found'}), 404 + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=5000) diff --git a/kadyrov_aydar_lab_3/hero_service/requirements.txt b/kadyrov_aydar_lab_3/hero_service/requirements.txt new file mode 100644 index 0000000..e3e9a71 --- /dev/null +++ b/kadyrov_aydar_lab_3/hero_service/requirements.txt @@ -0,0 +1 @@ +Flask diff --git a/kadyrov_aydar_lab_3/item_service/Dockerfile b/kadyrov_aydar_lab_3/item_service/Dockerfile new file mode 100644 index 0000000..7a7319a --- /dev/null +++ b/kadyrov_aydar_lab_3/item_service/Dockerfile @@ -0,0 +1,10 @@ +FROM python:3.11 + +WORKDIR /app + +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +COPY . . + +CMD ["python", "main.py"] diff --git a/kadyrov_aydar_lab_3/item_service/main.py b/kadyrov_aydar_lab_3/item_service/main.py new file mode 100644 index 0000000..a1c4890 --- /dev/null +++ b/kadyrov_aydar_lab_3/item_service/main.py @@ -0,0 +1,51 @@ +from flask import Flask, jsonify, request +import uuid + +app = Flask(__name__) + +items = {} + +@app.route('/items', methods=['GET']) +def get_items(): + return jsonify(list(items.values())) + +@app.route('/items/', methods=['GET']) +def get_item(item_uuid): + item = items.get(str(item_uuid)) + if item: + return jsonify(item) + return jsonify({'error': 'Not found'}), 404 + +@app.route('/items', methods=['POST']) +def create_item(): + data = request.json + item_uuid = str(uuid.uuid4()) + item = { + 'uuid': item_uuid, + 'name': data['name'], + 'type': data['type'], + 'hero_uuid': data['hero_uuid'] + } + items[item_uuid] = item + return jsonify(item), 201 + +@app.route('/items/', methods=['PUT']) +def update_item(item_uuid): + item = items.get(str(item_uuid)) + if not item: + return jsonify({'error': 'Not found'}), 404 + data = request.json + item['name'] = data['name'] + item['type'] = data['type'] + item['hero_uuid'] = data['hero_uuid'] + return jsonify(item) + +@app.route('/items/', methods=['DELETE']) +def delete_item(item_uuid): + if str(item_uuid) in items: + del items[str(item_uuid)] + return '', 204 + return jsonify({'error': 'Not found'}), 404 + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=5001) diff --git a/kadyrov_aydar_lab_3/item_service/requirements.txt b/kadyrov_aydar_lab_3/item_service/requirements.txt new file mode 100644 index 0000000..e3e9a71 --- /dev/null +++ b/kadyrov_aydar_lab_3/item_service/requirements.txt @@ -0,0 +1 @@ +Flask diff --git a/kadyrov_aydar_lab_3/nginx/nginx.conf b/kadyrov_aydar_lab_3/nginx/nginx.conf new file mode 100644 index 0000000..3774360 --- /dev/null +++ b/kadyrov_aydar_lab_3/nginx/nginx.conf @@ -0,0 +1,11 @@ +server { + listen 80; + + location /heroes { + proxy_pass http://hero_service:5000; + } + + location /items { + proxy_pass http://item_service:5001; + } +}