Der Notification Service verwaltet Benachrichtigungen für Benutzer. Er unterstützt sowohl REST- als auch gRPC-Schnittstellen und integriert RabbitMQ als Message Broker zum Empfangen von Events. Eine PostgreSQL-Datenbank dient als Datenspeicher.
Die Architektur des Notification Service folgt den Prinzipien der Hexagonalen Architektur, auch bekannt als Ports und Adapters. Dieses Designmuster stellt eine klare Trennung der Verantwortlichkeiten sicher, wodurch das System wartbarer und anpassungsfähiger an Änderungen wird. Abhängigkeiten verlaufen dabei von außen nach innen.
Um den Notification Service auszuführen, sind folgende Tools erforderlich:
- Java 23 Temurin JDK
- Maven 3+
- Docker
- Docker Compose
-
Repository klonen
Klone das Repository in das gewünschte Verzeichnis und navigiere in den Ordner:git clone https://github.com/THI-CND/notification_service.git cd notification_service -
Projekt bauen
mvn clean install
-
Projekt starten
java -jar target/notification-service-<version>.jar
-
Repository klonen
Klone das Repository in das gewünschte Verzeichnis und navigiere in den Ordner:git clone https://github.com/THI-CND/notification_service.git cd notification_service -
Docker Compose starten
Stelle sicher, dass Docker installiert und betriebsbereit ist. Navigiere in den Projektordner und starte alle notwendigen Dienste mit dem Befehl:docker-compose up
Dies startet:
- PostgreSQL: Die Datenbank für den Notification Service.
- RabbitMQ: Für die Nachrichtenvermittlung und Ereignisverarbeitung.
- Notification Service: Der Hauptdienst.
-
Überprüfen des Service
Nach dem Start sind die APIs verfügbar unter:- REST API: Port 8080
- gRPC: Port 9090
Die folgenden Umgebungsvariablen werden zur Konfiguration des Dienstes verwendet:
SPRING_PROFILES_ACTIVE: Das Applikations-Profil.DB_USER: Der Datenbankbenutzer.DB_PASSWORD: Das Datenbankpasswort.DB_URL: Die URL inklusive Port der Datenbank.RABBITMQ_USER: Der RabbitMQ-Benutzer.RABBITMQ_PASSWORD: Das RabbitMQ-Passwort.RABBITMQ_HOST: Der RabbitMQ-Host.RABBITMQ_PORT: Der RabbitMQ-Port.RABBITMQ_EXCHANGE: Der RabbitMQ-Exchange.RABBITMQ_ROUTING_KEYS_COLLECTION: Routing-Keys für den Collection-Service.RABBITMQ_ROUTING_KEYS_REVIEW: Routing-Key für den Review-Service.RABBITMQ_ROUTING_KEYS_USER: Routing-Key für den User-Service.RABBITMQ_QUEUE_COLLECTION: Queue für den Collection-Service.RABBITMQ_QUEUE_REVIEW: Queue für den Review-Service.RABBITMQ_QUEUE_USER: Queue für den User-Service.GRPC_USER_SERVICE_HOST: gRPC Host des User-Service.GRPC_USER_SERVICE_PORT: gRPC Port des User-Service.
Standardmäßig wird das Profil development verwendet.
Das Profil beinhaltet das Leeren der Datenbank.
Das Profil production kann mit dieser Umgebungsvariable aktiviert werden:
SPRING_PROFILES_ACTIVE=productionZum Ausführen der Tests ist das Profil test aktiviert.
Es startet eine lokale H2-Datenbank die zum Standalone Test verwendet werden kann.
Ruft alle Benachrichtigungen für einen bestimmten Benutzer ab.
Request:
- Methode: GET
- URL:
/api/v1/notifications - Parameter:
username(String): Der Benutzername des Benutzers, dessen Benachrichtigungen abgerufen werden sollen.
Response:
- Status: 200 OK
- Body: Eine Liste von Benachrichtigungen.
Beispiel: GET "http://localhost:8080/api/v1/notifications?username=Bernd"
Ruft alle Benachrichtigungen mit einem bestimmten Status für einen bestimmten Benutzer ab.
Request:
- Methode: GET
- URL:
/api/v1/notifications/status/{status} - Parameter:
username(String): Der Benutzername des Benutzers, dessen Benachrichtigungen abgerufen werden sollen.status(Notification.NotificationStatus): Der Status der Benachrichtigungen (READ, UNREAD, DELETED).
Response:
- Status: 200 OK
- Body: Eine Liste von Benachrichtigungen.
Beispiel: GET "http://localhost:8080/api/v1/notifications/status/UNREAD?username=Bernd"
Ruft eine bestimmte Benachrichtigung ab.
Request:
- Methode: GET
- URL:
/api/v1/notifications/{id} - Parameter:
username(String): Der Benutzername des Benutzers, der die Benachrichtigung abruft.id(Long): Die ID der Benachrichtigung.
Response:
- Status: 200 OK
- Body: Die angeforderte Benachrichtigung.
Beispiel: GET "http://localhost:8080/api/v1/notifications/1?username=Bernd"
Aktualisiert den Status einer Benachrichtigung.
Request:
- Methode: PUT
- URL:
/api/v2/notifications/{id} - Parameter:
username(String): Der Benutzername des Benutzers, der die Benachrichtigung aktualisiert.id(Long): Die ID der Benachrichtigung.- Body:
{ "status": "READ | UNREAD | DELETED" }
Response:
- Status: 200 OK
- Body: Die aktualisierte Benachrichtigung.
Beispiel: PUT "http://localhost:8080/api/v2/notifications/1?username=Bernd"
{
"status": "READ"
}syntax = "proto3";
package com.notification_service.stubs;
option java_multiple_files = true;
option java_package = "com.notification_service.stubs";
option java_outer_classname = "NotificationServiceProto";
service NotificationService {
rpc GetAllNotifications (GetAllNotificationsRequest) returns (GetAllNotificationsResponse);
rpc GetNotificationById (GetNotificationByIdRequest) returns (NotificationResponse);
rpc UpdateNotificationStatus (UpdateNotificationStatusRequest) returns (NotificationResponse);
rpc GetNotificationsByStatus (GetNotificationsByStatusRequest) returns (GetAllNotificationsResponse);
}
enum NotificationStatus {
READ = 0;
UNREAD = 1;
DELETED = 2;
}
message GetAllNotificationsRequest {
string username = 1;
}
message GetAllNotificationsResponse {
repeated NotificationResponse notifications = 1;
}
message GetNotificationsByStatusRequest {
string username = 1;
NotificationStatus status = 2;
}
message GetNotificationByIdRequest {
string username = 1;
int64 id = 2;
}
message UpdateNotificationStatusRequest {
string username = 1;
int64 id = 2;
NotificationStatus status = 3;
}
message NotificationResponse {
int64 id = 1;
string username = 2;
string title = 3;
string message = 4;
NotificationStatus status = 5;
}Routing-Keys: collection.created, collection.updated, collection.deleted, review.created, users.count
Empfängt Nachrichten über erstellte, aktualisierte und gelöschte Sammlungen, erstellte Reviews und Benutzerzahlen und speichert die Benachrichtigung zusammen mit dem Benutzer in der Datenbank.
Listener:
Nachrichten, die mit einem akzeptierten Routing-Key über den passenden Exchange gesendet werden, werden über verschiedene Queues empfangen und individuell über DTOs verarbeitet, den Nutzern zugeordnet und als Benachrichtigungen persistiert.
Parameter:
- individuelle messageDtos, welche die JSON-Bodys der empfangenen Events verarbeiten
- Routing-Key
Beispiel:
@RabbitListener(queues = "collection.queue")
public void handleCollectionMessages(@Payload CollectionDto messageDto, @Header(AmqpHeaders.RECEIVED_ROUTING_KEY) String routingKey)
{
// Verarbeitung der empfangenen Nachricht
}Zur Speicherung der Benachrichtigungen wird folgendes Modell verwendet:
| Spalte | Typ | Beschreibung |
|---|---|---|
| id | Long | Auto-incrementing ID |
| username | String | Name des Benutzers |
| title | String | Titel der Benachrichtigung |
| message | String | Inhalt der Benachrichtigung |
| status | Enum (String) | Status der Benachrichtigung (READ, UNREAD, DELETED) |
