2016-07-04 10 views
3

Ich habe eine Suite, an der ich arbeite, die ein paar Mikro-Dienste zusammen arbeitet. Ich verwende Docker, um die Umgebung einzurichten und es funktioniert großartig.Sharing-Code zwischen Microservices

Meine Projektkomponenten sind wie folgt:

  • MongoDB
  • Node.js Arbeiter, die einige Verarbeitung auf der
  • DB tut
  • Node.js REST-API, die den Benutzer
dient

Wie Sie wahrscheinlich vermuten können, sollen die 2 Node.js Server mit der gleichen DB arbeiten. Jetzt habe ich meine Modelle in einem der Projekte definiert, aber ich frage mich, was ist die beste Praxis, wenn es um die zweite geht. Ich würde wirklich gerne vermeiden, kopieren meinen Code einfügen, weil das bedeutet, dass ich beide auf dem Laufenden halten muss, wenn ich Änderungen an dem Schema mache. gibt es eine gute Möglichkeit, den Code zwischen ihnen zu teilen?

mein Projekt sieht wie folgt aus:

rest-api // My first Node.js application 
    models 
     MyFirstModel.js // This is identical to the one in the worker/models folder 
     MySecondModel.js 
    index.js 
    package.json 
    Dockerfile 
worker // My second Node.js application 
    models 
     MyFirstModel.js 
     MySecondModel.js 
    index.js 
    package.json 
    Dockerfile 
docker-compose.yml 

Jede Eingabe wird hilfreich sein.

Danke.

+0

Warum haben Sie zwei getrennte Anwendungen? Und warum sind die Modelle identisch? – tomliversidge

+0

wie ich erklärt habe. 2 Micro Services arbeiten mit der gleichen Datenbank – dcohenb

+0

Ich meinte, warum haben Sie zwei Microservices, die ein Datenmodell teilen? Warum ist es nicht nur eins? Es fühlt sich an wie ein Modellierungsproblem eher als ein technisches – tomliversidge

Antwort

1

Natürlich können Sie. Sie müssen Ihre gemeinsamen Dateien in einem Volume ablegen und dieses Volume für beide Knotencontainer freigeben.

Sie sollten ein Datenvolume einrichten, in das Sie alle Dateien einfügen, die Sie teilen möchten. Mehr dazu here oder irgendwo anders googeln. Prost.

+0

Oh wow, geteiltes Volumen Ich habe nicht darüber nachgedacht .. – dcohenb

+0

ok, also habe ich es ausprobiert und es funktioniert, aber es kompliziert die Sache noch weiter, weil ich ein anderes zu unterhalten brauche der Code mit es ist auf package.json für diese gemeinsamen Modelle .. Ich hoffe auf eine sauberere Lösung .. – dcohenb

+0

Sie müssen nur die Dateien angeben, die Sie für dieses Datenvolumen freigeben möchten. Also ich verstehe nicht, was dein Problem ist. Könnten Sie mir bitte mehr Details geben? ;-) – Fares

1

Die allgemeine Meinung ist die folgende: zwei Microservices sollten nicht dasselbe Datenmodell teilen. Es gibt mehrere Artikel darüber und einige Fragen zu diesem Thema.

How to deal with shared models in micro service architectures

Aber ich denke, es gibt einige Fälle, wenn Sie es und akzeptabel müssen. Vertrauen ist ein Luxus, auch wenn alles intern ist, daher müssen Sicherheit und Konformität berücksichtigt werden. Jedes eingehende Objekt muss normalisiert, validiert und überprüft werden, bevor ein Prozess damit eingeleitet wird. Die beiden Dienste sollten die Daten auf die gleiche Weise behandeln.

Meine Lösung, die ich für eine API und eine Admin-Dienste verwendet, die die Modelle freigegeben: Ich erstellte 3 Repositories, eine für die API und eine für den Admin und eine dritte für das Modellverzeichnis. Modelle sollten in beiden Repositories vorhanden sein und ich habe sie als ein Git-Submodul hinzugefügt. Wenn Sie etwas an einem Schema ändern, sollten Sie es separat festschreiben, aber ich denke, es ist die beste Lösung, um die Änderungen zu verwalten, ohne den Code zu duplizieren.

+0

Der richtige Weg, dies zu tun, ist die Erstellung eines dritten Mikro-Dienstes, der als Gateway zur Datenbank fungiert. es wird CRUD-Anfragen erhalten, um in der Datenbank zu arbeiten und kümmert sich um das Validierungs-Caching etc. – dcohenb

Verwandte Themen