DAS_2023_1/simonov_nikita_lab_3
2024-01-22 02:31:48 +04:00
..
geodata_service simonov nikita lab 3 done 2024-01-22 02:31:48 +04:00
nginx simonov nikita lab 3 done 2024-01-22 02:31:48 +04:00
user_service simonov nikita lab 3 done 2024-01-22 02:31:48 +04:00
docker-compose.yaml simonov nikita lab 3 done 2024-01-22 02:31:48 +04:00
readme.md simonov nikita lab 3 done 2024-01-22 02:31:48 +04:00

Лабораторная работа №3.

Задание

  • Создать 2 микросервиса, реализующих CRUD на связанных сущностях.
  • Реализовать механизм синхронного обмена сообщениями между микросервисами.
  • Реализовать шлюз на основе прозрачного прокси-сервера nginx.

Вариант: геоданные и пользователи

Выбранные сервисы

Были написаны два сервиса на языке python с технологией flask:

  • Сервис geodata_service, хранящий геоданные и реализующий CRUD операции с ними через HTTP запросы.
  • Сервис user_service, хранящий данные о пользователях и реализующий CRUD операции с ними через HTTP запросы.

Docker-файл для geodata_service

FROM python:3.11
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . /app
CMD ["gunicorn", "--bind", "0.0.0.0:5001", "geodata_service:app"]

Docker-файл для user_service

FROM python:3.11
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . /app
CMD ["gunicorn", "--bind", "0.0.0.0:5002", "user_service:app"]

Docker-файл для nginx

FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

nginx.conf

events {
    worker_connections 1024;
}

http {
    server {
        listen 80;
        listen [::]:80;
        server_name localhost;

        location /geodata-service/ {
            proxy_pass http://geodata-service:5001/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }

        location /user-service/ {
            proxy_pass http://user-service:5002/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}

Docker-compose

version: '3.8'

services:
  geodata-service:
    build:
      context: ./geodata_service
    ports:
      - "5001:5001"
    networks:
      - my_network
    restart: always

  user-service:
    build:
      context: ./user_service
    ports:
      - "5002:5002"
    networks:
      - my_network
    restart: always

  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    depends_on:
      - geodata-service
      - user-service
    networks:
      - my_network
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    restart: always

networks:
  my_network:
    driver: bridge

Запуск

Командой в консоли проекта:

docker-compose up -d --build

Ссылка на видео

https://drive.google.com/file/d/1dXwl8p4sL60CcTIrtSztYgMNt0RL4qXe/view?usp=sharing