593 lines
30 KiB
TeX
593 lines
30 KiB
TeX
\part{Service-Oriented Architecture (SOA)}
|
|
\section{SOA}
|
|
\section{Auf welche drei technischen Konzepte basiert SOA?}
|
|
\begin{itemize}
|
|
\item Services: unabhängige Business-Funktionalität
|
|
\item Enterprise service bus (ESB): Infrastruktur, zwischen verteilten Service-Systemen
|
|
\begin{itemize}
|
|
\item erledigt Datenkonvertierung und Verteilung
|
|
\item wird meist durch große, kommerzielle Sofwarepakete realisiert
|
|
\end{itemize}
|
|
\item Lose Kopplung: reduziert Systemabhängikeiten.
|
|
\begin{itemize}
|
|
\item einzelne Services sollen auch dann arbeiten, wenn andere nicht verfügbar oder langsam sind
|
|
\end{itemize}
|
|
\end{itemize}
|
|
\section{Beschreibe die Eigenschaften von großen Verteilten Systemen}
|
|
\begin{itemize}
|
|
\item Heterogen -> unterschiedliche
|
|
\begin{itemize}
|
|
\item Plattformen
|
|
\item Programmiersprachen
|
|
\end{itemize}
|
|
\item Komplex
|
|
\item Nicht perfekt (wäre zu teuer)
|
|
\item Redundant (alle Redundanz zu eliminieren verlangsamt das System)
|
|
\end{itemize}
|
|
\section{Beschreibe den Begriff Business View im Kontext von SOA}
|
|
\begin{itemize}
|
|
\item Geschäftsprozessmodellierung wird verwendet um alle Aspekte eines GP grafisch zu beschreiben
|
|
\item Standards zur Modellierung, damit Experten daraus GP entwerfen können:
|
|
\begin{itemize}
|
|
\item Business Process Execution Language (BPEL) im XML Format
|
|
\item Unified Modeling Language (UML)
|
|
\end{itemize}
|
|
\item Process View entspricht Top-Down-Ansatz der Systemmodellierung (Prozess auf kleinere herunter brechen)
|
|
\end{itemize}
|
|
\section{Beschreibe den Begriff Service View auf ein Software-System im Kontext von SOA}
|
|
\begin{itemize}
|
|
\item entspricht Bottom-Up-Ansatz der Systemmodellierung (Services in größere Einheiten zusammenfassen bis GP vollständig)
|
|
\item Schnittstellen-Definition ist Kern der Service-orientierten Architektur
|
|
\item Schnittstellen-Beschreibung:
|
|
\begin{itemize}
|
|
\item syntaktisch durch Signatur (Input, Output, Exception)
|
|
\item semantisch
|
|
\end{itemize}
|
|
\item Vertrag: ist vollständige Spezifizierung eines Services zwischen Consumer und Provider
|
|
\end{itemize}
|
|
\section{Beschreibe drei unterschiedliche Service Kategorien}
|
|
\subsection{Basic Services}
|
|
\begin{itemize}
|
|
\item grundlegende, an vielen Stellen gebrauchte Business-Funktionalität
|
|
\item meist kurze Laufzeit
|
|
\item stateless
|
|
\end{itemize}
|
|
\subsection{Composed Services}
|
|
\begin{itemize}
|
|
\item aus Basic Services zusammengesetzt („Orchestration“)
|
|
\item auf höherer Ebene als Basic Services angesiedelt
|
|
\item stateless
|
|
\item kurze Laufzeit
|
|
\item oft Adapter Services um anderen Services eine Schnittstelle zu bieten
|
|
\end{itemize}
|
|
\subsection{Process Services}
|
|
\begin{itemize}
|
|
\item Längerfristige Prozesse, die Geschäftsprozesse umsetzen
|
|
\item Interagieren mit Benutzer oder anderen Systemen
|
|
\item BPEL ermöglicht \textbf{laufenden} Process Services nicht, Benutzerinteraktion auszulösen (beeinflusst Design)
|
|
\item statefull (z.B. wie weit ist Benutzer im Prozess)
|
|
\end{itemize}
|
|
|
|
\section{Erkläre die beiden Ansätze für SOA System-Design inkl. Skizze}
|
|
\begin{itemize}
|
|
\item Kommunikation zwischen Komponenten funktioniert über Schnittstellen
|
|
\item Schnittstellen sind public und published, deshalb schwer änderbar
|
|
\item wird eine neue Version veröffentlicht werden Vorversionen meist noch angeboten
|
|
\end{itemize}
|
|
\begin{figure}[!htp]
|
|
\centering
|
|
\includegraphics[width=0.5\textwidth]{pics/topDown-bottomUp.jpg}
|
|
\end{figure}
|
|
\subsection{Top Down}
|
|
|
|
\begin{itemize}
|
|
\item Prozess auf kleiner Prozesse herunterbrechen, bis Ebene von Basic Services erreicht ist
|
|
\end{itemize}
|
|
\subsection{Bottom Up}
|
|
\begin{itemize}
|
|
\item Services in größere Einheiten zusammenfassen, bis Geschäftsprozess vollständig abgebildet
|
|
\end{itemize}
|
|
\section{Beschreibe das Konzept des Enterprise Service Bus inkl. Skizze}
|
|
|
|
\begin{itemize}
|
|
\item ist Kommunikationsmedium zwischen einzelnen Services
|
|
\item Hauptaufgaben sind:
|
|
\begin{itemize}
|
|
\item Datentransformation (Umwandlung von Datenpaketen und Feldern dieser)
|
|
\item Routing
|
|
\begin{itemize}
|
|
\item Services finden
|
|
\item Daten zwischen Services vermitteln
|
|
\item Loadbalancing zwischen Serviceanbietern
|
|
\end{itemize}
|
|
\item Protokolle und Middleware kann Heterogen sein
|
|
\item ESB: REST, CORBA, SOAP
|
|
\item REST verwendet http für Transport
|
|
\end{itemize}
|
|
\end{itemize}
|
|
|
|
\begin{figure}[!htp]
|
|
\centering
|
|
\includegraphics[width=0.3\textwidth]{pics/esb_1.jpg}
|
|
\includegraphics[width=0.3\textwidth]{pics/esb_2.jpg}
|
|
\includegraphics[width=0.3\textwidth]{pics/esb_3.jpg}
|
|
\end{figure}
|
|
\section{Beschreibe den Unterschied zwischen P2P Verbindungen und dem Konzept ESB als Mediator}
|
|
|
|
\begin{itemize}
|
|
\item Unterschied: Kopplung der Consumer an physikalische Verbindung (P2P enger)
|
|
\end{itemize}
|
|
\subsection{Point-to-Point}
|
|
\begin{itemize}
|
|
\item Consumer muss Endpunkt kennen da Empfänger bestimmt sein muss
|
|
\item ist Verbindung nicht möglich, schlägt Aufruf fehl
|
|
\end{itemize}
|
|
\subsection{ESB als Mediator}
|
|
\begin{itemize}
|
|
\item Ziel-Service wird vom Consumer mittels Tag angegeben
|
|
\item ESB kümmert sich um die Zustellung -> Vorteil: dynamische Änderungen möglich
|
|
\end{itemize}
|
|
\section{Beschreibe das Konzept der loosen Kopplung und die beiden wichtigsten damit verbundenen Themen}
|
|
\subsection{Konzept}
|
|
\begin{itemize}
|
|
\item bezeichnet einen geringen Grad der Abhängigkeit zwischen Hard- oder Software-Komponenten
|
|
\item ermöglicht
|
|
\begin{multicols}{3}
|
|
\begin{itemize}
|
|
\item Skalierbarkeit
|
|
\item Flexibilität
|
|
\item Fehlertoleranz
|
|
\end{itemize}
|
|
\end{multicols}
|
|
\end{itemize}
|
|
\subsection{damit verbundene Konzepte}
|
|
\begin{itemize}
|
|
\item Asynchrone Kommunikation
|
|
\begin{itemize}
|
|
\item Sender und Empfänger sind nicht synchronisiert
|
|
\item nach dem Versand kann sofort andere Arbeit ausgeführt werden
|
|
\item trifft Antwort ein wird diese ursprünglichem Request zugeordnet
|
|
\end{itemize}
|
|
\item Heterogene Datentypen
|
|
\begin{itemize}
|
|
\item da Daten in großen Systemen unterschiedlich sind, werden Mappings benötigt
|
|
\item Mappings gehen auf technische und semantische Aspekte ein
|
|
\end{itemize}
|
|
\end{itemize}
|
|
\section{Microservice Architekturen}
|
|
|
|
\section{Beschreibe die wesentlichsten Unterschiede zwischen einer monolithischen Anwendung und dem Mikroservices Ansatz}
|
|
\subsection{Monolithisch}
|
|
\begin{itemize}
|
|
\item Enterprise Applications bestehen oft aus drei Teilen
|
|
\begin{itemize}
|
|
\item Client-seitigem User Interface
|
|
\item Server-seitiger monolithischer Applikation
|
|
\item Datenbank
|
|
\end{itemize}
|
|
\item da die Applikation \textbf{eine} Einheit ist, muss sie bei Änderungen neu gebuilded und deployed werden
|
|
\end{itemize}
|
|
\subsection{Microservices}
|
|
\begin{itemize}
|
|
\item sind gut skalierbar
|
|
\item Applikation besteht aus vielen kleinen Services
|
|
\item jedes Service läuft in eigenem Prozess und deckt einzelne Funktionalität vollständig ab
|
|
\item für die Interservicekommunikation werden leichtgewichtige Kommunikationswege verwendet (z.B.: HTTP - kein ESB mehr nötig)
|
|
\item Services können unabhängig voneinander deployed werden
|
|
\end{itemize}
|
|
|
|
\section{Vergleiche die Unterschiedlichen Skalierungstrategien von monolitischen Applikationen und Mikroservices}
|
|
\subsection{Monolithisch}
|
|
\begin{itemize}
|
|
\item gesamte Applikation muss skaliert werden
|
|
\item erfolgt durch mehrerer Instanzen (horizontale Skalierung) bzw. Load Balancing
|
|
\item Nachteil: alles und nicht nur benötigtes wird dupliziert -> Ressourcenbelastung
|
|
\end{itemize}
|
|
\subsection{Microservices}
|
|
\begin{itemize}
|
|
\item Service-Grenzen sind funktional orientiert
|
|
\item es können speziell benötigte Services öfter instanziert werden
|
|
\item Nachteil: Interprozesskommunikation nimmt aufgrund der Verteilung auf viele kleine Servicekomponenten zu
|
|
\end{itemize}
|
|
|
|
\section{Erkläre den Unterschied zwischen Libraries und Services}
|
|
\subsection{Library}
|
|
\begin{itemize}
|
|
\item Komponenten, die in eine Applikation verlinkt werden und lokal (im selben Prozess) verwendet werden
|
|
\end{itemize}
|
|
\subsection{Services}
|
|
\begin{itemize}
|
|
\item besitzen immer eine Remote Schnittstelle
|
|
\item befinden sich in eigenem Prozess (stärker entkoppelt)
|
|
\item Aufruf über Web Services oder Remote Procedure Calls
|
|
\item Konsequenzen:
|
|
\begin{itemize}
|
|
\item getrennt auslieferbar
|
|
\item Explizite Schnittstelle
|
|
\item Services sind published -> schwer änderbar
|
|
\end{itemize}
|
|
\end{itemize}
|
|
|
|
\section{Beschreibe die Beziehung zwischen einer Team Struktur und dem Design einer Software}
|
|
\subsection{Silo-Ansatz}
|
|
\begin{itemize}
|
|
\item Zuständigkeiten bei großen Applikationen werden oft an technologische Grenzen angepasst
|
|
\item so entstehen Teams für UI, Server-Side oder Datenbank Teams
|
|
\item kleine Änderungen führen so bereits zu hohen Kosten da Team übergreifend gearbeitet werden muss
|
|
\end{itemize}
|
|
\subsection{Cross-Functional Ansatz}
|
|
\begin{itemize}
|
|
\item bei Microservices wird ähnlich wie bei Scrum ein cross-functional Ansatz verfolgt
|
|
\item ein Team ist somit für das gesamte Service, welches nur eine gesamte Funktionalität abdeckt, verantwortlich
|
|
\end{itemize}
|
|
|
|
\section{Erkläre das Konzept "smart endpoints and dump pipes"}
|
|
\begin{itemize}
|
|
\item wird anstatt eines ESB, welcher oft smarte Mechanismen für Routing und Transforming anbietet, verwendet
|
|
\item Smart Endpoints sind z.B. RabbitMQ oder REST
|
|
\item diese verwenden einfache Protokolle wie z.B. HTTP zur Übertragung
|
|
\item Microservices agieren wie Filter bei Unix und wenden ihre Logik auf Anfragen an bevor die Antwort erzeugt wird
|
|
\end{itemize}
|
|
|
|
\section{Was sind die Herausforderungen von dezentralisiertem Datenmanagement?}
|
|
\begin{itemize}
|
|
\item Monolitische Applikationen bevorzugen eine Datenbank für alle Daten des Systems
|
|
\item dies Ansatz wird oft auch von Unternehmen bevorzugt
|
|
\item Microservices verwenden hingegen den "Polyglot Persistence" Ansatz -> für einzelne Services jeweils eine eigene Datenbank
|
|
\item Konsequenz: transaktionslose Koordination zwischen Services
|
|
\item Herausforderung: Aufsplittung der Datenbank beim Wechsel von Monolith zu Microservice Ansatz
|
|
\end{itemize}
|
|
|
|
\section{Beschreibe die wichtigsten Design-Überlegungen im Zusammenhang mit Mircroservices ("Design for Failure", "Evulutionary Design")}
|
|
\subsection{Design for failure}
|
|
\begin{itemize}
|
|
\item bei Microservices nimmt Fehlerpotential durch Interprozesskommunikation massiv zu
|
|
\item jeder Aufruf kann bei Nichtverfügbarkeit des Services fehlschlagen
|
|
\item Software muss daher Fehlertolerant konzipiert sein
|
|
\item es gibt diverse Monitoring-Tools um Fehler und Probleme zur Laufzeit zu erkennen
|
|
\end{itemize}
|
|
\subsection{Evolutionary Design}
|
|
\begin{itemize}
|
|
\item das Setzen der Grenzen der Micro-Service Komponenten nach einer Aufteilung ist herausfordernd
|
|
\item Änderungen sollen nach Aufteilung nur das entsprechende Modul betreffen
|
|
\item Module sollen unabhängig voneinander geändert werden können
|
|
\item Evolutionary Design
|
|
\begin{itemize}
|
|
\item Beginne mit Monolith und trenne erst auf Microservices wenn dieser zum Problem wird
|
|
\item kommt hauptsächlich im Kontext mit Extreme-Programming zum Einsatz
|
|
\item Weiterentwicklung des Designs erfolgt durch \textbf{Refactoring}
|
|
\item ist das Gegenteil von geplantem Design, da Designelemente erst wenn notwendig eingebaut werden
|
|
\item Design for the future wird vermieden
|
|
\end{itemize}
|
|
\end{itemize}
|
|
\section{Von Objekten zum Service}
|
|
\section{Beschreibe die Nachteile von klassischen verteilten Objektarchitekturen}
|
|
\begin{itemize}
|
|
\item Die Kommunikation von verteilten Objekte erfolgt oft über \textbf{nicht standardisierte} TCP-Ports verschiedenster Middleware-Libraries (z.B. CORBA, DCOM, RMI) - oft durch die meisten Firewalls standardm. blockiert,
|
|
\item größere Serverauslastung durch viele Anfragen vom Client, da Objektstatus darüber ausgetauscht wird,
|
|
\item Load-Balancing schwieriger zu implementieren und zu verwalten,
|
|
\item Reservierter Speicher durch den Client muss vom Server automatisch wieder freigegeben werden (z.B. bei Ausfall des Clients)
|
|
\end{itemize}
|
|
\section{Erkläre die unterschiedlichen Formen der Kopplung}
|
|
Kopplung beschreibt den Grat der Abhängigkeiten eines Moduls von einem anderen Modul (z.B. Client vom Server). Dabei gibt es verschiedene Formen::
|
|
\begin{itemize}
|
|
\item Functional Coupling:
|
|
\begin{itemize}
|
|
\item Clients hängen von der in Web-Services implementierten Logik ab - bei Fehlern oder Inkonsistenzen sind sie betroffen,
|
|
\end{itemize}
|
|
\item Data Structure Coupling:
|
|
\begin{itemize}
|
|
\item Clients müssen die Datenstrukturen eines Services verstehen (in Bezug auf z.B. Datentypen oder Character-Encodings der ausgetauschten Nachrichten)
|
|
\end{itemize}
|
|
\item Temporal Coupling:
|
|
\begin{itemize}
|
|
\item hoch, wenn Request sofort nach dem Empfang verarbeitet werden muss (Request/Response pattern),
|
|
\item kann gesenkt werden, wenn die Zeit, wann request verarbeitet werden muss, ausgedehnt oder verschoben wird (Request/Acknowledge pattern)
|
|
\end{itemize}
|
|
\item URL coupling
|
|
\begin{itemize}
|
|
\item Clients sind oft stark an Service-URLs gebunden, da oft statisch oder nach einem einfachen Schema definiert.
|
|
\end{itemize}
|
|
\item Durch Vermeidung der Kopplung auf Computing-Plattformen können die Nachteile von Software-Wiederverwendung verringert werden.
|
|
\end{itemize}
|
|
\section{Web Service API Styles}
|
|
\subsection{Beschreibe aktuelle Designüberlegungen für Web Service APIs}
|
|
\begin{itemize}
|
|
\item Kapselung:
|
|
\begin{itemize}
|
|
\item Services sollten Implementierungsdetails verstecken,
|
|
\item Client sollte über Domain-Model, Datenbanktabllen oder Stored-Procedure-Designs nicht Bescheid wissen,
|
|
\item Service-APIs sollten "top-down" desgined werden (API wird an Anforderungen seitens Client-Applikationen angepasst)
|
|
\end{itemize}
|
|
\item Service-Contract:
|
|
\begin{itemize}
|
|
\item Spezifiziert die Art der Interaktionen zwischen Services und Clients,
|
|
\item z.B. welche Bedingung vor Aufruf wahr sein muss (\textbf{pre-condition}),
|
|
\item oder die Ereignisse nach Ausführung des Services (\textbf{post-condition}),
|
|
\item die meisten Contracts können nur die Basisinformationen eines Services abbilden (z.B. bei WSDL Web-Service-Description-Language die syntaktische Spezifikation).
|
|
\end{itemize}
|
|
\item Autonomie/Unabhängigkeit:
|
|
\begin{itemize}
|
|
\item Services sollten eigene Ausführung kontrollieren und nur wenige Abhängigkeiten nach außen aufweisen,
|
|
\item Web-Services sollten verteilte Transaktionen \textbf{verhindern}
|
|
\item Web-Services können Kompensierung durch die Bereitstellung von gegenteiligen Service-Paaren (logische Funktion genau invers),
|
|
\item Daten in verteilten Systemen können nicht vollständig synchron sein
|
|
\end{itemize}
|
|
\item Latenz:
|
|
\begin{itemize}
|
|
\item Zeit eines Clients für die Beantwortung von Anfragen an Web-Services signifikant höher als ähnlicher Aufruf innerhalb desselben Prozesses,
|
|
\item Web-Services sollten daher APIs erstellen, welche die Anzahl der netzwerkbelastenden Aktionen gering hält
|
|
\end{itemize}
|
|
\item Partial failures:
|
|
\begin{itemize}
|
|
\item Clients müssen auf die Fehlfunktion von Services vorbereitet werden,
|
|
\item Situationen, in denen der Netzwerkverkehr abbricht oder ausgelastet ist, müssen stets berücksichtigt werden
|
|
\end{itemize}
|
|
\item Message Encoding:
|
|
\begin{itemize}
|
|
\item Web-Services verwenden textbasierte Nachrichten,
|
|
\item manchmal sind sie jedoch in Binärform umgewandelt zur Verminderung von payload und damit Senkung der benöt. Netzwerkbandbreite
|
|
\end{itemize}
|
|
\end{itemize}
|
|
\subsection{RPC API}
|
|
\subsection{Erkläre die Funktionalität inkl. Skizze}
|
|
\begin{itemize}
|
|
\item Client sendet Nachricht zu Remote-Server und blockiert, während er auf die Response wartet,
|
|
\item Die Nachricht in der Anfrage identifiziert den auszuführenden Prozess und beinhaltet Parameter, welche direkt den Parametern der Remote-Prozedur entsprechen,
|
|
\item Sobald der Service ausgeführt wurde, wird die Anfrage des Clients bearbeitet und eine Antwort wird zurückgeschickt,
|
|
\item Client kann anschließend die Ergebnisse extrahieren und die Ausführung fortsetzen.
|
|
\item Mittels WSDL kann die Bearbeitbarkeit durch den Entwickler durch automatische Codegenerierung vereinfacht werden - Defin. mittels XSD oder WSDL
|
|
\end{itemize}
|
|
\begin{figure}[!htp]
|
|
\centering
|
|
\includegraphics[width=0.5\textwidth]{pics/rpc_api.jpg}
|
|
\end{figure}
|
|
\begin{itemize}
|
|
\item Message-API
|
|
\end{itemize}
|
|
\subsection{Beschreibe die Konsequenzen der Nutzung}
|
|
\begin{itemize}
|
|
\item Die Wahrscheinlichkeit, dass Entwickler Signaturen erstellen wie bei normalen Klassenmethoden (z.B. mit langen Parameterlisten) ist hoch - dadurch Einschränkungen in Flexibilität und Erhöhung der Instabilität
|
|
\item Proxys werden meist mittels clientseitiger Codegeneratoren (z.B. basierend auf WSDL) generiert - der Proxy muss somit bei jeder Änderung der WSDL-Beschreibung mitgeändert werden,
|
|
\item Durch die Client-Proxys wird es schwierig, festzustellen, wann Remote-Prozeduren aufgerufen werden sollen - daher meiden Entwickler oft die notwendige Implementierung von Exception-Handling im Netzwerkbereich (Verbindungsverlust, Servercrash und belegte Dienste)
|
|
\end{itemize}
|
|
\subsection{Message API}
|
|
\subsection{Erkläre die Funktionalität inkl. Skizze}
|
|
\begin{itemize}
|
|
\item Dienste, die Message-APIs verwenden, empfangen ein oder mehrere selbstbeschreibende Nachrichtentypen mithilfe einer gegebenen URL
|
|
\item Aufruf einer Message-API oft durch Standardformate wie SOAP oder XML
|
|
\item Client sendet Nachricht an eine bestimmte URL und ist blockiert, während er auf die Antwort wartet
|
|
\item Wenn Nachricht bei Server ankommt, wird sie deseralisiert und inspiziert und an den zuständigen Handler weitergeleitet,
|
|
\item Sobald der Handler aufgerufen wurde, ist er in der Lage, den Request des Clients verarbeiten und eine Response zurücksenden,
|
|
\item Nachrichten werden meist über XML Schema-Definitionen definiert,
|
|
\item Die API stellt meist einen empfangenden Endpunkt zur Verfügung, während der Web-Service als Versender agiert,
|
|
\item Clients versenden meist einen der drei Message-Typen:
|
|
\begin{itemize}
|
|
\item Command-Message,
|
|
\item Event-Message,
|
|
\item Document-Message
|
|
\end{itemize}
|
|
\item Message-APIs stellen Ergebnisse oft auch über Messages zur Verfügung.
|
|
\end{itemize}
|
|
\begin{figure}[!htp]
|
|
\centering
|
|
\includegraphics[width=0.5\textwidth]{pics/message_api.jpg}
|
|
\end{figure}
|
|
\subsection{Beschreibe die Konsequenzen der Nutzung}
|
|
\begin{itemize}
|
|
\item Message-APIs setzen zur Unterstützung clientseitiger Code-Generierung oft Service-Descriptors, wie z.B. WSDL ein,
|
|
\item Logik zur Verarbeitung von speziellen Nachrichtentypen wird durch Command-Invoker in Gang gebracht,
|
|
\item Vereinfachung durch Trennung der Verarbeitungslogik vom empfangenden Web-Service
|
|
\end{itemize}
|
|
\subsection{Resource API}
|
|
\subsection{Erkläre die Funktionalität inkl. Skizze}
|
|
\begin{itemize}
|
|
\item Verwendung durch Services mittels Anfrage-URL und HTTP-Methoden des Clients begleitet durch \textbf{media type}, um Anfrage des Clients zu erkennen
|
|
\item Anfragen oft nach dem Prinzip von \textbf{Respresentational State Transfer (REST)}
|
|
\item Beispiele für eine \textbf{ressource}:
|
|
\begin{itemize}
|
|
\item Textdatei,
|
|
\item Mediendatei,
|
|
\item einzelne Spalte in Datenbanktabelle,
|
|
\item Collection mit Daten etc.
|
|
\end{itemize}
|
|
\item Clients manipulieren desn Status der Ressource durch \textbf{representations}
|
|
\item Verwendete HTTP-Methoden durch Resource-API:
|
|
\begin{itemize}
|
|
\item PUT - Ressourcenupdate,
|
|
\item GET - Abruf der Repräsentation einer Ressource,
|
|
\item DELETE - Löschen einer Ressource,
|
|
\item POST - Erstellen oder Updaten einer Ressource,
|
|
\item HEAD - ähnlich wie GET, nur ohne Abruf der Repräsentation - verwendet, um Metadaten der media-types zu erhalten,
|
|
\item OPTIONS - liefert die HTTP-Methoden der Ziel-URL zurück
|
|
\end{itemize}
|
|
\item Vorteile:
|
|
\begin{itemize}
|
|
\item Spezifikation durch HTTP definiert - Client muss keine neue API einsetzen!
|
|
\item Status-Codes von HTTP für Rückmeldung an Client können hier auch verwendet werden,
|
|
\item Regeln für \textbf{idempotent} und \textbf{safe} von HTTP gelten
|
|
\end{itemize}
|
|
\item \textbf{media types} einer Resource-API-Anfrage müssen klar definiert werden.
|
|
\item Definiert werden \textbf{media types} durch:
|
|
\begin{itemize}
|
|
\item Character-Encodings,
|
|
\item Regeln für das Parsen der Daten,
|
|
\item Standards für die Koppelung mit anderen Ressourcen,
|
|
\end{itemize}
|
|
\item Clients müssen über die media types des Services und die Verwendung dieser Bescheid wissen.
|
|
\end{itemize}
|
|
\begin{figure}[!htp]
|
|
\centering
|
|
\includegraphics[width=0.5\textwidth]{pics/ressource_api.jpg}
|
|
\end{figure}
|
|
\subsection{Beschreibe die Konsequenzen der Nutzung}
|
|
\begin{itemize}
|
|
\item Resource-APIs sind eine gute Wahl bei großer Anzahl von zugreifenden Clients,
|
|
\item Resource-APIs machen die Weitergabe der Verwendungsart der Services durch den URL-Standard sehr einfach. Nachteil: Auch durch potenzielle Angreifer einfach zu verstehen und auszunützen - Security-Probleme
|
|
\item Code-Generierung durch Entwickler kann meist nicht verwendet werden, da Service-Descriptors durch Resource-APIs nicht angeboten werden,
|
|
\item Resource-APIs bieten die Möglichkeit, die Präferenzen des Clients über die mitgegebenen \textbf{media types} abzufragen und dieselbe Ressource im richtigen Format zurückzuliefern.
|
|
\end{itemize}
|
|
\section{Web Service Infrastruktur}
|
|
\section{Service Connector Pattern}
|
|
\subsection{Erkläre die Funktionalität inkl. Skizze}
|
|
\begin{itemize}
|
|
\item Service-Connectors vereinfachen die Verwendung von Services durch Verdecken der API-Komplexität,
|
|
\item viele generische Funktionen werden gekapselt und mit zusätzlicher Logik, die der Service benötigt, erweitert:
|
|
\begin{itemize}
|
|
\item Service Location und Connection-Management wird implementiert:
|
|
\begin{itemize}
|
|
\item Ermitteln der Service-Adressen,
|
|
\item Aufbau der Verbindung zum Service,
|
|
\item Aufzeichnung aller verbindungsspezifischen Fehler.
|
|
\end{itemize}
|
|
\item Nach der Verbindung des Clients mit dem Connector leitet er die Anfrage im Auftrag des Clients weiter
|
|
\item Connectors empfangen auch die Responses des Services und stellen Hilfsfunktionen zur Unterstützung von Client-Applikationen (z.B. Datentypübersetzung oder Aufzeichnung aller HTTP status-codes) bereit,
|
|
\item Ein Connector kapselt die gesamte Verbindungslogik des Clients zur spezifischen Kommunikation mit dem Service
|
|
\end{itemize}
|
|
\end{itemize}
|
|
\begin{figure}[!htp]
|
|
\centering
|
|
\includegraphics[width=0.5\textwidth]{pics/serv_connector_api.JPG}
|
|
\end{figure}
|
|
\subsection{Beschreibe die Konsequenzen der Nutzung}
|
|
\begin{itemize}
|
|
\item Nutzung eines Connectors als Test-Double in automatisierten Tests, ohne den Web-Service ansprechen zu müssen,
|
|
\item generische Logik zur Verwendung durch den Client wird eingesetzt, wie z.B.:
|
|
\begin{itemize}
|
|
\item Logging,
|
|
\item Validierung,
|
|
\item Exception Handling,
|
|
\item Eingabe von Benutzeranmeldedaten (siehe Service-Inceptor-Pattern)
|
|
\end{itemize}
|
|
\item Ein Connector hängt von den Services, für die er erstellt wurde, ab. Bei Generierung der Services durch einen Descriptor (z.B. WSDL) muss der Entwickler informiert werden - Änderung des Descriptors und Neugenerierung dringend erforderlich
|
|
\item Clients können Exception-Handling in Bezug auf Netzwerkfehler (verlorene Verbindungen, Server-Crashes, belegte Services) oft schwer implementieren, da Informationen über den Ablauf im Hintergrund (Kommunikation mit Service) durch den Connector versteckt werden.
|
|
\end{itemize}
|
|
|
|
\section{Service Descriptor Pattern}
|
|
\subsection{Erkläre die Funktionalität inkl. Skizze}
|
|
|
|
\begin{itemize}
|
|
\item bietet eine \emph{Maschinen lesbare} Auflistung an logischen Operationen oder Ressourcen die eine Organisation bietet
|
|
\item die Metadaten von jeder logischen Operationen oder Ressource identifizieren ein Webservice und geben die Typen (Nachrichten oder Medien) an die es empfangen und zurückgeben kann.
|
|
\item Service Metadaten werden mit \textbf{XML} beschrieben -> bei Webservice nennt man das \textbf{WSDL} (Web Service Description Language) oder \textbf{WADL} bei Web Applikationen
|
|
\end{itemize}
|
|
|
|
\begin{figure}[!htp]
|
|
\centering
|
|
\includegraphics[width=0.5\textwidth]{pics/service_descriptor_contFirst.jpg}
|
|
\includegraphics[width=0.5\textwidth]{pics/service_descriptor_codeFirst.jpg}
|
|
\end{figure}
|
|
\subsection{Beschreibe die Konsequenzen der Nutzung}
|
|
|
|
\begin{itemize}
|
|
\item kann als Vertrag zwischen Server und Client angesehen werden wie eine Interaktion auszusehen hat.
|
|
\item üblicherweise in WSDL beschrieben (siehe oben)
|
|
\item Service Designer sollte Client-Service Interaktionen berücksichtigen (Netzwerkeffizienz)
|
|
\item Client benötigt viele Netzwerkanfragen um eine Anfrage abzuschließen.
|
|
\item Systeme aus weniger, größeren Komponenten als feinkörnige Systeme sollten bevorzugt werden.
|
|
\item Eine grobkörnige Beschreibung eines Systems betrifft große Unterkomponenten, während eine feinkörnige Beschreibung kleinere Komponenten betrifft, aus denen die größeren zusammengesetzt sind.
|
|
\item \textbf{Dieser Ansatz ist bekannt als das Remote Facade Pattern.}
|
|
\item Service Connectors die vom Service Descriptor generiert werden sind eng verbunden mit ihnen und müssen neu generiert werden wenn es Änderungen gibt
|
|
\item Verwendung von Service Descriptor mindert nicht die Notwendigkeit eine gute Dokumentation zu verfassen. Diese ist für Client Entwickler wichtig um Dienste korrekt zu verwenden.
|
|
\end{itemize}
|
|
|
|
\paragraph{Contract-First vs. Code-First}
|
|
\begin{itemize}
|
|
\item Contract-First
|
|
\begin{itemize}
|
|
\item Service Descriptors werden dazu verwendet die Server-seitigen Artefakte zu generieren. Definiert in XML und XSD
|
|
\item Compiler kann DTO und Service Interface Klassen auf Basis des "Vertrages" generieren (in der jeweilig benötigten Programmiersprache)
|
|
\end{itemize}
|
|
\item Code-First
|
|
\begin{itemize}
|
|
\item Service Deskriptoren werden automatisch von
|
|
Web-Service-Frameworks zur Laufzeit erstellt. Klassen, die als Service-Controller bezeichnet werden, werden in Java erstellt und annotiert. Diese Annotationen werden vom Service-Framework verwendet, welche Controller-Methoden aufgerufen werden sollen.
|
|
\end{itemize}
|
|
\end{itemize}
|
|
|
|
|
|
\section{Consumer-Driven Contracts Pattern}
|
|
\subsection{Erkläre die Funktionalität inkl. Skizze}
|
|
|
|
Egal wie viel Zeit und Mühe in ein Design investiert wird, ein Dienst muss möglicherweise noch geändert werden. Veröffentlichte APIs die erweitert werden oder andere unerwartete Änderungen.
|
|
|
|
Service Anbieter können davon profitieren, wenn sie wissen, welche (und wie) Clients ihren Service verwenden.
|
|
|
|
Das hilft Serviceentwickler beim vornehmen an Änderungen der API, um deren Auswirkungen zu verstehen.
|
|
|
|
\begin{itemize}
|
|
\item Serviceentwickler bekommen Integrations-Tests von jedem Client.
|
|
\item Der Entwickler kann dann sehen welche Auswirkung seine Änderungen auf die verschiedenen Clients haben.
|
|
\item Fehlgeschlagene Tests erleichtern die Fehlersuche.
|
|
|
|
\end{itemize}
|
|
|
|
|
|
|
|
\begin{figure}[!htp]
|
|
\centering
|
|
\includegraphics[width=0.5\textwidth]{pics/customer_driven_contracts.jpg}
|
|
\end{figure}
|
|
\subsection{Beschreibe die Konsequenzen der Nutzung}
|
|
|
|
\begin{itemize}
|
|
\item Consumer-Driven Contracts werden geschrieben um Integrationstests ausführen zu können.
|
|
\item Sollten versioniert werden, um Änderungen besser nachverfolgen zu können. (zusätzliche Aufteilung je nach Client)
|
|
\item Contract tests sollten nach jeder Änderung am API oder der internen Logik überprüft werden.
|
|
\item Dieses Pattern wird verwendet, wenn Entwickler ihre Clients kennen und die Clients auch Contracts zurückschicken können.
|
|
\end{itemize}
|
|
|
|
\begin{itemize}
|
|
\item Test Strategie
|
|
\begin{itemize}
|
|
\item sollte happy-path und falsche Verwendung vom API testen.
|
|
\end{itemize}
|
|
\item Asynchrone Services und jene mit langer Laufzeit
|
|
\begin{itemize}
|
|
\item Request/Acknowledge ist schwer zu testen
|
|
\end{itemize}
|
|
\item Dem Client die Spezifikation des API zu ermöglichen kann die Integrität dieser API in frage stellen.
|
|
\end{itemize}
|
|
|
|
|
|
|
|
|
|
\section{API Gateway Pattern}
|
|
|
|
|
|
|
|
\subsection{Erkläre die Funktionalität inkl. Skizze}
|
|
|
|
APIs die von Microservices zur Verfügung gestellt unterscheiden sich oft von den Anforderungen der Clients (Different clients need different data (desktop browser vs. mobile client))
|
|
|
|
Bei sehr detailieren APIs muss ein Client häufig mit mehreren Services interagieren. Auch die Netzwerkgeschwindigkeit ist bei jedem Client unterschiedlich.
|
|
|
|
|
|
Um das zu umgehen wird ein API-Gateway eingefügt der einen zentralen Eintrittspunkt für Clients darstellt.
|
|
|
|
|
|
Es gibt 2 Möglichkeiten wie ein Gateway Anfragen abarbeiten kann:
|
|
|
|
\begin{itemize}
|
|
\item einfaches routen zum entsprechendem Service
|
|
\item Anfragen an mehrere Services schicken
|
|
\end{itemize}
|
|
|
|
|
|
Anstatt eine einheitliche API für alle bereitzustellen, wird ein
|
|
Gateway verwendet. Dieser kann für jeden Client eine andere API verfügbar machen.
|
|
|
|
\begin{figure}[!htp]
|
|
\centering
|
|
\includegraphics[width=0.5\textwidth]{pics/api_gateway.jpg}
|
|
\end{figure}
|
|
\subsection{Beschreibe die Konsequenzen der Nutzung}
|
|
|
|
\begin{itemize}
|
|
\item Das Gateway isoliert den Client von den Microservices
|
|
\item das optimale API je nach Client-Typ kann bereitgestellt werden
|
|
\item reduziert die Anzahl an Anfragen
|
|
\item vereinfacht den Client -> die Logik um verschiedene Services aufzurufen wird auf das Gateway verlagert.
|
|
\item das Gateway ist eine weitere Komponente die Entwickelt und verwaltet werden muss...
|
|
\item längere Antwortzeiten -> zusätzlicher Schritt (jedoch sind die Kosten für den extra Aufruf nicht sehr hoch)
|
|
\end{itemize} |