From f3d2014ee92c33ddaf4b21e34e2508e6aaed05b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=B8=D1=82=D0=B0=20=D0=A7=D0=B5=D1=80?= =?UTF-8?q?=D0=BD=D1=8B=D1=88=D0=BE=D0=B2?= Date: Sun, 15 Dec 2024 16:51:11 +0400 Subject: [PATCH] chernyshov_nikita_lab_3 is ready --- chernyshov_nikita_lab_3/README.md | 36 +++++++++++++ chernyshov_nikita_lab_3/docker-compose.yml | 26 +++++++++ .../games_service/Dockerfile | 10 ++++ chernyshov_nikita_lab_3/games_service/main.py | 53 +++++++++++++++++++ .../games_service/requirements.txt | 1 + .../genres_service/Dockerfile | 10 ++++ .../genres_service/main.py | 51 ++++++++++++++++++ .../genres_service/requirements.txt | 1 + chernyshov_nikita_lab_3/nginx/nginx.conf | 11 ++++ 9 files changed, 199 insertions(+) create mode 100644 chernyshov_nikita_lab_3/README.md create mode 100644 chernyshov_nikita_lab_3/docker-compose.yml create mode 100644 chernyshov_nikita_lab_3/games_service/Dockerfile create mode 100644 chernyshov_nikita_lab_3/games_service/main.py create mode 100644 chernyshov_nikita_lab_3/games_service/requirements.txt create mode 100644 chernyshov_nikita_lab_3/genres_service/Dockerfile create mode 100644 chernyshov_nikita_lab_3/genres_service/main.py create mode 100644 chernyshov_nikita_lab_3/genres_service/requirements.txt create mode 100644 chernyshov_nikita_lab_3/nginx/nginx.conf diff --git a/chernyshov_nikita_lab_3/README.md b/chernyshov_nikita_lab_3/README.md new file mode 100644 index 0000000..c097b0f --- /dev/null +++ b/chernyshov_nikita_lab_3/README.md @@ -0,0 +1,36 @@ + +## Лабораторная работа №3 + +### Цель: +* Реализовать два микросервиса, которые взаимодействуют друг с другом через синхронный обмен сообщениями (HTTP-запросы). Для доступа к микросервисам используется шлюз Nginx, реализованный с помощью Docker Compose. + +### Технологии: + +* Python: Язык программирования для реализации микросервисов. +* Flask: Фреймворк Python для создания веб-приложений, использован для создания REST API микросервисов. +* requests: Библиотека Python для отправки HTTP-запросов, использован для синхронного обмена сообщениями между микросервисами. +* flask_cors: Расширение Flask, которое позволяет микросервисам получать доступ к данным из других доменов. +* Docker: Технология контейнеризации для упаковки и запуска микросервисов. +* Docker Compose: Инструмент для определения и управления многоконтейнерными приложениями, использован для запуска микросервисов и шлюза Nginx. +* Nginx: Сетевой прокси-сервер, использован как шлюз для доступа к микросервисам. + +### Функциональность: + +#### Микросервис games-service: +* Реализует CRUD операции для игр (GET, POST, PUT, DELETE). +* Сохраняет данные о играх в памяти (в словаре games). +* Получает информацию о жанре из микросервиса genres-service через HTTP-запрос. +* Включает информацию о жанре в ответ JSON для игры. +#### Микросервис genres-service: +* Реализует CRUD операции для жанров (GET, POST, PUT, DELETE). +* Сохраняет данные о жанре в памяти (в словаре genres). +#### Шлюз Nginx: +* Перенаправляет HTTP-запросы на соответствующие микросервисы. +* Предоставляет единую точку входа для доступа к микросервисам. + +### Запуск программы: + +* Запуск команды docker-compose up --build + +### Ссылка на видео: +https://vkvideo.ru/video286865610_456239226?list=ln-U577n85GB3sBxUtF34 \ No newline at end of file diff --git a/chernyshov_nikita_lab_3/docker-compose.yml b/chernyshov_nikita_lab_3/docker-compose.yml new file mode 100644 index 0000000..4c732d2 --- /dev/null +++ b/chernyshov_nikita_lab_3/docker-compose.yml @@ -0,0 +1,26 @@ +version: '3.8' + +services: + games_service: + build: + context: ./games_service + dockerfile: Dockerfile + ports: + - "5000:5000" + + genres_service: + build: + context: ./genres_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: + - games_service + - genres_service diff --git a/chernyshov_nikita_lab_3/games_service/Dockerfile b/chernyshov_nikita_lab_3/games_service/Dockerfile new file mode 100644 index 0000000..851c5df --- /dev/null +++ b/chernyshov_nikita_lab_3/games_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"] \ No newline at end of file diff --git a/chernyshov_nikita_lab_3/games_service/main.py b/chernyshov_nikita_lab_3/games_service/main.py new file mode 100644 index 0000000..3bf68bf --- /dev/null +++ b/chernyshov_nikita_lab_3/games_service/main.py @@ -0,0 +1,53 @@ +from flask import Flask, jsonify, request +import uuid + +app = Flask(__name__) + +games = {} + + +@app.route('/games', methods=['GET']) +def get_games(): + return jsonify(list(games.values())) + +@app.route('/games/', methods=['GET']) +def get_game(game_uuid): + game = games.get(str(game_uuid)) + if game: + return jsonify(game) + return jsonify({'error': 'Not found'}), 404 + +@app.route('/games', methods=['POST']) +def create_game(): + data = request.get_json() + game_uuid = str(uuid.uuid4()) + game = { + 'uuid': game_uuid, + 'name': data['name'], + 'developer': data['developer'], + 'genres': data.get('genres', []) # List of genre UUIDs + } + games[game_uuid] = game + return jsonify(game), 201 + +@app.route('/games/', methods=['PUT']) +def update_game(game_uuid): + game = games.get(str(game_uuid)) + if not game: + return jsonify({'error': 'Not found'}), 404 + data = request.get_json() + game['name'] = data['name'] + game['developer'] = data['developer'] + game['genres'] = data.get('genres', []) + return jsonify(game) + +@app.route('/games/', methods=['DELETE']) +def delete_game(game_uuid): + if str(game_uuid) in games: + del games[str(game_uuid)] + return '', 204 + return jsonify({'error': 'Not found'}), 404 + + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=5000) \ No newline at end of file diff --git a/chernyshov_nikita_lab_3/games_service/requirements.txt b/chernyshov_nikita_lab_3/games_service/requirements.txt new file mode 100644 index 0000000..2077213 --- /dev/null +++ b/chernyshov_nikita_lab_3/games_service/requirements.txt @@ -0,0 +1 @@ +Flask \ No newline at end of file diff --git a/chernyshov_nikita_lab_3/genres_service/Dockerfile b/chernyshov_nikita_lab_3/genres_service/Dockerfile new file mode 100644 index 0000000..851c5df --- /dev/null +++ b/chernyshov_nikita_lab_3/genres_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"] \ No newline at end of file diff --git a/chernyshov_nikita_lab_3/genres_service/main.py b/chernyshov_nikita_lab_3/genres_service/main.py new file mode 100644 index 0000000..f652c60 --- /dev/null +++ b/chernyshov_nikita_lab_3/genres_service/main.py @@ -0,0 +1,51 @@ +from flask import Flask, jsonify, request +import uuid + +app = Flask(__name__) + +genres = {} + + +@app.route('/genres', methods=['GET']) +def get_genres(): + return jsonify(list(genres.values())) + +@app.route('/genres/', methods=['GET']) +def get_genre(genre_uuid): + genre = genres.get(str(genre_uuid)) + if genre: + return jsonify(genre) + return jsonify({'error': 'Not found'}), 404 + +@app.route('/genres', methods=['POST']) +def create_genre(): + data = request.get_json() + genre_uuid = str(uuid.uuid4()) + genre = { + 'uuid': genre_uuid, + 'name': data['name'], + 'description': data['description'] + } + genres[genre_uuid] = genre + return jsonify(genre), 201 + +@app.route('/genres/', methods=['PUT']) +def update_genre(genre_uuid): + genre = genres.get(str(genre_uuid)) + if not genre: + return jsonify({'error': 'Not found'}), 404 + data = request.get_json() + genre['name'] = data['name'] + genre['description'] = data['description'] + return jsonify(genre) + +@app.route('/genres/', methods=['DELETE']) +def delete_genre(genre_uuid): + if str(genre_uuid) in genres: + del genres[str(genre_uuid)] + return '', 204 + return jsonify({'error': 'Not found'}), 404 + + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=5001) \ No newline at end of file diff --git a/chernyshov_nikita_lab_3/genres_service/requirements.txt b/chernyshov_nikita_lab_3/genres_service/requirements.txt new file mode 100644 index 0000000..2077213 --- /dev/null +++ b/chernyshov_nikita_lab_3/genres_service/requirements.txt @@ -0,0 +1 @@ +Flask \ No newline at end of file diff --git a/chernyshov_nikita_lab_3/nginx/nginx.conf b/chernyshov_nikita_lab_3/nginx/nginx.conf new file mode 100644 index 0000000..d3cc7f0 --- /dev/null +++ b/chernyshov_nikita_lab_3/nginx/nginx.conf @@ -0,0 +1,11 @@ +server { + listen 80; + + location /games { + proxy_pass http://games_service:5000; + } + + location /genres { + proxy_pass http://genres_service:5001; + } +} \ No newline at end of file