JEE ohne Web

Hallo Community,

ich bin auf der Suche nach Java in der Cloud um Microservices, welche keine Web Funktionen benötigen, zu bauen. Hierfür ist lediglich eine Art Message Queue Anbindung (Kafka ist aus heutiger Sicht gesetzt, kein JMS) nötig. Das heißt der Microservice reagiert auf Messages, verarbeitet diese mit einer Datenbank und gibt über den selben Weg auch seine Antworten zurück.

Normalerweise würde ich eine normale Java Consolenanwendung bauen, die ich über eine main(String … args) starte. Dafür bräuchte ich nicht mehr. Nun finde ich, wenn ich nach Cloud und Java suche nur Servlet Container und Java EE Server … das klingt ja alles erst mal nach Web. Mit welchen der beiden kann ich Java Microservices bauen, welche ohne Webfunktionen auskommen? Und mit welchen Technologien da drin wäre es am sinnvollsten, wenn ich Multithreaded Daten verarbeiten möchte (z.B. Servelt, EJB etc). Macht das überhaupt Sinn?

PS. Webfunktionen sind für einen Microservice nicht verkehrt um z.B. Doku zu dem Service auszuliefern, von daher bin ich nicht böse, wenn ich sie hätte … aber wichtig wäre es nicht.

Ein Microservice unterscheidet sich eigentlich nicht großartig von einem “Webservice”. Allein vielleicht von der Auffassung, dass ein Webservice mit dem Webbrowser konsumiert wird.
Ansonsten sind REST-Schnittstellen Stand der Technik und die werden in der Regel ebenfalls über HTTP bedient.
Ob die Ausgabe jetzt HTML, XML, JSON oder sonst ein Text ist, ist dabei doch egal.

Gerade für Microservices bietet sich wohl etwas leichtgewichtiges wie ein einfacher (eingebetteter) Servletcontainer an. Dazu dann ein passendes Webframework, welches ggf. auch explizit REST-Unterstützung hat (Spring bietet hier alles, was man braucht).

Du erwähnst, dass du keine Webfunktionen möchtest, aber Daten mit Servlets verarbeiten… das ist leider ein Widerspruch: https://de.wikipedia.org/wiki/Servlet

Java EE ist nicht an das Web gekoppelt. Es bietet sich zwar für die meisten Services an, ist hier aber keine Pflicht. Wenn du “Java EE Server” gelesen hast, sollte dir das den Grundstein legen, alle JEE Services nutzen zu können. Von Kafka habe ich jetzt persönlich mal gar keine Ahnung, aber in einem Java EE Container kannst du beliebige EJB definieren, laut diesem Artikel haben sich da auch schon diverse Leute Gedanken drum gemacht: Apache Kafka – New messaging way

Hier haben sie einen Kafka Consumer (als Singleton) definiert, der dann theoretisch die empfangenen Daten an andere Beans zur Verarbeitung weitergeben kann, im besten Fall sind diese gepoolt und skalieren somit (bei mehr Last werden mehr Instanzen hiervon erzeugt).

@cmrudolph : Ja, Das Thema ist genau, dass es kein Rest gibt, sondern nur ein Messageing Service (Kafka), an den sich das Stück Microservice koppelt. Somit kommt aber auch das JEE interne Messaging nicht in Frage. @inv_zim : Dass Servlets nicht wirklich geeignet sind, obgleich sie als Startpunkt dienen könnten, ist mir durchaus bewusst. Daher auch meine Frage. Danke für den Link. Ich werde es mir durchlesen.

@freezly nicht falsch verstehen: Servlets können für eine Kommunikation durchaus geeignet sein, sie sind aber für HTTP Kommunikation gedacht, und gerade das wolltest du ja explizit nicht.

Solltest du es am Ende umsetzen bin ich aber am Ergebnis auf jeden Fall interessiert. Hast du schon vorab Erfahrungen mit Kafka, was den Datendurchsatz angeht? Ich nehme mal an, du hast an die Transferraten hohe Anforderungen, oder?

Naja, man könnte ein Servlet maximal als Startpunkt missbrauchen. Im Init einen Thread starten, welcher dann die Kafka Messages entgegen nimmt und in weiteren Threads verarbeitet. Da die Servlets auch einen Stop haben, könnte man die Threads auch sauber beenden. Aber dafür sind sie einfach nicht gedacht und ich weiß nicht, was man sich da für Probleme noch rein holt.

OK. Ich werde berichten

Ich habe aktuell das erste Projekt mit Kafka und habe bisher nur Testfälle im Kafka durchgespielt. Der Durchsatz in meinen Testfällen hat schon beeindruckt, obgleich ich kaum Vergleiche habe. Im Inet wird ja von einer sehr hohen Durchsatzrate berichtet. Ich bin mir nicht ganz sicher, wie weit es gehen wird, aber in meinem aktuellen Projekt muss der Messagebroker sehr gut mitskalieren können. Was auch sehr gut ist in Kafka: Wenn ich es bräuchte könnte ich alle Messages von Anfang an noch mal abspielen. Ich habe zwar noch keinen konkreten Anwendungsfall, aber schon allein zu wissen, dass alles noch mal verfügbar ist beruhigt etwas.
Durch die Technik kann man mit Kafka sowohl sequentiell als auch parallel abarbeiten lassen. Alles gesteuert durch Konfiguration im Kafka, was in Kombination interessante Szenarien ermöglicht.

Ah, jetzt habe ich verstanden was du meinst. Hier könntest du ganz normale EJB benutzen, welche du als Singleton deklarierst:

@Singleton
public class StatusBean {
  private String status;

  @PostConstruct
  void init {
    status = "Ready";
  }
  ...
}```

Wofür brauchst du dann in deinem Anwendungsfall noch einen JavaEE-Server?
Wenn es dir lediglich um das Dependency-Management geht, dann kannst du auch Guice oder Spring (ohne WebMVC) verwenden.
Auch die anderen Building-Blocks wie ORM lassen sich standalone ohne JavaEE-Server verwenden.

Schaue dir mal https://spring.io/ (Spring Boot) an. Da findest du genau das, was du suchst. :slight_smile:

viele Grüße
Steven

@cmrudolph + @StevenHachel : Das ist ja das witzige … ich brauche das ganze nicht. Würde ich einen normalen Service schreiben, würde ich bei public static void main(String...args) anfangen und die Sache wäre gegessen. Allerdings, wie ich im meinem Eingangspost geschrieben habe: Mir steht in der Cloud Umgebung, nur Java EE und Tomcats zur Verfügung.

*** Edit ***
@StevenHachel : Ach … ja Spring Boot wäre der Weg, den ich auch bevorzugen würde.

Dann könntest du doch auch eine “klassische” Spring Anwendung in einem gehosteten Tomcat deployen? Oder vielleicht ist ja auch das für dich interessant: Spring Cloud

Ich hatte erst verstanden, dass du Cloud Features benutzen möchtest, weil du hier die klassische Skalierbarkeit möchtet? Wenn das nicht der Fall ist, ist JEE natürlich maßlos übertrieben, ganz klar.

Ich glaube, ich habe den Abholpunkt immer noch nicht zu 100% gefunden - wahrscheinlich, weil unsere Definitionen von “Cloud” auseinander laufen.
Habe ich es jetzt richtig verstanden, dass du ein Platform-as-a-Service-Produkt einsetzen möchtest und nicht selbst hosten willst?
Ich ging nämlich die ganze Zeit davon aus, dass du das Hosting selbst übernehmen möchtest. Cloud kann in diesem Sinne nämlich auch eine EC2-Instanz (oder eine angepasste EC2-Instanz aus dem AWS Elastic Beanstalk-Katalog) sein, auf der du deine Anwendung installierst.

Wenn du einen Service hast, auf dem du nur die Möglichkeit hast, war oder ear-Dateien zu deployen, würde ich das leichtgewichtigste nehmen (einen Tomcat) und dann keine Servlets installieren.
Dennoch kannst du die Servletspezifikation verwenden, um deine Anwendung zu initialisieren ([japi]ServletContainerInitializer[/japi]) und zu terminieren ([japi]ServletContextListener[/japi]).
Ob da dann Anfragen via HTTP reinkommen, interessiert den Tomcat dann eher weniger.

Ja. Es wird ein PaaS Angebot sein. So unterschiedlich kann man über den selben Begriff denken :).

Das mit Tomcat und Spring werde ich mal ins Auge fassen. Das klingt gut.

Gute Entscheidung. Du glaubst nicht, wie schnell du eine Anwendung mit Anbindung an eine Cloud geschrieben hast. :slight_smile:
Netflix ist ganz groß darin. Die nutzen genau das. :slight_smile:

viel Spaß
Steven

Wenn Du bei der JEE-Welt (wie im Titel) bleiben möchtest, kannst Du Dir auch den Wildfly-Swarm ansehen. Der funktioniert ähnlich gut.

@StevenHachel : Naja … das Gefühl habe ich momentan nicht … aber vielleicht kommt es wenn die ersten Services mal laufen von allein. Bis dahin wird es wohl noch viel Arbeit sein … ich wäre vmtl. jetzt bereits fertig mit einem lauffähigen Prototypen wenn ich es selbst gehostet hätte. Nunja … jede neue Technik bringt etwas Lernoverhead mit sich :). Ist schön zu hören, dass andere es können … somit habe ich Hoffnung.
@Sym : Wildfly-Swarm ist scheinbar relativ neu (2016 nach den Blog Einträgen). Hast du Erfahrung? Kannst du berichten, wie es sich anfühlt, wo es noch hapert usw? Hast du in dem Zusammenhang Erfahrung mit CloudFoundry?

*** Edit ***

Ich werde ein CloudFoundry System (IBM Bluemix) zur Verfügung haben: Ich habe nun auch mal sowas versucht: https://github.com/cloudfoundry/java-buildpack … Allerdings habe ich auch so meine Anwendung nicht zum laufen gebracht. Meine Main Class wurde nicht gefunden. Und das Filesystem kann man auch nicht einsehen, bzw. das deployment zur Recherche downloaden. Das sind die Sachen die ziemlich aufhalten, bis man es einmal hin bekommen hat :).

Jetzt kommen wir natürlich in den bösen, proprietären Bereich, aber kennst du in Bluemix den Message Hub? Der basiert auf Kafka:

https://console.ng.bluemix.net/catalog/services/message-hub

@inv_zim : Ja :slight_smile: Klar kenne ich den … den will ich nutzen … da das aber ursprünglich nicht Thema war, fand ich es nicht erwähnenswert :slight_smile: … und der macht mir grad sowas von Probleme mit der Authentifizierung … was ich im Netz dazu finde scheint nicht zu funktionieren. Das selbe in grün mit MongoDB … irgendwelche Zertifikatsmeldungen im StackTrace … mit Zertifikaten stehe ich ziemlich auf dem Kriegsfuss.
Das ist das, was ich mit LernOverhead meinte … ist aber aktuell nervig, da alles nur schleppend voran geht.

Je mehr du dazu lernst, desto mehr weißt du am Ende auch. :slight_smile: Kann ja nicht schaden, hihi :slight_smile:

Das klingt jetzt nach neuem Thread, vielleicht kennt sich ja hier jemand aus… :wink: