Ich habe in letzter Zeit viel über SOA, ESB usw. geforscht.
Ich arbeite gerade daran, einige Legacy-Systeme neu zu entwickeln und möchte sie mit mehr SOA-Architektur als bisher erstellen. Wir nutzen diese Dienste auf etwa 5 unserer Websites und eines der größten Probleme, die wir derzeit mit unserem Altsystem haben, ist, dass wir fast immer, wenn wir Fehlerbehebungen oder Updates durchführen, unsere 5 Websites, die ein ziemlich zeitraubender Prozess.
Mein Ziel ist es, die Schnittstellen zwischen den Diensten lose miteinander zu verbinden, so dass Änderungen vorgenommen werden können, ohne dass alle abhängigen Dienste und Websites erneut bereitgestellt werden müssen.
Ich brauche die Möglichkeit, eine bereits vorhandene Service-Schnittstelle zu erweitern, ohne die Abhängigkeiten zu unterbrechen oder zu aktualisieren. Sind Sie schon einmal auf dieses Problem gestoßen? Wie hast du es gelöst?
Ich schlage vor, eine andere Art von Diensten zu betrachten, als Sie es bisher getan haben. Berücksichtigen Sie Dienste, die über Ereignisse und nicht über Anforderungen / Antworten miteinander zusammenarbeiten. Ich verwende diesen Ansatz seit vielen Jahren mit Kunden in verschiedenen Branchen und mit großem Erfolg. Ich habe in den letzten 4 Jahren einiges über diese Themen geschrieben. Hier ist ein Platz, an dem du anfangen kannst:
Ich hoffe, das hilft.
Es gibt ein paar Ansätze, die Sie ergreifen können. Unsere SOA-Architektur beinhaltet XML-Nachrichten, die zu und von den Diensten gesendet werden. Eine Möglichkeit, das zu erreichen, was Sie beschreiben, besteht darin, die Verwendung einer Datenbindungsbibliothek für unser XML-Schema zu vermeiden und einen generischen XML-Parser zu verwenden, um nur die Datenknoten zu erhalten, die Sie nicht interessieren. So kann der Service hinzufügen zusätzliche neue Knoten zu der Nachricht, ohne jemanden zu zerbrechen, der sie gerade benutzt. Wir tun dies normalerweise nur, wenn wir nur ein oder zwei Informationen aus einer größeren Schemastruktur benötigen.
Alternativ ist die andere (bevorzugte) Lösung, die wir verwenden, die Versionierung. Eine Version eines Dienstes hält sich an ein bestimmtes Schema / eine bestimmte Schnittstelle. Wenn sich das Schema ändert (z. B. wenn die Schnittstelle erweitert oder geändert wird), erstellen wir eine neue Version des Service. Zu jeder Zeit können wir 2 oder 3 Versionen auf einmal haben. Mit der Zeit werden ältere Versionen veraltet und dann entfernt, während eventuell abhängiger Code auf neuere Versionen migriert wird. Auf diese Weise können die vom Dienst abhängigen Benutzer die vorhandene Version des Dienstes weiterhin verwenden, während bestimmte Abhängigkeiten auf die neue Version "upgraden" können. Welche Versionen eines Dienstes aufgerufen werden, wird in einer Konfigurationsdatei für den abhängigen Code definiert. Beachten Sie, dass nicht nur das Schema versioniert wird, sondern auch der zugrunde liegende Implementierungscode.
Hoffe, das hilft.
Was Sie fragen, ist kein einfaches Thema. Es gibt viele Möglichkeiten, wie Sie Ihre serviceorientierte Architektur losgelöst verbinden können.
Ich schlage vor, Thomas Erls SOA-Buchserie anzuschauen. Es erklärt alles sehr klar und detailliert.
Es gibt einige gängige Praktiken, um eine lose Kopplung für Dienstleistungen zu erreichen.
Verwenden Sie den doc / literal-Stil von Webdiensten, denken Sie in Daten (dem Drahtformat) anstelle von RPC, vermeiden Sie die schemabasierte Datenbindung.
Halten Sie sich bei der Datenübermittlung strikt an den Vertrag, aber behalten Sie einige Annahmen bei der Verarbeitung eingehender Daten bei. xpath ist dafür ein gutes Werkzeug (loosen Sie herein, stramm)
Verwenden Sie ESB und vermeiden Sie direkte Punkt-zu-Punkt-Kommunikation zwischen Diensten.
Hier ist eine grobe Prüfliste für die Bewertung, ob Ihre SOA Loose Coupling implementiert:
Position des angerufenen Systems (seine physikalische Adresse): Ist Ihre Anwendung verwenden direkte URLs für den Zugriff auf Systeme oder ist die Anwendung entkoppelt über eine Abstraktionsschicht, die verantwortlich ist für die Aufrechterhaltung der Verbindungen zwischen Systemen? Die Dienst-Registry und das in SAP NetWeaver CE verwendete Paradigma der Servicegruppe ist gut Beispiele dafür, wie eine solche Abstraktion aussehen könnte. Mit einem Enterprise Service Bus (ESB) ist ein weiteres Beispiel. Der Punkt ist, dass Die Anwendung sollte nicht die physikalische Adresse der genanntes System, um wirklich als lose gekoppelt zu gelten.
Anzahl der Empfänger: Gibt die Anwendung an, um welche Systeme es sich handelt? die Empfänger eines Serviceanrufs? Ein locker gekoppeltes Komposit wird nicht Spezifische Systeme spezifizieren, aber die Lieferung von seinem belassen Nachrichten an eine Servicevertrags-Implementierungsebene. Ein fest Die gekoppelte Anwendung ruft explizit die empfangenden Systeme auf Auftrag; eine lose gekoppelte Anwendung ruft einfach zum Serviceschnittstelle und ermöglicht die Implementierung des Servicevertrags Schicht, um sich um die Details der Zustellung von Nachrichten nach rechts zu kümmern Systeme.
Verfügbarkeit von Systemen: Benötigt Ihre Anwendung all das? Systeme, die Sie verbinden, um die ganze Zeit in Betrieb zu sein? Offensichtlich ist dies eine sehr schwierige Anforderung, besonders wenn Sie es sind möchte eine Verbindung zu externen Systemen herstellen, die nicht unter Ihrer Kontrolle stehen. Wenn die Antwort lautet, dass alle Systeme die ganze Zeit laufen müssen, die Anwendung ist in dieser Hinsicht eng gekoppelt.
Datenformat: Verwendet die Anwendung die von die Backend-Systeme oder verwenden Sie ein kanonisches Datentypsystem das ist unabhängig von den typen systeme in der aufgerufenen verwendet Anwendungen? Wenn Sie die Datentypen des Backends erneut verwenden Systeme haben Sie wahrscheinlich Schwierigkeiten mit Datentypkonvertierungen in Ihre Anwendung, und dies ist kein sehr lose gekoppelten Ansatz.
Antwortzeit: Muss die Anwendung von angerufenen Systemen antworten? innerhalb eines bestimmten Zeitraums oder ist es für die Anwendung akzeptabel erhalten Sie eine Antwort Minuten, Stunden oder sogar Tage später?
Tags und Links c# soa esb loose-coupling