Unterschied Softwarekomponente und Service
Kategorie Promotion | 4 Kommentare »
Zunächst, ich bin zurück aus Sofia und werde dann auch nächste Woche Fotos hier posten. Jetzt will ich aber erst mal eine kleine Erkenntnis über den Unterschied von Softwarekomponenten und Services schreiben.
Schon bevor man über Web Services sprach, gab es die Idee der Wiederverwendung. So sollte man seinen Programmcode so gestalten, dass man möglichst ohne Probleme Teile wiederverwenden konnte. Man hat dazu die Funktionalität einer Komponente hinter Schnittstellen (Interfaces) versteckt und diese Schnittstellen interessierten Partnern angeboten. Eine wichtige Grundforderung war daher, dass eine Softwarekomponente über ein wohl definiertes Interface verfügen muss.
Eine andere häufige Forderung ist, dass eine Softwarekomponente letztendlich zustandslos sein muss. Das bedeutet, wenn ich eine Funktion einer Softwarekomponente immer wieder mit den gleichen Eingabewerten aufrufe, dann muss ich immer das gleiche Ergebnis bekommen.
Diese beiden Forderungen des definierten Interface und der Zustandslosigkeit gelten natürlich auch für Web Services. Nun ist aber die Frage, worin der fundamentale Unterschied zwischen einer einfachen Softwarekomponente und einem Web Service liegt. Letzte Woche bin ich auf eine Präsentation von Jean-Jacques Dubray gestoßen. Aus dieser kann man ersehen, dass ein Service im Unterschied zu einer Softwarekomponente auch kontextunabhängig sein muss.
Was bedeutet nun kontextunabhängig? Softwarekomponenten sind meist Teil einer größeren Softwareanwendung. Oftmals liegen alle Softwarekomponenten in der gleichen Programmiersprache vor. Im Unterschied dazu sind Services über das ganze Netz verteilt und sie müssen nicht mit der gleichen Technologie implementiert sein. Damit nun trotzdem diese sehr verschiedenen Services miteinander kommunizieren können, muss eine einheitliche Kommunikationsform gefunden werden.
Die Kommunikation erfolgt heute bekanntermaßen über SOAP. Die Schnittstellen zu Servicen werden in WSDL definiert. Durch diese Standardisierung ist es möglich, dass sogar Services miteinander interagieren können, die mit Technologien verschiedener Hersteller (wie Microsoft und SUN) erstellt wurden. Es sei noch kurz angemerkt, dass natürlich auch schon früher Softwarekomponenten miteinander z.B. über RPC miteinander kommunizieren konnten, aber dies waren keine allgemeingültigen Standards und somit war Kontextunabhängigkeit nicht wirklich gegeben.
Entspricht eine Komponente die Daten verwaltet dieser Definition von Zustandsunabhängigkeit? Wenn ich z.B. eine Benutzerverwaltungskomponente frage wieviele Nutzer gespeichert sind, dann einen neuen Nutzer anlege, mit dem selben Aufruf wie vorher wieder die gespeicherte Nutzeranzahl abfrage erhalte ich einen anderen Wert. Aber wenn ich jetzt genauer drüber nachdenke, ist das ja eigentlich auch nicht der Zustand der Komponente, oder?
Zustandunabhängig bedeutet, dass du z.B. nicht bestimmte Funktionen der Komponente in festgelegter Reihenfolge aufrufen musst. Natürlich ändert sich der Inhalt der Datenbank, aber wie du selber sagst, ist dies nicht der Zustand der Komponente an sich.
Entschuldige im vorraus für meine Abschweifung :-) Da ich gerade RPC und Webservices lese, fehlt mir folgendes dazu ein:
Wenn ich eine entfernte Methode aufrufe, so werden Objektargumente serialisiert. Weil ja die Referenz nur in einem Addressraum gültig ist.
Nach meinem Wissensstand, ist eine Web-Service nichts weiter als eine entfernte Methode. Was ist wenn eine Web-Service ein Objekt als Argument erwartet? Oder kann man etwa nur primitiven Datentypen austauschen?
Ich lese eine Menge über SOAP, WSDL, UDDI usw… aber diese Frage ist mir jetzt immer noch nicht richtig klar.
Ein Objekt würde ja nicht nur Daten sondern auch Methoden enthalten. Von daher tauscht du nicht die klassischen Objekte aus wie in der OO Programmierung. Bei Webservices werden immer nur Nachrichten ausgetauscht. Diese Nachrichten haben einen bestimmten Typ (MessageType in WSDL). Hinter einem MessageType können natürlich komplexe Konstrukte stehen, die du z.B. mittels XSD definieren kannst.
Ein Webservice besteht meist aus einer Vielzahl von Operationen bzw. Methoden. Diese kannst du natürlich wie normale Methoden in der lokalen Programmierung betrachten, aber wahrscheinlich ist das sehr vereinfacht.