From abea29a111f406fafa41753d1551598661b9d05e Mon Sep 17 00:00:00 2001 From: Kseniy <––ƒ––iputilin201@gmail.com> Date: Sun, 8 Dec 2024 22:45:33 +0400 Subject: [PATCH 1/2] kurushina_ksenia_lab_3 --- kurushina_ksenia_lab_3/README.md | 45 ++++++++++++++++++ .../book_service/Dockerfile | 5 ++ kurushina_ksenia_lab_3/book_service/main.py | 39 +++++++++++++++ kurushina_ksenia_lab_3/docker-compose.yml | 23 +++++++++ kurushina_ksenia_lab_3/img.png | Bin 0 -> 33964 bytes kurushina_ksenia_lab_3/img_1.png | Bin 0 -> 37734 bytes kurushina_ksenia_lab_3/nginx/Dockerfile | 3 ++ kurushina_ksenia_lab_3/nginx/nginx.conf | 21 ++++++++ .../shelf_service/Dockerfile | 5 ++ kurushina_ksenia_lab_3/shelf_service/main.py | 43 +++++++++++++++++ 10 files changed, 184 insertions(+) create mode 100644 kurushina_ksenia_lab_3/README.md create mode 100644 kurushina_ksenia_lab_3/book_service/Dockerfile create mode 100644 kurushina_ksenia_lab_3/book_service/main.py create mode 100644 kurushina_ksenia_lab_3/docker-compose.yml create mode 100644 kurushina_ksenia_lab_3/img.png create mode 100644 kurushina_ksenia_lab_3/img_1.png create mode 100644 kurushina_ksenia_lab_3/nginx/Dockerfile create mode 100644 kurushina_ksenia_lab_3/nginx/nginx.conf create mode 100644 kurushina_ksenia_lab_3/shelf_service/Dockerfile create mode 100644 kurushina_ksenia_lab_3/shelf_service/main.py diff --git a/kurushina_ksenia_lab_3/README.md b/kurushina_ksenia_lab_3/README.md new file mode 100644 index 0000000..b1d7a87 --- /dev/null +++ b/kurushina_ksenia_lab_3/README.md @@ -0,0 +1,45 @@ +Лабораторная работа №3 - REST API, шлюз и синхронный обмен данными между микросервисами + +Задание + +Цель: +Изучение принципов проектирования с использованием паттерна шлюза, +организации синхронной передачи данных между микросервисами +и применения архитектурного стиля RESTful API. + + +Задачи: +Создание двух микросервисов, которые реализуют операции CRUD для связанных сущностей. +Реализация механизма синхронного обмена данными между микросервисами. +Настройка шлюза на базе Nginx в качестве прозрачного прокси-сервера. +Микросервисы: +book_service — сервис, который управляет книгами. +shelf_service — сервис, который обрабатывает данные о полках. +Связь между микросервисами: +Один документ (book) может иметь множество связанных предметов (shelf) (соотношение 1 ко многим). +Как запустить проект: +Для запуска приложения необходимо выполнить команду: + +docker-compose up +Описание работы: +Для разработки микросервисов был выбран язык программирования Python. + +Синхронный обмен данными +Сервис book_service отправляет HTTP-запросы к shelf_service +при выполнении определенных операций CRUD. Это позволяет получать актуальную информацию о книгах, +связанных с конкретными полками. + +Docker Compose +Конфигурационный файл docker-compose.yml +представляет собой многоконтейнерное приложение, которое включает в себя три сервиса: +book_service, shelf_service и nginx. Функция маршрутизации возложена на сервер Nginx, +который обрабатывает запросы и перенаправляет их на соответствующие микросервисы. + +Nginx +Конфигурационный файл Nginx определяет настройки веб-сервера и +обратного прокси, который управляет входящими запросами +и направляет их на соответствующие сервисы. + +ВК + +https://cloud.mail.ru/public/Aijk/T8myacqz5 \ No newline at end of file diff --git a/kurushina_ksenia_lab_3/book_service/Dockerfile b/kurushina_ksenia_lab_3/book_service/Dockerfile new file mode 100644 index 0000000..1804d45 --- /dev/null +++ b/kurushina_ksenia_lab_3/book_service/Dockerfile @@ -0,0 +1,5 @@ +FROM python:3.9-slim +WORKDIR /app +COPY app.py /app +RUN pip install flask requests +CMD ["python", "app.py"] diff --git a/kurushina_ksenia_lab_3/book_service/main.py b/kurushina_ksenia_lab_3/book_service/main.py new file mode 100644 index 0000000..a463152 --- /dev/null +++ b/kurushina_ksenia_lab_3/book_service/main.py @@ -0,0 +1,39 @@ +from flask import Flask, jsonify, request + +app = Flask(__name__) + +BOOKS = [] + +@app.route('/books', methods=['GET']) +def get_books(): + return jsonify(BOOKS) + +@app.route('/books/', methods=['GET']) +def get_book(id): + book = next((book for book in BOOKS if book['id'] == id), None) + if book: + return jsonify(book) + return jsonify({"message": "Book not found"}), 404 + +@app.route('/books', methods=['POST']) +def create_book(): + new_book = request.get_json() + BOOKS.append(new_book) + return jsonify(new_book), 201 + +@app.route('/books/', methods=['PUT']) +def update_book(id): + book = next((book for book in BOOKS if book['id'] == id), None) + if book: + book.update(request.get_json()) + return jsonify(book) + return jsonify({"message": "Book not found"}), 404 + +@app.route('/books/', methods=['DELETE']) +def delete_book(id): + global BOOKS + BOOKS = [book for book in BOOKS if book['id'] != id] + return '', 204 + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=5000) diff --git a/kurushina_ksenia_lab_3/docker-compose.yml b/kurushina_ksenia_lab_3/docker-compose.yml new file mode 100644 index 0000000..fbbe719 --- /dev/null +++ b/kurushina_ksenia_lab_3/docker-compose.yml @@ -0,0 +1,23 @@ +version: '3.8' + +services: + book_service: + build: + context: . + dockerfile: book_service/Dockerfile + ports: + - "5000:5000" + + shelf_service: + build: + context: . + dockerfile: shelf_service/Dockerfile + ports: + - "5001:5001" + + nginx: + build: + context: . + dockerfile: nginx/Dockerfile + ports: + - "80:80" diff --git a/kurushina_ksenia_lab_3/img.png b/kurushina_ksenia_lab_3/img.png new file mode 100644 index 0000000000000000000000000000000000000000..33b1944e33ad847f7ec0baaa4421cbe222c223b4 GIT binary patch literal 33964 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 literal 0 HcmV?d00001 diff --git a/kurushina_ksenia_lab_3/nginx/Dockerfile b/kurushina_ksenia_lab_3/nginx/Dockerfile new file mode 100644 index 0000000..9e620af --- /dev/null +++ b/kurushina_ksenia_lab_3/nginx/Dockerfile @@ -0,0 +1,3 @@ +FROM nginx:alpine + +COPY nginx.conf /etc/nginx/nginx.conf diff --git a/kurushina_ksenia_lab_3/nginx/nginx.conf b/kurushina_ksenia_lab_3/nginx/nginx.conf new file mode 100644 index 0000000..538e0c5 --- /dev/null +++ b/kurushina_ksenia_lab_3/nginx/nginx.conf @@ -0,0 +1,21 @@ +server { + listen 80; + + location /books { + proxy_pass http://book_service:5000; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_cache_bypass $http_upgrade; + } + + location /shelves { + proxy_pass http://shelf_service:5001; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_cache_bypass $http_upgrade; + } +} diff --git a/kurushina_ksenia_lab_3/shelf_service/Dockerfile b/kurushina_ksenia_lab_3/shelf_service/Dockerfile new file mode 100644 index 0000000..1804d45 --- /dev/null +++ b/kurushina_ksenia_lab_3/shelf_service/Dockerfile @@ -0,0 +1,5 @@ +FROM python:3.9-slim +WORKDIR /app +COPY app.py /app +RUN pip install flask requests +CMD ["python", "app.py"] diff --git a/kurushina_ksenia_lab_3/shelf_service/main.py b/kurushina_ksenia_lab_3/shelf_service/main.py new file mode 100644 index 0000000..b47130b --- /dev/null +++ b/kurushina_ksenia_lab_3/shelf_service/main.py @@ -0,0 +1,43 @@ +from flask import Flask, jsonify, request +import requests + +app = Flask(__name__) + +SHELVES = [] + +@app.route('/shelves', methods=['GET']) +def get_shelves(): + book_service_url = "http://book_service:5000/books" + response = requests.get(book_service_url) + books = response.json() + + shelves = {} + for book in books: + if book["shelf"] not in shelves: + shelves[book["shelf"]] = [] + shelves[book["shelf"]].append(book) + + return jsonify(shelves) + +@app.route('/shelves', methods=['POST']) +def create_shelf(): + new_shelf = request.get_json() + SHELVES.append(new_shelf) + return jsonify(new_shelf), 201 + +@app.route('/shelves/', methods=['PUT']) +def update_shelf(name): + shelf = next((shelf for shelf in SHELVES if shelf['name'] == name), None) + if shelf: + shelf.update(request.get_json()) + return jsonify(shelf) + return jsonify({"message": "Shelf not found"}), 404 + +@app.route('/shelves/', methods=['DELETE']) +def delete_shelf(name): + global SHELVES + SHELVES = [shelf for shelf in SHELVES if shelf['name'] != name] + return '', 204 + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=5001) From 7811d112d9aefe7892373c9f43893dcae09b4756 Mon Sep 17 00:00:00 2001 From: Kseniy <––ƒ––iputilin201@gmail.com> Date: Sun, 8 Dec 2024 22:45:52 +0400 Subject: [PATCH 2/2] kurushina_ksenia_lab_3 --- kurushina_ksenia_lab_3/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kurushina_ksenia_lab_3/README.md b/kurushina_ksenia_lab_3/README.md index b1d7a87..15fb9c0 100644 --- a/kurushina_ksenia_lab_3/README.md +++ b/kurushina_ksenia_lab_3/README.md @@ -40,6 +40,6 @@ Nginx обратного прокси, который управляет входящими запросами и направляет их на соответствующие сервисы. -ВК +ВИДЕО https://cloud.mail.ru/public/Aijk/T8myacqz5 \ No newline at end of file