SimpleREST - Client - Microservice - Loadbalancer - MessageQueue

SimpleREST - Client - Microservice - Loadbalancer - MessageQueue

Wie schon vorgestellt habe ich einen einfachen RestServer gebastelt. Schlank, schnell und Pojo.

Der Client

Natürlich benötigt das System auch noch einen einfachen Rest Client und keinen bei dem jeder Ugriff 50 Zeilen Code macht. Der RestClient kann:

  • GET, POST, PUT, DELETE
  • Parameter (die je nach System als UrlParameter oder als Daten für POST verwendet werden)
  • Datei Upload für POST
  • JSON Upload für POST
  • Wrapper für SimpleREST Server
  • eine Zeile für einen Aufruf.

Das Microservice

Nun hab ich alles zusammen, aber etwas fehlt mir. Wenn ich den Dienst auf mehreren Server verteile muss ich doch wissen, was wo läuft? Eine gute, einfache Basis für ein Microservice. Aber das ganze muss ohne Master auskommen, neue Rechner schnell einbinden, nicht erreichbare entfernen, schwache weniger belasten, starke dafür mehr. ????? Also ans Werk!

Discovery Service

Die Dienste müssen sich gegenseitig sehen. Deshalb bietet SimpleREST ein Discovery Service. Jeder Rechner fragt die anderen um Ihren Status. CPU, Ram, HDD, .... Die geben aber nicht nur Ihren, sondern auch den aller anderen mit. Die Informationen werden (wenn neuer, Zeitunterschiede bei den Servern werden eingerechnet) aktualisiert und neue Server hinzugefügt. So muss ein Microservice nur ein anderes kennen und so kommen langsam alle zusammen.

Wir wissen jetzt welche Services es gibt, wo sie zu finden sind und wie es ihnen geht. Es kann natürlich auch Services gleichen Typs geben. Somit kann ein LoadBalancing aufgebaut werden.

LoadBalancer

Der Loadbalancer muss feststellen, wer wie frei ist und wer wie viel Arbeit verkraftet. Ebenfalls sollten neue Systeme erkannt werden und nicht reagierende entfernt. Klingt bekannt? Ja eigentlich arbeitet er mit den Daten des Discovery Service. Eine eigene Berechnung schaut nun welches Service am besten geeignet ist. Ein RestClient der mit dem LoadBlancer arbeitet ist ebenfalls dabei.

MessageQueue

Mit dem bisher programmierten kommen wir schon sehr weit. Aber es gibt noch eine Spezialität. Nachrichten mit langer Wartezeit. Der Server bekommt eine Aufgabe, die lange zu bearbeiten braucht. Aber es können auch mehrere Aufgaben kommen, aber es soll immer nur eine nach der anderen abgearbeitet werden.
Zusätzlich kann es vorkommen, dass dieser Server ausfällt. Dann müssen die Nachrichten auf einen anderen umgeleitet werden. Was aber wenn der Server von dem die Nachrichten kommen auch nicht mehr existiert?
Die MessageQueue kümmert sich um diese Probleme. Die Nachrichten werden nacheinander abgearbeitet. Der Sender schickt die Nachricht auch an zwei Guarantoren (Zeugen) die aufpassen. Sollte ein Server ausfallen, müssen Sie die Nachricht weiterleiten. Sollte aber auch sie ausfallen muss der letzte die Nachricht an andere weitergeben.

Verwendung

Wie baue ich nun so ein Microservice auf?

        RestHttpServer server = RestHttpServer.Start(9000);

        LoadBalancerConfig config = new LoadBalancerConfig(server, "http://<IP>:<PORT>/", "test1");
        config.addInitialDiscoverUrl("http://127.0.0.1:9001");
        config.setSharedSecret("Roland Schuller");
        server.enableLoadBalancer(config);
        server.getRootEndpoint().addRestEndpoint(new GetEndpoint("ping") {
            @Override
            public void Call(Conversion conversion, Map<String, String> UrlParameter) {
                System.out.println("Ping:" + conversion.getRequest().getParam("num"));
            }
        });

Wir starten einen Server auf Port 9000 und geben Ihm ein anderes Service, das wir auf Port 9001 gestartet haben. Das Service ist vom Type "test1" und bietet eine Schnittstelle namens "ping" an.

In einem beliebigen Service schreiben wir auf Ping

LoadBalancedRestClient rc = server.getLoadBalancer().RestClient("ping", RestClient.REST_METHOD.GET);
rc.setParameter("num", "100");
rc.toAllServicesFireAndForget("test1",false);

Greift auf die Url Ping von allen Services vom Typ "test1" zu. Ignorieren, wenn fehlschlagen. Mach das ganze in einem Hintergrundthread und lass mich weiterarbeiten "Fire and Forget"

Der Rest ist Magie (Passiert im Hintergrund).

Ist das ganze nicht irgendwie einfacher?

 

Schau einfach auf die Webseite ->

Hilfe

Das Projekt ist Open Source und wird sicher noch einige male erweitert.  Aber ich brauche auch Hilfe. Jeder der mitarbeiten möchte: Ideen einbringen, testen, dokumentieren, Automatisierte Tests, beschleunigen, ... der ist herzlich willkommen. Egal welchen Wissensstand er/sie hat. Jeder hilft. Auch indem er es einfach nur verwendet.

Posted on

Ing. Roland Schuller

Harland 44, 3372 Blindenmarkt
@: roland@it-open.at
T: +43 676 63 54 793
W: it-open.at
RSS: RSS Feed
Blogheim.at Logo