Microservices Application with Flutter Flask MongoDB RabbitMQ

Dhiraj Patra
3 min readAug 15, 2024

--

A complete microservice application setup with a Flutter app, MongoDB, and RabbitMQ, along with all the necessary files and folder structure. The setup uses Docker Compose to orchestrate the services.

Folder Structure

```

microservice-app/

├── backend/

│ ├── Dockerfile

│ ├── requirements.txt

│ ├── main.py

│ └── config.py

├── frontend/

│ ├── Dockerfile

│ ├── pubspec.yaml

│ └── lib/

│ └── main.dart

├── docker-compose.yml

└── README.md

```

1. `docker-compose.yml`

```yaml

version: ‘3.8’

services:

backend:

build: ./backend

container_name: backend

ports:

- “8000:8000”

depends_on:

- mongodb

- rabbitmq

environment:

- MONGO_URI=mongodb://mongodb:27017/flutterdb

- RABBITMQ_URI=amqp://guest:guest@rabbitmq:5672/

networks:

- microservice-network

mongodb:

image: mongo:latest

container_name: mongodb

ports:

- “27017:27017”

networks:

- microservice-network

rabbitmq:

image: rabbitmq:3-management

container_name: rabbitmq

ports:

- “5672:5672”

- “15672:15672”

networks:

- microservice-network

frontend:

build: ./frontend

container_name: frontend

ports:

- “8080:8080”

depends_on:

- backend

networks:

- microservice-network

networks:

microservice-network:

driver: bridge

```

2. Backend Service

2.1 `backend/Dockerfile`

```dockerfile

FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt requirements.txt

RUN pip install -r requirements.txt

COPY . .

CMD [“python”, “main.py”]

```

2.2 `backend/requirements.txt`

```txt

fastapi

pymongo

pika

uvicorn

```

2.3 `backend/config.py`

```python

import os

MONGO_URI = os.getenv(‘MONGO_URI’)

RABBITMQ_URI = os.getenv(‘RABBITMQ_URI’)

```

2.4 `backend/main.py`

```python

from fastapi import FastAPI

from pymongo import MongoClient

import pika

import config

app = FastAPI()

client = MongoClient(config.MONGO_URI)

db = client.flutterdb

# RabbitMQ Connection

params = pika.URLParameters(config.RABBITMQ_URI)

connection = pika.BlockingConnection(params)

channel = connection.channel()

@app.get(“/”)

async def read_root():

return {“message”: “Backend service running”}

@app.post(“/data”)

async def create_data(data: dict):

db.collection.insert_one(data)

channel.basic_publish(exchange=’’, routing_key=’flutter_queue’, body=str(data))

return {“message”: “Data inserted and sent to RabbitMQ”}

```

3. Frontend Service

3.1 `frontend/Dockerfile`

```dockerfile

FROM cirrusci/flutter:stable

WORKDIR /app

COPY . .

RUN flutter build web

CMD [“flutter”, “run”, “-d”, “chrome”]

```

3.2 `frontend/pubspec.yaml`

```yaml

name: flutter_app

description: A new Flutter project.

version: 1.0.0+1

environment:

sdk: “>=2.7.0 ❤.0.0”

dependencies:

flutter:

sdk: flutter

http: ^0.13.3

dev_dependencies:

flutter_test:

sdk: flutter

```

#### 3.3 `frontend/lib/main.dart`

```dart

import ‘package:flutter/material.dart’;

import ‘package:http/http.dart’ as http;

void main() {

runApp(MyApp());

}

class MyApp extends StatelessWidget {

@override

Widget build(BuildContext context) {

return MaterialApp(

title: ‘Flutter Demo’,

theme: ThemeData(

primarySwatch: Colors.blue,

),

home: MyHomePage(),

);

}

}

class MyHomePage extends StatefulWidget {

@override

_MyHomePageState createState() => _MyHomePageState();

}

class _MyHomePageState extends State<MyHomePage> {

Future<void> sendData() async {

final response = await http.post(

Uri.parse(‘http://backend:8000/data'),

body: {‘key’: ‘value’},

);

print(‘Response status: ${response.statusCode}’);

print(‘Response body: ${response.body}’);

}

@override

Widget build(BuildContext context) {

return Scaffold(

appBar: AppBar(

title: Text(‘Flutter Microservice App’),

),

body: Center(

child: ElevatedButton(

onPressed: sendData,

child: Text(‘Send Data to Backend’),

),

),

);

}

}

```

4. `README.md`

```markdown

# Microservice Application

## Overview

This is a microservice application setup consisting of a Flutter app (frontend), a FastAPI service (backend), MongoDB, and RabbitMQ. All services are orchestrated using Docker Compose.

## How to Run

1. Clone the repository:

```bash

git clone https://github.com/your-repo/microservice-app.git

cd microservice-app

```

2. Build and run the containers:

```bash

docker-compose up — build

```

3. Access the services:

- Frontend: `http://localhost:8080`

- Backend: `http://localhost:8000`

- RabbitMQ Management: `http://localhost:15672`

- MongoDB: `mongodb://localhost:27017`

```

### Instructions to Run the Application

1. Ensure Docker and Docker Compose are installed on your machine.

2. Place the folder structure and files as described above.

3. Navigate to the root of the `microservice-app` folder.

4. Run `docker-compose up — build` to build and start the application.

5. Access the frontend on `http://localhost:8080`, backend on `http://localhost:8000`, and RabbitMQ Management UI on `http://localhost:15672`.

This setup provides a working microservice application with a Flutter frontend, FastAPI backend, MongoDB for storage, and RabbitMQ for messaging.

--

--

Dhiraj Patra

AI Strategy, Generative AI, AI & ML Consulting, Product Development, Startup Advisory, Data Architecture, Data Analytics, Executive Mentorship, Value Creation