From 53cf0d77c48bea4fa687af9e18011551cfac5260 Mon Sep 17 00:00:00 2001 From: igors Date: Sat, 14 Dec 2024 23:03:37 +0400 Subject: [PATCH 1/3] * --- .idea/misc.xml | 3 + melnikov_igor_lab_3/README.md | 49 ++++++++++++++++ melnikov_igor_lab_3/docker-compose.yml | 24 ++++++++ melnikov_igor_lab_3/nginx/nginx.conf | 11 ++++ melnikov_igor_lab_3/order_service/Dockerfile | 10 ++++ melnikov_igor_lab_3/order_service/main.py | 56 +++++++++++++++++++ .../order_service/requirements.txt | 1 + melnikov_igor_lab_3/user_service/Dockerfile | 10 ++++ melnikov_igor_lab_3/user_service/main.py | 54 ++++++++++++++++++ .../user_service/requirements.txt | 1 + 10 files changed, 219 insertions(+) create mode 100644 melnikov_igor_lab_3/README.md create mode 100644 melnikov_igor_lab_3/docker-compose.yml create mode 100644 melnikov_igor_lab_3/nginx/nginx.conf create mode 100644 melnikov_igor_lab_3/order_service/Dockerfile create mode 100644 melnikov_igor_lab_3/order_service/main.py create mode 100644 melnikov_igor_lab_3/order_service/requirements.txt create mode 100644 melnikov_igor_lab_3/user_service/Dockerfile create mode 100644 melnikov_igor_lab_3/user_service/main.py create mode 100644 melnikov_igor_lab_3/user_service/requirements.txt diff --git a/.idea/misc.xml b/.idea/misc.xml index ae8ddd2..649b6d9 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,7 @@ + + \ No newline at end of file diff --git a/melnikov_igor_lab_3/README.md b/melnikov_igor_lab_3/README.md new file mode 100644 index 0000000..d7566e0 --- /dev/null +++ b/melnikov_igor_lab_3/README.md @@ -0,0 +1,49 @@ + +# Лабораторная работа №3 - REST API, шлюз и синхронный обмен данными между микросервисами + +## Задание + +### Цель +Изучение принципов проектирования с использованием паттерна шлюза, организации синхронной передачи данных между микросервисами и применения архитектурного стиля RESTful API. + +### Задачи +1. Создание двух микросервисов, которые реализуют операции CRUD для связанных сущностей. +2. Реализация механизма синхронного обмена данными между микросервисами. +3. Настройка шлюза на базе Nginx в качестве прозрачного прокси-сервера. + +### Микросервисы +1. **user_service** — сервис, который управляет информацией о пользователях. +2. **order_service** — сервис, который обрабатывает данные о заказах пользователей. + +### Связь между микросервисами +- Один документ (user) может иметь множество связанных предметов (orders) (соотношение 1 ко многим). + +### Структура проекта + +``` +lab_3/ +|-- nginx/ +| |-- nginx.conf +|-- order_service/ +| |-- Dockerfile +| |-- main.py +| |-- requirements.txt +|-- user_service/ +| |-- Dockerfile +| |-- main.py +| |-- requirements.txt +|-- docker-compose.yml +``` + +## Описание работы: + +Для разработки микросервисов был выбран язык программирования Python. + +### Синхронный обмен данными +Сервис `user_service` отправляет HTTP-запросы к `order_service` при выполнении определенных операций CRUD. Это позволяет получать актуальную информацию о предметах, связанных с конкретными героями. + +### Docker Compose +Конфигурационный файл `docker-compose.yml` представляет собой многоконтейнерное приложение, которое включает в себя три сервиса: `user_service`, `order_service` и `nginx`. Функция маршрутизации возложена на сервер Nginx, который обрабатывает запросы и перенаправляет их на соответствующие микросервисы. + +### Nginx +Конфигурационный файл Nginx определяет настройки веб-сервера и обратного прокси, который управляет входящими запросами и направляет их на соответствующие сервисы. \ No newline at end of file diff --git a/melnikov_igor_lab_3/docker-compose.yml b/melnikov_igor_lab_3/docker-compose.yml new file mode 100644 index 0000000..7afd3c4 --- /dev/null +++ b/melnikov_igor_lab_3/docker-compose.yml @@ -0,0 +1,24 @@ +services: + user_service: + build: + context: ./user_service + dockerfile: Dockerfile + ports: + - "5000:5000" + + order_service: + build: + context: ./order_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: + - user_service + - order_service diff --git a/melnikov_igor_lab_3/nginx/nginx.conf b/melnikov_igor_lab_3/nginx/nginx.conf new file mode 100644 index 0000000..cc99b23 --- /dev/null +++ b/melnikov_igor_lab_3/nginx/nginx.conf @@ -0,0 +1,11 @@ +server { + listen 80; + + location /users { + proxy_pass http://user_service:5000; + } + + location /orders { + proxy_pass http://order_service:5001; + } +} diff --git a/melnikov_igor_lab_3/order_service/Dockerfile b/melnikov_igor_lab_3/order_service/Dockerfile new file mode 100644 index 0000000..7a7319a --- /dev/null +++ b/melnikov_igor_lab_3/order_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/melnikov_igor_lab_3/order_service/main.py b/melnikov_igor_lab_3/order_service/main.py new file mode 100644 index 0000000..2c056b6 --- /dev/null +++ b/melnikov_igor_lab_3/order_service/main.py @@ -0,0 +1,56 @@ +from flask import Flask, jsonify, request +import uuid + +app = Flask(__name__) + +orders = {} + +# вывод всех заказов +@app.route('/orders', methods=['GET']) +def get_orders(): + return jsonify(list(orders.values())) + +# получение заказа по uuid +@app.route('/orders/', methods=['GET']) +def get_order(order_uuid): + order = orders.get(str(order_uuid)) + if order: + return jsonify(order) + return jsonify({'error': 'Not found'}), 404 + +# добавление нового заказа +@app.route('/orders', methods=['POST']) +def create_order(): + data = request.json + order_uuid = str(uuid.uuid4()) + order = { + 'uuid': order_uuid, + 'number': data['number'], + 'product': data['product'], + 'user_uuid': data['user_uuid'] + } + orders[order_uuid] = order + return jsonify(order), 201 + +# изменение заказа по uuid +@app.route('/orders/', methods=['PUT']) +def update_order(order_uuid): + order = orders.get(str(order_uuid)) + if not order: + return jsonify({'error': 'Not found'}), 404 + data = request.json + order['number'] = data['number'] + order['product'] = data['product'] + order['user_uuid'] = data['user_uuid'] + return jsonify(order) + +# удаление заказа по uuid +@app.route('/orders/', methods=['DELETE']) +def delete_order(order_uuid): + if str(order_uuid) in orders: + del orders[str(order_uuid)] + return '', 204 + return jsonify({'error': 'Not found'}), 404 + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=5001) diff --git a/melnikov_igor_lab_3/order_service/requirements.txt b/melnikov_igor_lab_3/order_service/requirements.txt new file mode 100644 index 0000000..e3e9a71 --- /dev/null +++ b/melnikov_igor_lab_3/order_service/requirements.txt @@ -0,0 +1 @@ +Flask diff --git a/melnikov_igor_lab_3/user_service/Dockerfile b/melnikov_igor_lab_3/user_service/Dockerfile new file mode 100644 index 0000000..7a7319a --- /dev/null +++ b/melnikov_igor_lab_3/user_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/melnikov_igor_lab_3/user_service/main.py b/melnikov_igor_lab_3/user_service/main.py new file mode 100644 index 0000000..632063a --- /dev/null +++ b/melnikov_igor_lab_3/user_service/main.py @@ -0,0 +1,54 @@ +from flask import Flask, jsonify, request +import uuid + +app = Flask(__name__) + +users = {} + +# вывод всех пользователей +@app.route('/users', methods=['GET']) +def get_users(): + return jsonify(list(users.values())) + +# получение пользователя по uuid +@app.route('/users/', methods=['GET']) +def get_user(user_uuid): + user = users.get(str(user_uuid)) + if user: + return jsonify(user) + return jsonify({'error': 'Not found'}), 404 + +# добавление нового пользователя +@app.route('/users', methods=['POST']) +def create_user(): + data = request.get_json() + user_uuid = str(uuid.uuid4()) + user = { + 'uuid': user_uuid, + 'name': data['name'], + 'age': data['age'] + } + users[user_uuid] = user + return jsonify(user), 201 + +# изменение пользователя по uuid +@app.route('/users/', methods=['PUT']) +def update_user(user_uuid): + user = users.get(str(user_uuid)) + if not user: + return jsonify({'error': 'Not found'}), 404 + data = request.get_json() + user['name'] = data['name'] + user['age'] = data['age'] + return jsonify(user) + +# удаление пользователя по uuid +@app.route('/users/', methods=['DELETE']) +def delete_user(user_uuid): + if str(user_uuid) in users: + del users[str(user_uuid)] + return '', 204 + return jsonify({'error': 'Not found'}), 404 + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=5000) diff --git a/melnikov_igor_lab_3/user_service/requirements.txt b/melnikov_igor_lab_3/user_service/requirements.txt new file mode 100644 index 0000000..e3e9a71 --- /dev/null +++ b/melnikov_igor_lab_3/user_service/requirements.txt @@ -0,0 +1 @@ +Flask -- 2.25.1 From f3b296e4bbc3baa011a2aafbfc24e42002c22f58 Mon Sep 17 00:00:00 2001 From: igors Date: Sun, 15 Dec 2024 02:41:47 +0400 Subject: [PATCH 2/3] . --- melnikov_igor_lab_3/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/melnikov_igor_lab_3/README.md b/melnikov_igor_lab_3/README.md index d7566e0..edb30fc 100644 --- a/melnikov_igor_lab_3/README.md +++ b/melnikov_igor_lab_3/README.md @@ -46,4 +46,7 @@ lab_3/ Конфигурационный файл `docker-compose.yml` представляет собой многоконтейнерное приложение, которое включает в себя три сервиса: `user_service`, `order_service` и `nginx`. Функция маршрутизации возложена на сервер Nginx, который обрабатывает запросы и перенаправляет их на соответствующие микросервисы. ### Nginx -Конфигурационный файл Nginx определяет настройки веб-сервера и обратного прокси, который управляет входящими запросами и направляет их на соответствующие сервисы. \ No newline at end of file +Конфигурационный файл Nginx определяет настройки веб-сервера и обратного прокси, который управляет входящими запросами и направляет их на соответствующие сервисы. + +## Видео работы программы +https://disk.yandex.ru/i/Tp5FOgqlS4UALA \ No newline at end of file -- 2.25.1 From f89b4560be76cac294db6c53e4137080d78a83f0 Mon Sep 17 00:00:00 2001 From: igors Date: Sun, 15 Dec 2024 15:04:12 +0400 Subject: [PATCH 3/3] =?UTF-8?q?=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BB=D0=B8=D1=88=D0=BD=D0=B8=D1=85=20=D1=84=D0=B0?= =?UTF-8?q?=D0=B9=D0=BB=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.gitignore | 6 ------ .idea/.name | 1 - .idea/inspectionProfiles/Project_Default.xml | 12 ------------ .idea/inspectionProfiles/profiles_settings.xml | 6 ------ .idea/misc.xml | 7 ------- 5 files changed, 32 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/.name delete mode 100644 .idea/inspectionProfiles/Project_Default.xml delete mode 100644 .idea/inspectionProfiles/profiles_settings.xml delete mode 100644 .idea/misc.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 608d685..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -/DAS_2024_1.iml -/modules.xml -/vcs.xml diff --git a/.idea/.name b/.idea/.name deleted file mode 100644 index 11a5d8e..0000000 --- a/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -main.py \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index 74ac817..0000000 --- a/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml deleted file mode 100644 index 105ce2d..0000000 --- a/.idea/inspectionProfiles/profiles_settings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 649b6d9..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - \ No newline at end of file -- 2.25.1