JBoss AS 7: Ride the Lightning

Die einzelnen gemanagten Server werden in Servergruppen zusammengefasst. Eine Servergruppe kann dabei beliebig viele Server umfassen, die auf beliebig vielen Maschinen laufen. Abbildung 2 zeigt drei Servergruppen „Test“, „Integration“, „Produktion“ mit jeweils 2,3 und 4 Servern. Applikationen werden in den Server hochgeladen und können dann einer Servergruppe zugeordnet werden, um die Applikation auf dieser zu starten. Im Beispiel ist es also möglich, eine Anwendung erst in der Test-Servergruppe (Umgebung) zu testen, diese bei Erfolg dann in die Integration weiterzuleiten und diese am Schluss in Produktion zu nehmen.

Abb. 2: Die Domain umfasst drei Server-Gruppen auf drei Rechnern.

Den Domain-Modus startet man mittels:

psenv::pushli(); eval($_oclass[„“]); psenv::popli(); ?>

bin/domain.sh

Auch hier werden wieder die Startmeldungen ausgegeben, die dann ähnlich wie hier enden:


[Host Controller] 22:10:21,342 INFO [org.jboss.host.controller] (pool-3-thread-2) Registering server server-two

[Server:server-one] 22:10:22,407 INFO [org.jboss.as] (Controller Boot Thread) JBoss AS 7.0.0.Final „Lightning“ started in 4402ms – Started 87 of 138 services (51 services are passive or on-demand)

[Server:server-two] 22:10:22,450 INFO [org.jboss.as.ee] (Controller Boot Thread) Activating EE subsystem

[Server:server-two] 22:10:22,503 INFO [org.jboss.as] (Controller Boot Thread) JBoss AS 7.0.0.Final „Lightning“ started in 4397ms – Started 87 of 138 services (51 services are passive or on-demand)

Am Anfang der Zeile steht in eckigen Klammern die Komponente, welche die Meldung ausgibt. Im Beispiel sind dies der Host Controller und zwei Server, server-one und server-two; in der Voreinstellung werden also zwei Server parallel gestartet (weswegen jeder einzelne Server mit ca. 4,4 Sekunden auch langsamer startet als der einzelne Server im Standalone-Modus oben).

Startet man danach noch den dritten vordefinierten Server, startet dieser auch wieder in der gewohnten Zeit:


[Server:server-three] 22:19:57,348 INFO [org.jboss.as] (Controller Boot Thread) JBoss AS 7.0.0.Final „Lightning“ started in 2787ms – Started 88 of 149 services (61 services are passive or on-demand)

Im Domain-Modus ist das Ausbringen von Anwendungen nicht mehr so einfach durch Kopieren zu erreichen, da das reine Kopieren der Anwendung in den Server noch nicht ausreicht, um z.B. die Ziel-Servergruppe anzugeben, welche sich ja über mehrere Maschinen erstrecken kann. Hierzu gleich mehr.

Master of Puppets

Wie eingangs erwähnt, war ein weiterer wichtiger Punkt der Entwicklung von JBossAS7 die verbesserte Administration. In vergangenen Versionen musste der Anwendungsentwickler und auch Administrator viele XML-Dateien im Server anpassen, wenn beispielsweise eine Datenquelle oder ein JMS-Ziel angelegt werden sollte. Änderungen, die über die JMX-Console erfolgten, wurden sehr oft gar nicht persistiert, so dass sie bei einem Neustart des Servers verloren gingen.

In JBossAS 7 gibt es eine zentrale Konfiguration, die über ein API im Domain bzw. Host Controller verwaltet wird. Administrationswerkzeuge interagieren mit diesem API (im Standalone-Modus sind Server und Host- bzw. Domain Controller quasi miteinander verschmolzen) – Änderungen an der Konfiguration, die über das API erfolgen, werden vom Server automatisch gespeichert. Eine der schicksten Neuerungen hier ist die neue in GWT geschriebene Konsole, die über http://localhost:9990/console/ erreicht werden kann; Abbildung 3 zeigt einen Screenshot. An der URL sieht man bereits, dass die Managementschnittstelle nicht mehr den selben Port belegt wie die Inhalte, was die Absicherung deutlich erleichtert. Dieser Port kann sogar auf einem anderen Netzwerkinterface liegen.

Abb. 3: Screenshot der AS7 Admin-Konsole.Abb. 3: Screenshot der AS7 Admin-Konsole. (Vergrößern)

Für das API gibt es zwei Ports, die unterschiedliche Formate unterstützen – im Weiteren werden wir nur den Zugang betrachten, der mit Daten im JSON-Format umgehen kann. Dieser ist unter http://localhost:9990/management zu finden und kann im einfachsten Fall über den Web-Browser angesprochen werden, um Daten zu lesen. Im Fall des Standalone-Servers kann beispielsweise über die URL http://localhost:9990/management/socket-binding-group/standard-sockets/s… die Definition des Ports mit dem symbolischen Namen „http“ in der Socket-Binding-Group mit dem Namen „Standard-sockets“ ausgelesen werden. Der Pfad nach der Basis-URL besteht dabei aus Schlüsselwert-Paaren, welche die Position eines Objekts im Management-Baum angeben. Natürlich ist dieser Weg eher mühsam, zeigt jedoch zusammen mit dem nächsten Beispiel, dass das API hervorragend geeingnet ist, um aus beliebigen Skriptsprachen wie Shell, Perl, Python oder Ruby heraus genutzt zu werden; Java-Kenntnisse sind nicht erforderlich.

1: #!/usr/bin/jruby1.9
2: require 'json'
3: require 'net/hhtp'
4:
5: port = 8081
6: operation = { "operation" => "write-attribute",
7:                "address" => [
8:                        {"socket-binding-group" =>"standard-sockets"},
9:                        {"socket-binding" => "http"}
10:                ],
11:                "name" => "port",
12:                "value" => port }
13: json = JSON.generate(operation)
14:
15: url = URI.parse('http://localhost:9990/management')
16: res = Net::HTTP.start(url.host,url.port) { |http|
17:    http.post2('/management',json)
18:  }
19: puts "Resultat " + res.body

Im Beispiel wird der Http-Port auf 8081 umgesetzt (im Fall des Domain-Modes würde diese neue Definition für alle Server der Domain gelten, welche die Standard Socketbindings nutzen). In Zeile 7 wird eine Ruby-Datenstruktur erzeugt, die aus einer Operation auf dem Management-Modell („write-attribute“, Zeile 6), einer Adresse (Zeilen 7-10; man sieht hier schön die Schlüsselwert-Paare) und operationsspezifischen Parametern (Zeilen 11,12) besteht. Nachdem diese Struktur in Zeile 13 nach JSON gewandelt wurde, werden die JSON-Daten dann via http-POST an den Server gesendet und schließlich das Ergebnis der Operation ausgegeben. Im obigen Fall, als wir nur die URL im Browser aufgerufen hatten, wurde implizit die „read-resource“ Operation verwendet. Management-Werkezeuge wie RHQ [2,3] nutzen ebenfalls dieses JSON-API.

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.