Sie sind auf Seite 1von 41

NOS – SOA, WebServices und Spring Boot

Vorlesung:
DI Eduard Hirsch
Labor:
VZ: DI (FH) Albert Kiefel
BB: DI (FH) Simon Back
Serviceorientierte Architektur (SOA)

▪ auch dienstorientierte Architektur genannt


▪ ein Architekturmuster der Informationstechnik aus
dem Bereich der verteilten Systeme kommt
▪ Orientierung an Geschäftsprozessen,
deren Abstraktionsebenen die Grundlage
für konkrete Serviceimplementierungen
sind
▪ nicht gleich zu setzen mit Web-Services!
Web Service

▪ sind konkrete Dienste die ein Client abfragen kann


(Wetterservice)
▪ sollten so gut wie möglich sprachunabhängig sein
▪ basiert auf SOA
▪ Umfassen oft größere Sammlungen von Unterfunktionen
▪ Beispiele
− REST (Representational State Transfer)
− SOAP (Simple Object Access Protocol)
− RMI (Remote Method Invocation)
− RPC-Frameworks
REST - Representational State Transfer

▪ bezeichnet ein Programmierparadigma für verteilte Systeme,


insbesondere für Webservices.
▪ representational => “gegenständlich“ im Sinne von
„Verarbeitung von Dokumenten bzw. Ressourcen“
▪ REST hat das Ziel, einen Architekturstil zu schaffen,
der die Anforderungen des modernen Web besser
darstellt.
▪ nutzt nicht nur HTTP GET und POST sondern
auch andere (z.B. PUT, DELETE)
REST - Representational State Transfer

▪ Akronym: CRUD (Create, Reade, Update, Delete)

▪ Kommt einem objektorientierten Ansatz entgegen

▪ Eine URI identifiziert einen Endpunkt bzw. Ressource


−http://v1.api.acompany.com/customer/1234
−http://v2.api.acompany.com/address/4711
REST - Representational State Transfer

Parameter am Ende einer URI werden üblicherweise

▪ als Query-Parameter (z. B. bei POST auch im Header möglich)


−http://v1.api.acompany.com/customer/?id=1234

▪ oder am Ende bzw. als Teil eines Pfades angegeben.


−http://v1.api.acompany.com/customer/1234
−http://v2.api.acompany.com/address/4711
HTTP – Methoden, die bei REST Anwendung finden

HTTP CRUD Beschreibung


Methode
POST Create Ressource(n) anlegen oder ändern wenn der Name bzw. Identität unbekannt ist

GET Read Abfragen/Lesen von einer oder mehreren Ressource(n) auf dem Server

PUT Update Eine existierende Ressource mit Name/Identität ändern oder in seltenen Fällen eine neue
anlegen
DELETE Delete Ressource löschen
Es kann mit Request Typ …

▪ HTTP-POST auf http://v1.api.acompany.com/customer ein neuer


Kunde angelegt
▪ HTTP-GET auf http://v1.api.acompany.com/customer/2331 ein
Kunde mit id 2331 gelesen
▪ HTTP-UPDATE auf http://v1.api.acompany.com/customer/2331
dieser geändert und mit
▪ HTTP-DELETE auf http://v1.api.acompany.com/customer/2331
der Kunde wieder gelöscht werden.
RPC – Remote Procedure Calls

▪ Wird zur (Netzwerk-)Kommunikation von


Prozessen herangezogen
▪ wobei diese Prozesse normalerweise auf
getrennten Computer ausgeführt werden,
welche durch ein Netzwerk verbunden sind.
▪ Ziel ist es, Funktionen oder Methoden von
Objekten in anderen Adressräumen auszuführen,
▪ ohne, dass man sich darum kümmern muss wo diese Funktion
bzw. dieses Objekt liegt
RPC Implementierungen

▪ Es existieren verschiedenste Implementierungen


−Microsoft RPC, gRPC, SOAP, Java-RMI
▪ Die meisten bieten ein Art Interface Definition
Language an, aus der sich Stubs und Skeletons
generieren lassen.
▪ Es existiert ebenfalls für fast alle Umsetzungen ein
zentrales Namesservice, bei dem Anbieter gefunden
werden können ohne das Netzwerk zu kennen
Kernkonzept - Stub & Skeleton
▪ Stubs und Skeletons sind (meist automatisch generierte) Funktionen auf Basis der
Schnittstellenbeschreibung in einer IDL
− Stub
− Funktion bzw. Programmcode, der anstelle eines anderen Programmcode steht, der wiederum auf einem entfernten
Rechner liegt und damit aufgerufen wird
− Sichert die Zugriffstransparenz bei verteilten Systemen
− Skeleton
− Gegenstück zum Stub in entfernten Systemen
▪ Virtuelle Adressierung durch z.B. Pseudoadressen oder Pseudoreferenzen auf entfernte Objekte

virtuelle Adressierung
Client Anwendung Server
indirekte Kommunikation
Stub Skeleton

Kommunikations- Kommunikations-
Basis tatsächliche Übertragung Basis

05.04.2019 FH Salzburg · ITS · Eduard Hirsch 11


Marshalling / Unmarshalling

▪ Marshalling
−Transformation der (meist) objektorientieren Aufrufe, sowie deren Daten in
ein für das Medium geeignetes Übertragungsformat
▪ Un-Marshalling
−Rücktransformation eines Zeichen- oder Bytestroms in Daten, sowie
Objektreferenzen einer konkreten Programmiersprache.

Verantwortlich für diese Aufgabe sind in der Regel die erwähnten


Stubs und Skeletons einer Middleware.

05.04.2019 FH Salzburg · ITS · Eduard Hirsch 12


Marshalling / Unmarshalling

▪ Sicherstellung einer definierten und einheitlicher Darstellung der


Datentypen zur Kommunikation
▪ z.B.: Datentypen unterschiedlicher Programmiersprachen,
Hardwareabhängigkeiten (z.B. Big Endian, Little Endian),
Betriebssystemabhängigkeiten, usw.

05.04.2019 FH Salzburg · ITS · Eduard Hirsch 13


Java RMI

Remote Method Invocation (RMI), auch als


Methodenfernaufruf bezeichnet, ist der Aufruf einer
Methode eines entfernten Java-Objekts und realisiert die
Java-eigene Art des Remote Procedure Call (RPC).
RMI Funktionsweise

1. Der Server registriert ein Remote Object bei der RMI-Registry unter einem
eindeutigen Namen.
2. Der Client sieht bei der RMI-Registry unter diesem Namen nach und bekommt eine
Objektreferenz, die seinem Remote Interface entsprechen muss.
3. Der Client ruft eine Methode aus der Objektreferenz
auf.
4. Die Server-JVM führt die Methode auf dem
Remote Object aus.
5. Dem Client werden die Rückgabewerte dieses
Aufrufes gesendet, oder der Client bekommt eine
Fehlermeldung (z. B. bei einem
Verbindungsabbruch).
RMI Client

import java.rmi.Naming;
import at.fhsalzburg.its.nos.rmi.server.AdditionInterface;

public class AdditionClient {


public static void main(String[] args) {
AdditionInterface hello;
try {
hello = (AdditionInterface) Naming.lookup("rmi://localhost/adding");
int result = hello.add(9, 100);

System.out.println("Result is :" + result);


} catch (Exception e) {
System.out.println("HelloClient exception: " + e);
}
}
}
RPC / RMI Ablauf Diagramm

Quelle: Tannenbaum/ & Marten 2003


RMI – Öffentliches Interface

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface AdditionInterface extends Remote {


public int add(int a,int b) throws RemoteException;
}
RMI – Server Implementierung

import java.rmi.RemoteException;
import java.rmi.server.*;

public class Addition extends UnicastRemoteObject implements AdditionInterface {

private static final long serialVersionUID = 1L;

public Addition() throws RemoteException {


super();
}

public int add(int a, int b) throws RemoteException {


int result = a + b;
return result;
}
}
RMI Server startup & registration

import java.rmi.Naming;

public class AdditionServer {


public static void main(String[] argv) {
try {
Addition Hello = new Addition();
Naming.rebind("rmi://localhost/adding", Hello);

System.out.println("Addition Server is ready.");


} catch (Exception e) {
System.out.println("Addition Server failed: " + e);
}
}
}
RMI Beispiel – Stubs & Skeletons

Stubs & Skeletons für die Implementierung können mit dem


Java RMI Compiler erzeugt werden (rmic), aber …

Quelle: https://pixabay.com
… seit Version 5 werden Stubs, sowie
Skeletons beim Kompilieren automatisch erstellt.

Achtung: geht nur bis Java 8 „out-of-the-box“


RMI Server ausführen

1. Starten der zentralen Registrierung mit


Windows:
start rmiregistry
Linux, Mac:
rmiregistry &
2. AdditionServer starten („Run As“ -> „Java Application“)
=> AdditionServer wartet auf Anfragen
3. AdditionClient starten
=> Ausgabe der Addition: 109

Achtung: geht nur bis Java 8 „out-of-the-box“


Spring Boot

▪ Open Source Framework, mit verschiedensten Tools und


Hilfswerkzeugen
▪ Ist zum Pseudo-Standard für Java (Web-)Applikationen geworden
▪ Vereinfacht den Bau von Server Applikationen wesentlich
▪ Einfache Integration von verschiedenen Plattformen und Technologien
▪ Baut auf
−der Java Spezifikation J2EE (Applikationsserver)
−Servlets
−Build-Automation und Testing
Java Enterprise Edition

▪ Ist eine reine Spezifikation einer Softwarearchitektur


▪ Ist KEINE direkte Implementierung
▪ Beschreibt welche Module, Packages bzw. Schnittstellen ein
„Implementierer“ zur Verfügung stellen muss.
▪ Beispiele für Server die diese Schnittstellen umsetzen:
−Tomcat (meistens für Spring Boot)
−JBoss
−GlassFish
−Jetty
Java Enterprise Edition (J2EE) - Komponenten

▪ Sicherheit (Security),
▪ Transaktionsmanagement,
▪ Namens- und Verzeichnisdienste,
▪ Kommunikation zwischen Java-EE-Komponenten,
▪ Persistenzdienste zum langfristigen Speichern von Java-Objekten,
▪ Management der Komponenten über den gesamten Lebenszyklus (inklusive
Instanziierung),
▪ Unterstützung für die Installation (Deployment)
Servlets

▪ Eine Java-Klasse welche eine Webanfrage entgegen


nimmt
▪ Eine Antwort wird dynamisch in dem Moment der Anfrage
erstellt
▪ Es muss keine statische Information vorhanden sein. Wie
z. B. eine Web-Seite in HTML
▪ Laufen meistens in der Umgebung eines
Applikationsservers (Tomcat, Jboss, Jetty, …)
Servlets

Quelle: https://de.wikipedia.org/wiki/Servlet
Spring Boot - Übersicht

Lende:

Java Message Service (JMS)


Java Database Connectivity (JDBC)
Object-relational mapping (ORM, O/RM oder O/R
mapping tool)
Spring's Object/XML Mapping support (OXM)
Spring Expression Language (SpEL)
Aspect-Oriented Programming (AOP)

Quelle: https://docs.spring.io/spring-boot/docs/current/reference/html/
Build & Automation-Tools für Spring

Spring Boot Applikationen verwendet


meist eines dieser Tools
▪ Ant
▪ Maven oder
▪ Gradle

als darunter liegendes Build-Tool ähnlich einem „Makefile“ das


häufig für C/C++ Kompilierung eingesetzt wird.
Build & Automation – Ant & Maven

Ant ist ein fast 20 Jahre altes Tool zum Bauen und
Bereitstellen von Applikationen

Maven ist eine Weiterentwicklung und bietet


zusätzlich noch die Möglichkeit Abhängigkeiten
in Form von Packages aus einem Zentralen
Repository in der korrekten Version herunter zu laden.

=> Beide Tools verwenden eine sehr aufwendige XML-Konfiguration


Build & Automation - Gradle

… ist ebenfalls ein Build und Dependency Management Tool wie


Maven verwendet jedoch als Konfigurationssprache Groovy, welches
die Komplexität im Vergleich zu XML verringern soll

=> Wird immer beliebter bei Software-Teams


Spring Tool Suite basiert auf …

▪ einer Eclipse IDE


▪ Visual Studio Code oder
▪ einer Atom IDE

und beinhaltet alle notwendigen Pakete und Tools um eine Spring


Applikation zu bauen und zu testen – außer dem Java JDK das zuvor
installiert werden muss.
Spring Boot REST Beispiel

Ziel Hello World App:

Request -> GET http://localhost:8080/greeting


=> {"id":1,"content":"Hello, World!"}

Request -> GET http://localhost:8080/greeting?name=Eduard


=> {"id":1,"content":"Hello, Eduard!"}

Quelle: https://spring.io/guides/gs/rest-service/
Einschub Design Pattern: MVC (Model View Control)

Model: Zentrale Komponente, welche die

Quelle: https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller
Datenstrukturen bzw. die Daten vorgibt.
Verwaltet die Daten und kümmert sich um
die Regel und die Businesslogic.
View: Repräsentation der Daten in jeglicher
Form: Tabellen, Grafiken, Dokumente, …
Controller: holt sich die „Model“-Daten und
bereitet sie für die View aufgrund von
Parametern vor.
Spring Boot REST Beispiel (Model)

public class Greeting { {


private final long id;
"id": "1",
private final String content;
"content": "Hello, Eduard!"
public Greeting(long id, String content) { }
this.id = id;
this.content = content;
}

public long getId() {return id;}


public String getContent() {return content;}
}
Spring Boot REST Beispiel (Controller)

@RestController
public class GreetingController {

private static final String template = "Hello, %s!";


private final AtomicLong counter = new AtomicLong();

@RequestMapping("/greeting")
public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {

return new Greeting(counter.incrementAndGet(),


String.format(template, name));
}
}
Spring Boot Beispiel – Ausführen & Kompilieren

Ausführen und Bauen in der Gradle:


STS IDE: ▪ mit ./gradlew bootRun direkt laufen lassen oder
rechte Maustaste auf die Applicationklasse
▪ mit ./gradlew build bauen und mit
(@src/main/java/hello/Application.java) und
java -jar build/libs/gs-rest-service-0.1.0.jar
„Run As“-> „Spring Boot Application“
starten

Maven:
▪ mit ./mvnw spring-boot:run direkt laufen lassen oder
▪ mit ./mvnw clean package bauen und mit
java -jar target/gs-rest-service-0.1.0.jar
starten
Spring (Boot) Initializr

Unter https://start.spring.io/ kann ein Start Projekt


automatisch generiert werden mit den entsprechenden
Optionen.

05.04.2019 FH Salzburg · ITS · Eduard Hirsch 38


SOAP – Simple Object Access Protocol

Auch ein RPC Framework/Protokoll das sprachunabhängig ist und


auf diesen Komponenten basiert:

XML: Erweiterbares Textformat für den Austausch von strukturierten Daten.


WSDL (Webservice Description Language): XML Notation zur
Beschreibung von Webservices.
UDDI (Universal Description, Discovery and Integration): Verzeichnisdienst
zur Veröffentlichung von Webservices

05.04.2019 FH Salzburg · ITS · Eduard Hirsch 39


SOAP – Simple Object Access Protocol

05.04.2019 FH Salzburg · ITS · Eduard Hirsch 40


SOAP - Simple Object Access Protocol

Ist ähnlich zu verwenden wie RMI, jedoch nicht ganz so


komfortable:

▪ Stubs und Skeletons werden aus der WSDL generiert


▪ Instanziieren und ausführen ist etwas aufwendiger
▪ ab Java 9 im JDK deprecated und ab Java 11 aus den
Standard Bibliotheken entfernt => Fremdframework
notwendig

05.04.2019 FH Salzburg · ITS · Eduard Hirsch 41