diff --git a/presnyakova_victoria_lab_3/event_service/Dockerfile b/presnyakova_victoria_lab_3/event_service/Dockerfile index 4d1817a..b976e86 100644 --- a/presnyakova_victoria_lab_3/event_service/Dockerfile +++ b/presnyakova_victoria_lab_3/event_service/Dockerfile @@ -2,7 +2,7 @@ FROM python:3.9 EXPOSE 8081 -RUN pip install Flask requests flasgger +RUN pip install Flask requests WORKDIR /work diff --git a/presnyakova_victoria_lab_3/event_service/event_service.py b/presnyakova_victoria_lab_3/event_service/event_service.py index b346216..59acef7 100644 --- a/presnyakova_victoria_lab_3/event_service/event_service.py +++ b/presnyakova_victoria_lab_3/event_service/event_service.py @@ -24,24 +24,24 @@ def get_all(): return jsonify(events) -@app.route('/', methods=['GET', 'PUT', 'DELETE']) -def get_by_id(msg_id): - if msg_id not in events.keys(): +@app.route('/', methods=['GET', 'PUT', 'DELETE']) +def get_by_id(event_id): + if event_id not in events.keys(): return Response(status=404) if request.method == 'PUT': dto = request.get_json()['dto'] - events[msg_id] = { + events[event_id] = { 'session': dto['session'], 'info': dto['info'], 'dt': datetime.now() } - return events[msg_id] + return events[event_id] elif request.method == 'DELETE': - events.pop(msg_id) + events.pop(event_id) return Response(status=200) - return jsonify(events[msg_id]) + return jsonify(events[event_id]) if __name__ == '__main__': diff --git a/presnyakova_victoria_lab_3/readme.md b/presnyakova_victoria_lab_3/readme.md new file mode 100644 index 0000000..6c402e2 --- /dev/null +++ b/presnyakova_victoria_lab_3/readme.md @@ -0,0 +1,31 @@ +# Задание: + +- Создать 2 микросервиса, реализующих CRUD на связанных сущностях. +- Реализовать механизм синхронного обмена сообщениями между микросервисами. +- Реализовать шлюз на основе прозрачного прокси-сервера nginx. + +Вариант: Сессии и события + +## Выполнение + +Были написаны два сервиса на языке python: + +- Сервис session_service, хранящий данные о сессиях и реализующий CRUD операции с ними через HTTP запросы. +- Сервис event_service, хранящий данные о событиях и реализующий CRUD операции с ними через HTTP запросы. + +- Сервисы синхронно сообщены - сервис сессия запрашивает данные у сервиса событий для получения событий сессии. + +Для сервисов прописаны файлы Dockerfile, описывающие создание контейнеров: + +Для обоих контейнеров выбирается Python 3.9. +Оба контейнера проявляют порты, на которых работает приложение: 8081 для событий и 8082 для сессий. +В оба контейнера устанавливаются пакеты Flask и requests. +Выбирается рабочая директория /work и туда копируются файлы скриптов. +Командой запускаются сами скрипты. +Общий yaml-файл развёртки был настроен следующим образом: + +блок services, где перечислены разворачиваемые сервисы. +для каждого сервиса прописан build, где объявляется его папка и докерфайл создания и зависимости. +для сервиса nginx прописан порт для отображения вовне. + +## Видео https://drive.google.com/file/d/1my-e51bAoxUaMHKpGJmd9ZXSR5GnmORS/view?usp=sharing \ No newline at end of file diff --git a/presnyakova_victoria_lab_3/session_service/session_service.py b/presnyakova_victoria_lab_3/session_service/session_service.py index 1b0887f..e11dd1b 100644 --- a/presnyakova_victoria_lab_3/session_service/session_service.py +++ b/presnyakova_victoria_lab_3/session_service/session_service.py @@ -1,16 +1,18 @@ from flask import Flask, jsonify, request, Response from datetime import datetime +import requests + app = Flask(__name__) sessions = {0: {'id': 0, 'info': '{"distance": 1}', 'dt_start': datetime(2024, 10, 10, 8, 0), - 'dt_end': datetime(2024, 10, 11, 8, 0)}, + 'dt_end': datetime(2024, 10, 11, 8, 0), 'events': [0, 1]}, 1: {'id': 1, 'info': '{"distance": 1}', 'dt_start': datetime(2024, 10, 12, 8, 0), - 'dt_end': datetime(2024, 10, 13, 8, 0)}, + 'dt_end': datetime(2024, 10, 13, 8, 0), 'events': [0, 1]}, 2: {'id': 2, 'info': '{"distance": 1}', 'dt_start': datetime(2024, 10, 14, 8, 0), - 'dt_end': datetime(2024, 10, 15, 8, 0)}, + 'dt_end': datetime(2024, 10, 15, 8, 0), 'events': [0, 1]}, 3: {'id': 3, 'info': '{"distance": 1}', 'dt_start': datetime(2024, 10, 16, 8, 0), - 'dt_end': datetime(2024, 10, 17, 8, 0)}, + 'dt_end': datetime(2024, 10, 17, 8, 0), 'events': [0, 1]}, } @@ -30,24 +32,30 @@ def get_all(): return jsonify(sessions) -@app.route('/', methods=['GET', 'PUT', 'DELETE']) -def get_by_id(msg_id): - if msg_id not in sessions.keys(): +@app.route('/', methods=['GET', 'PUT', 'DELETE']) +def get_by_id(session_id): + if session_id not in sessions.keys(): return Response(status=404) if request.method == 'PUT': dto = request.get_json()['dto'] - sessions[msg_id] = { + sessions[session_id] = { 'info': dto['info'], 'dt_start': datetime.now(), - 'dt_end': datetime.now() + datetime.timedelta(days=1) + 'dt_end': datetime.now() + datetime.timedelta(days=1), } - return sessions[msg_id] + return sessions[session_id] elif request.method == 'DELETE': - sessions.pop(msg_id) + sessions.pop(session_id) return Response(status=200) - return jsonify(sessions[msg_id]) + session = sessions[session_id] + events = [] + for event_id in session['events']: + events.append(requests.get("http://event_service:8081/" + str(event_id)).json()) + session['events'] = events + + return jsonify(session) if __name__ == '__main__':