Theorie und Praxis einer JSON-RPC-basierten Web-API · Motivation Grundlagen Implementierung...

20
Motivation Grundlagen Implementierung Zusammenfassung Theorie und Praxis einer JSON-RPC-basierten Web-API Christian Krause [email protected] Raritan Deutschland GmbH Chemnitzer LinuxTage 2015 Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API

Transcript of Theorie und Praxis einer JSON-RPC-basierten Web-API · Motivation Grundlagen Implementierung...

MotivationGrundlagen

ImplementierungZusammenfassung

Theorie und Praxis einer JSON-RPC-basiertenWeb-API

Christian [email protected]

Raritan Deutschland GmbH

Chemnitzer LinuxTage 2015

Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API

MotivationGrundlagen

ImplementierungZusammenfassung

Gliederung

1 Motivation

2 GrundlagenRemote Procedure CallInterface Definition LanguageJSON, JSON-RPC und REST

3 ImplementierungSprachanbindungenVersionierung

Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API

MotivationGrundlagen

ImplementierungZusammenfassung

Problemstellung

Entwicklung eines neuen ProduktesPDU - Power Distribution UnitMessen von Strom, Spannung,Energie und LeistungSchalten der AusgängeUnterstützung einer Vielzahl vonSensoren und Aktoren

Gesucht: Netzwerk-APIAbfrage aller Daten, Steuerung,Konfigurationinterne Nutzung (Web-Oberfläche)Skripte für Test, Produktion undInstallationIntegration

Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API

MotivationGrundlagen

ImplementierungZusammenfassung

Anforderungen

Nutzung von existierenden StandardsVerschlüsselung, AuthentifizierungImplementierbarkeit

Eignung für eingebettete SystemeEignung für effiziente IPCEinfache Generierung einer Vielzahl vonSprach-Anbindungen

Wartbarkeit / DebuggingLesbarkeit des „On-Wire“-ProtokollsNutzung mit Standard-Tools

Formale Definition

Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API

MotivationGrundlagen

ImplementierungZusammenfassung

Gewählte Technologien

einfache, objektorientierte IDLJSON-RPCan REST-API angelehntes URI-SchemaHTTP

HTTPS zur VerschlüsselungBasic Auth zur Authentifizierung

Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API

MotivationGrundlagen

ImplementierungZusammenfassung

Remote Procedure CallInterface Definition LanguageJSON, JSON-RPC und REST

Remote Procedure Call - RPC

Aufruf von Funktionenüber Prozess- und Systemgrenzen hinwegClient-/Server-ArchitekturBeispiele

CORBAXML-RPCD-BusSOAP

Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API

MotivationGrundlagen

ImplementierungZusammenfassung

Remote Procedure CallInterface Definition LanguageJSON, JSON-RPC und REST

Interface Definition Language - IDL

Formale Beschreibung einer SchnittstelleStrukturen und EnumerationenKlassen/InterfacesMethoden

Unabhängig von einer ProgrammierspracheNutzung

Erstellung von SprachanbindungenDokumentation

Beispielinterface Outlet extends EDevice {

enumeration PowerState {PS_OFF,PS_ON

};int setPowerState(in PowerState pstate);

};

Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API

MotivationGrundlagen

ImplementierungZusammenfassung

Remote Procedure CallInterface Definition LanguageJSON, JSON-RPC und REST

JavaScript Object Notation - JSON

textbasiertes Datenaustausch-FormatBasis: JavaScript

Datentypenobj = { "string as key" : "a string value",

"some integer" : 31,"some bool" : true,"an undefined value" : null,"an array type" :

[ 1, false, { "key of inner object" : 42 } ]}

Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API

MotivationGrundlagen

ImplementierungZusammenfassung

Remote Procedure CallInterface Definition LanguageJSON, JSON-RPC und REST

JSON-RPC

RPC-ProtokollSerialisierung: JSONClient: Request-Objekt

Methode (String)Parameter (Objekt)ID

Server: Response-ObjektResultat (Objekt) oderFehler (Objekt)ID

Request{ "jsonrpc": "2.0",

"method": "setPowerState","params": {

"pstate": 1},"id": 23 }

Response{ "jsonrpc": "2.0",

"result": {"_ret_": 0

},"id": 23 }

Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API

MotivationGrundlagen

ImplementierungZusammenfassung

Remote Procedure CallInterface Definition LanguageJSON, JSON-RPC und REST

Representational State Transfer - REST

ProgrammierparadigmaURI identifiziert konkrete(s) Resource / ObjektURI beinhaltet keine MethodeninformationBeispiel

http://10.0.42.2/model/pdu/0/inlet/0

Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API

MotivationGrundlagen

ImplementierungZusammenfassung

SprachanbindungenVersionierung

Vorgehensweise

Abbildung der IDL auf entsprechende Klassen undMethoden(De)Serialisierung von/nach JSON-RPCClient: Objekt in Zielsprache agiert als Proxy für entferntesObjektIDL-Compiler

geschrieben in Javaein Backend pro Sprache und Protokoll-MappingC++ (Client und Server), Java (GWT), Java, JavaScript,Perl, Python, Ruby

Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API

MotivationGrundlagen

ImplementierungZusammenfassung

SprachanbindungenVersionierung

System-Überblick

Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API

MotivationGrundlagen

ImplementierungZusammenfassung

SprachanbindungenVersionierung

Beispiel

Abfrage von Daten auf der Kommandozeile$ curl -s -k -d \

’{"jsonrpc":"2.0", \"method":"getReading", \"params":{},"id":411}’ \

http://user:[email protected]/model/pdu/0/inlet/0/activePower

{"jsonrpc": "2.0", "result":{

"_ret_":{"timestamp": 1426690798, "available": true,"status": {"aboveUpperCritical": false, "aboveUpperWarning": false,"belowLowerWarning": false, "belowLowerCritical":false },

"valid": true,"value":690.620033}

}, "id":411}$

Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API

MotivationGrundlagen

ImplementierungZusammenfassung

SprachanbindungenVersionierung

Beispiele 1

IDLinterface Echo {

structure EchoData {int a;string b;

};

int echo(in EchoData datain,out EchoData dataout);

};

Perl$datain = { "a" => 5,

"b" => "Test" };$ret = $intf->echo($datain,\$dataout);print $dataout->{"a"};

Pythondatain = EchoData(5, "Test")(ret, dataout) = intf.echo(datain)

JavaEchoData datain = new EchoData();datain.a = 5;datain.b = "Test";EchoResult r = intf.echo(datain);int rv = r._ret_;int a = r.dataout.a;String b = r.dataout.b;

Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API

MotivationGrundlagen

ImplementierungZusammenfassung

SprachanbindungenVersionierung

Beispiele 2

IDLinterface Echo {

structure EchoData {int a;string b;

};

int echo(in EchoData datain,out EchoData dataout);

};

C++ - Interfacestruct EchoData {

int32_t a;std::string b;

};virtual int echo(int32_t& _ret_,

const EchoData& datain,EchoData& dataout) = 0;

C++ - Server-Implementierungclass EchoImpl: public virtual Echo {... }

int EchoImpl::echo(int32_t& _ret_,const EchoData& datain,EchoData& dataout) {

dataout = datain;_ret_ = 0;return 0;

}

Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API

MotivationGrundlagen

ImplementierungZusammenfassung

SprachanbindungenVersionierung

Versionierung

Schnittstellen ändern sich über die Zeitneue FunktionenKorrekturen

Anforderungengeringe Auswirkungen auf Clients

UnterscheidungKompatible Änderung

Client muss nicht geändert werdenz.B. neues Element in out-Parameter-Struktur

Aufruf-kompatible ÄnderungClient kann alle Methoden der Klasse aufrufenClient kann ggf. mit dem Rückgabe-Objekt nichts anfangen

Inkompatible ÄnderungClient kann einige Methoden nicht aufrufen

Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API

MotivationGrundlagen

ImplementierungZusammenfassung

SprachanbindungenVersionierung

Versionierung 2

Unterstützung mehrerer Versionenvom Servervom Client

GranularitätKomplette APIInterface/KlasseMethode

Benutzung der Versionierung durch ClientsVersionierung ignorieren (kein Aufwand, „best effort“)Unterstützung und Prüfung genau einer Version (wenigAufwand, geringe Kompatibilität)Unterstützung mehrerer Versionen (substantieller Aufwand)

Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API

MotivationGrundlagen

ImplementierungZusammenfassung

Vorführung

Zusammenfassung

VorteileErstellung und Test einer einzigen API auf Server-SeiteUnabhängige Entwicklung von Oberflächen und SkriptenC++, Java (GWT), Java, JavaScript, Perl, Python, Ruby

Praktische AnwendungWeb-Frontend: Java (GWT)Web-Frontend für mobile Geräte: JavaScriptAnbindung an Steuerungssysteme: RubySkripte für Groß-Installationen: Perl, PythonSkripte für Test und Produktion: Python

NachteileEntwicklung von Clients für mehrere Versionen aufwendigBei inkompatiblen Änderungen muss Client geändertwerdenKompatible Änderungen sind zu bevorzugen

Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API

MotivationGrundlagen

ImplementierungZusammenfassung

Vorführung

Vorführung

Praktische Vorführung

Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API

MotivationGrundlagen

ImplementierungZusammenfassung

Vorführung

Ende

Fragen? Fragen!

Christian [email protected] Theorie und Praxis einer JSON-RPC-basierten Web-API