diff --git a/Kafka/docker-compose.yml b/Kafka/docker-compose.yml
new file mode 100644
index 0000000000000000000000000000000000000000..ac67edd7f1578e2ecd771e04f017a55d135c183a
--- /dev/null
+++ b/Kafka/docker-compose.yml
@@ -0,0 +1,44 @@
+version: "3"
+
+services:
+  zookeeper:
+    image: wurstmeister/zookeeper
+    container_name: zookeeper
+    ports:
+      - "2182:2182"
+    networks:
+      - kafka_network
+
+  kafka:
+    image: wurstmeister/kafka
+    container_name: kafka
+    ports:
+      - "9092:9092"
+    environment:
+      KAFKA_ADVERTISED_HOST_NAME: kafka
+      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
+      KAFKA_BOOTSTRAP_SEVERS: kafka:9092
+    networks:
+      - kafka_network
+
+  user-microservice:
+    image: user-microservice:1.0
+    container_name: user-microservice
+    depends_on:
+      - kafka
+      - zookeeper
+    networks:
+      - kafka_network
+
+  product-microservice:
+    image: product-microservice:1.0
+    container_name: product-microservice
+    depends_on:
+      - kafka
+      - zookeeper
+    networks:
+      - kafka_network
+      
+networks:
+  kafka_network:
+    driver: bridge
\ No newline at end of file
diff --git a/Product_MicroService_Group3/Dockerfile b/Product_MicroService_Group3/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..e51666e85b66d04d93dd8ed47ffa291991a71152
--- /dev/null
+++ b/Product_MicroService_Group3/Dockerfile
@@ -0,0 +1,23 @@
+FROM python:3.11.4
+
+COPY requirements.txt /product_ms/
+
+COPY app /product_ms/
+
+WORKDIR /product_ms
+
+RUN pip install --no-cache-dir -r requirements.txt
+
+
+RUN apt-get update && apt-get install -y \
+    unixodbc \
+    unixodbc-dev \
+    freetds-dev \
+    tdsodbc \
+    && rm -rf /var/lib/apt/lists/*
+
+# Set environment variables for ODBC configuration if needed
+ENV ODBCINI=/etc/odbc.ini
+ENV ODBCSYSINI=/etc
+
+CMD ["python", "index.py"]
\ No newline at end of file
diff --git a/Product_MicroService_Group3/app/config.py b/Product_MicroService_Group3/app/config.py
index 5ddee9138343724688ae8453ce6e8591c11b39c4..96b983721bde59aa5a40f74aee24fe6a8c0075ff 100644
--- a/Product_MicroService_Group3/app/config.py
+++ b/Product_MicroService_Group3/app/config.py
@@ -6,4 +6,4 @@ SECRET_KEY = "Group3"
 
 PORT = 5001
 
-KAFKA_SERVER= "localhost:9092"
\ No newline at end of file
+KAFKA_SERVER= "kafka:9092"
\ No newline at end of file
diff --git a/Product_MicroService_Group3/app/controllers/__pycache__/addReviewController.cpython-311.pyc b/Product_MicroService_Group3/app/controllers/__pycache__/addReviewController.cpython-311.pyc
index 0e51d65e2ae6279d43717f3f1f61d3ea671e160c..a8ef2134af3385e3f89b7bc21c35f53302104a00 100644
Binary files a/Product_MicroService_Group3/app/controllers/__pycache__/addReviewController.cpython-311.pyc and b/Product_MicroService_Group3/app/controllers/__pycache__/addReviewController.cpython-311.pyc differ
diff --git a/Product_MicroService_Group3/app/controllers/__pycache__/getReviewsController.cpython-311.pyc b/Product_MicroService_Group3/app/controllers/__pycache__/getReviewsController.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..6c78e2bcbd74045dce7a609453092db0728bf0ef
Binary files /dev/null and b/Product_MicroService_Group3/app/controllers/__pycache__/getReviewsController.cpython-311.pyc differ
diff --git a/Product_MicroService_Group3/app/controllers/getReviewsController.py b/Product_MicroService_Group3/app/controllers/getReviewsController.py
index 49b5f7c69bf6672aef2169449ab49050d84efac0..3ecdc45c326f26eba4710d3f4a5ef70e696db4a8 100644
--- a/Product_MicroService_Group3/app/controllers/getReviewsController.py
+++ b/Product_MicroService_Group3/app/controllers/getReviewsController.py
@@ -1,5 +1,6 @@
 from flask import Blueprint, jsonify, request, json, session
 from models.getReviews import get_reviews
+from config import KAFKA_SERVER
 
 from kafka import KafkaProducer
 
@@ -30,7 +31,7 @@ def get_review():
         return {"error" : "You need to be logged in to add a review"}
     
 
-producer = KafkaProducer(bootstrap_servers = "localhost:9092")
+producer = KafkaProducer(bootstrap_servers = KAFKA_SERVER)
 
 def send_review_message(reviews):
     metadata =producer.send("customer_reviews", json.dumps(reviews).encode("utf_8"))
diff --git a/Product_MicroService_Group3/app/publishers/kafkaPublishers.py b/Product_MicroService_Group3/app/publishers/kafkaPublishers.py
index 20018a03a2dfd3dd9ffb2be582a4263f85ebdae1..d03504a620a6397896bf554fed530ac58c48af2e 100644
--- a/Product_MicroService_Group3/app/publishers/kafkaPublishers.py
+++ b/Product_MicroService_Group3/app/publishers/kafkaPublishers.py
@@ -1,15 +1,16 @@
 from kafka import KafkaProducer
 from kafka.admin import KafkaAdminClient, NewTopic
+from config import KAFKA_SERVER
 
 import json
 
-producer = KafkaProducer(bootstrap_servers="localhost:9092")
+producer = KafkaProducer(bootstrap_servers=KAFKA_SERVER)
 
 
 #Creates the topic
 def create_product_updated_topic():
     # Create KafkaAdminClient instance
-    admin_client = KafkaAdminClient(bootstrap_servers="localhost:9092")
+    admin_client = KafkaAdminClient(bootstrap_servers=KAFKA_SERVER)
 
     # Define the topic name and configuration
     topic_name = "product_updated_topic"
diff --git a/Product_MicroService_Group3/requirements.txt b/Product_MicroService_Group3/requirements.txt
index 6da6fc6ef7722e29986acb00b7f1caba9b9e5545..aed8ace483f880061abeee73b97954403c1890b1 100644
--- a/Product_MicroService_Group3/requirements.txt
+++ b/Product_MicroService_Group3/requirements.txt
@@ -1,3 +1,14 @@
-Flask==3.0.0
+Flask==3.0.2
+Flask-Cors==4.0.0
 gunicorn==21.2.0
-boto3==1.29.0
\ No newline at end of file
+kafka-python==2.0.2
+pyodbc==5.1.0
+blinker==1.7.0
+click==8.1.7
+itsdangerous==2.1.2
+Jinja2==3.1.2
+Werkzeug==3.0.1
+boto3==1.34.71
+colorama==0.4.6
+MarkupSafe==2.1.3
+requests==2.31.0
\ No newline at end of file
diff --git a/User_MicroService_Group3/Dockerfile b/User_MicroService_Group3/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..3e7d584f9207328c2b4ae5b319bc506fcd1394da
--- /dev/null
+++ b/User_MicroService_Group3/Dockerfile
@@ -0,0 +1,23 @@
+FROM python:3.11.4
+
+COPY requirements.txt /user_ms/
+
+COPY app /user_ms/
+
+WORKDIR /user_ms
+
+RUN pip install --no-cache-dir -r requirements.txt
+
+
+RUN apt-get update && apt-get install -y \
+    unixodbc \
+    unixodbc-dev \
+    freetds-dev \
+    tdsodbc \
+    && rm -rf /var/lib/apt/lists/*
+
+# Set environment variables for ODBC configuration if needed
+ENV ODBCINI=/etc/odbc.ini
+ENV ODBCSYSINI=/etc
+
+CMD ["python", "index.py"]
\ No newline at end of file
diff --git a/User_MicroService_Group3/app/config.py b/User_MicroService_Group3/app/config.py
index 358b5ce9540cb4c24a27e99d55fedb7cc47a936c..3217efec4a6a96ac59bc14a1aef3f74470c83e1a 100644
--- a/User_MicroService_Group3/app/config.py
+++ b/User_MicroService_Group3/app/config.py
@@ -4,4 +4,6 @@ import os
 DEBUG = True
 SECRET_KEY = "Group3"
 
-PORT = 5000
\ No newline at end of file
+PORT = 5000
+
+KAFKA_SERVER = "kafka:9092"
\ No newline at end of file
diff --git a/User_MicroService_Group3/app/controllers/__pycache__/fetchUsernameController.cpython-311.pyc b/User_MicroService_Group3/app/controllers/__pycache__/fetchUsernameController.cpython-311.pyc
index 993fb4379d90d57d8dccc87743e0bec879754e00..4cbe6aa45038b2bd7bda92392953d3e3b023f3a3 100644
Binary files a/User_MicroService_Group3/app/controllers/__pycache__/fetchUsernameController.cpython-311.pyc and b/User_MicroService_Group3/app/controllers/__pycache__/fetchUsernameController.cpython-311.pyc differ
diff --git a/User_MicroService_Group3/app/controllers/__pycache__/showReviewsController.cpython-311.pyc b/User_MicroService_Group3/app/controllers/__pycache__/showReviewsController.cpython-311.pyc
index e94a298c93ec474867d52280eef3e0341f88aca2..d12a61ce3d85861ca4a71b737865e07616283d1c 100644
Binary files a/User_MicroService_Group3/app/controllers/__pycache__/showReviewsController.cpython-311.pyc and b/User_MicroService_Group3/app/controllers/__pycache__/showReviewsController.cpython-311.pyc differ
diff --git a/User_MicroService_Group3/app/controllers/fetchUsernameController.py b/User_MicroService_Group3/app/controllers/fetchUsernameController.py
index 311efa0a87efc3fd7c7979238b3604e9f264c537..00380458a388542e5aaa69a20561324d7f152a0c 100644
--- a/User_MicroService_Group3/app/controllers/fetchUsernameController.py
+++ b/User_MicroService_Group3/app/controllers/fetchUsernameController.py
@@ -3,6 +3,8 @@ from models.fetchUsername import get_username
 
 fetch_username_bp = Blueprint("getUsername",__name__)
 
+#This function is for the product microservice. It makes a call to this
+#endpoint to fetch a user's username when they want to add a product review
 @fetch_username_bp.route("/user/getUsername", methods=["POST"])
 def username():
 
diff --git a/User_MicroService_Group3/app/controllers/getUsersController.py b/User_MicroService_Group3/app/controllers/getUsersController.py
index 8c51a05fd07bac7ea438572fc488a4c090fcc713..e2a9bd4c09b48d0beb756dddd03e66562435a8ba 100644
--- a/User_MicroService_Group3/app/controllers/getUsersController.py
+++ b/User_MicroService_Group3/app/controllers/getUsersController.py
@@ -1,10 +1,11 @@
 from flask import Blueprint, jsonify, request, json, session, redirect
+from config import KAFKA_SERVER
 
 from models.getUsers import fetch_user_info
 
 from kafka import KafkaConsumer
 
-consumer = KafkaConsumer("review_events", bootstrap_servers='localhost:9092')
+consumer = KafkaConsumer("review_events", bootstrap_servers=KAFKA_SERVER)
 
 def getusers(user_id):
 
@@ -14,5 +15,5 @@ def getusers(user_id):
 for message in consumer:
 
     event_data = json.loads(message.value.decode())
-    user_id = event_data['user_id']
+    user_id = event_data["user_id"]
     username = getusers(user_id)
\ No newline at end of file
diff --git a/User_MicroService_Group3/app/controllers/showReviewsController.py b/User_MicroService_Group3/app/controllers/showReviewsController.py
index 8ac832b31c124ef029910d93bc78c41c98762850..924ede66f969d1ac4ce0e76b9d1f78e2de506249 100644
--- a/User_MicroService_Group3/app/controllers/showReviewsController.py
+++ b/User_MicroService_Group3/app/controllers/showReviewsController.py
@@ -1,17 +1,18 @@
 from flask import Blueprint, jsonify, request, session
 from kafka import KafkaConsumer
 import json
+from config import KAFKA_SERVER
 
 show_reviews_bp = Blueprint("showReviews", __name__)
 
 # Kafka consumer configuration
 consumer_conf = {
-    "bootstrap_servers": "localhost:9092",
+    "bootstrap_servers": KAFKA_SERVER,
     "group_id": "show_reviews_group",  # Specify a unique group ID for this consumer
     "auto_offset_reset": "earliest"    # Start consuming from the beginning of the topic
 }
 
-# Function to consume reviews from Kafka
+# Function to consume reviews published by product microservice
 def consume_reviews(num_reviews=1):
     consumer = KafkaConsumer("customer_reviews", **consumer_conf)
     reviews = []
diff --git a/User_MicroService_Group3/app/publishers/__pycache__/kafkaPublishers.cpython-311.pyc b/User_MicroService_Group3/app/publishers/__pycache__/kafkaPublishers.cpython-311.pyc
index 3847106fe73d1b4414eb89e2fd3d5401f6c225f7..f298ced069dad7e7a1242f27879c71831e59724d 100644
Binary files a/User_MicroService_Group3/app/publishers/__pycache__/kafkaPublishers.cpython-311.pyc and b/User_MicroService_Group3/app/publishers/__pycache__/kafkaPublishers.cpython-311.pyc differ
diff --git a/User_MicroService_Group3/app/publishers/kafkaPublishers.py b/User_MicroService_Group3/app/publishers/kafkaPublishers.py
index 042a5c13ed0c05097f8941b26627a5a542f2ab2d..7d41460ea71816937142c157fa6180cc964b4c25 100644
--- a/User_MicroService_Group3/app/publishers/kafkaPublishers.py
+++ b/User_MicroService_Group3/app/publishers/kafkaPublishers.py
@@ -1,15 +1,17 @@
 from kafka import KafkaProducer
 from kafka.admin import KafkaAdminClient, NewTopic
 
-import json
+from config import KAFKA_SERVER
 
-producer = KafkaProducer(bootstrap_servers="localhost:9092")
+import json
 
+producer = KafkaProducer(bootstrap_servers=KAFKA_SERVER)
 
 
+#Creates the topic
 def create_profile_updated_topic():
     # Create KafkaAdminClient instance
-    admin_client = KafkaAdminClient(bootstrap_servers="localhost:9092")
+    admin_client = KafkaAdminClient(bootstrap_servers=KAFKA_SERVER)
 
     # Define the topic name and configuration
     topic_name = "profile_updated_topic"
@@ -27,7 +29,8 @@ def create_profile_updated_topic():
         admin_client.create_topics(new_topics=[new_topic], validate_only=False)
 
 
-
+#Function is called in updateProfileControllers.py
+#Topic message is collected from ProductMicroservice/Subsribers/updateUsernameSubscriber.py
 def publish_username_updated_event(event_data):
     # Serialize the event data to JSON
     event_json = json.dumps(event_data)
diff --git a/User_MicroService_Group3/requirements.txt b/User_MicroService_Group3/requirements.txt
index 6da6fc6ef7722e29986acb00b7f1caba9b9e5545..aed8ace483f880061abeee73b97954403c1890b1 100644
--- a/User_MicroService_Group3/requirements.txt
+++ b/User_MicroService_Group3/requirements.txt
@@ -1,3 +1,14 @@
-Flask==3.0.0
+Flask==3.0.2
+Flask-Cors==4.0.0
 gunicorn==21.2.0
-boto3==1.29.0
\ No newline at end of file
+kafka-python==2.0.2
+pyodbc==5.1.0
+blinker==1.7.0
+click==8.1.7
+itsdangerous==2.1.2
+Jinja2==3.1.2
+Werkzeug==3.0.1
+boto3==1.34.71
+colorama==0.4.6
+MarkupSafe==2.1.3
+requests==2.31.0
\ No newline at end of file