Das ist kein Spielzeug! Das Play!-Framework und Akka für reaktive und skalierbare Web-Anwendungen
Martin Lehmann, Rüdiger Grammes: „Das ist kein Spielzeug! Das Play!-Framework und Akka für reaktive und skalierbare Web-Anwendungen“.
Java User Group Frankfurt, 29. April 2015
selbst „High Velocity Web Framework for Java and Scala“ und ist gut geeignet für leichtgewichtige, zustandslose Web-Architekturen mit Bedarf an hohe Skalierbarkeit. Es realisiert Web- Anwendungen mit dem MVC-Pattern. Mit Version 2 wurde das Framework in Scala von Grund auf neu entwickelt, ist Teil der Typesafe-Plattform [2] und als Open-Source verfügbar. Eine Nutzung aus Java heraus ist trotzdem weiterhin problemlos möglich, ohne gleich die Scala-Hürde nehmen zu müssen. (Wir konzentrieren uns im Vortrag auf die Java-APIs von Play! und Akka. Tiefergehende Scala-Vorkenntnisse sind also nicht nötig.) Play! orientiert sich in Teilen an anderen Web-Frameworks wie Ruby on Rails oder Grails oder Spring Roo, bringt aber weniger RAD-Funktionalität mit. Unter der Haube kommen bekannte Open-Source-Frameworks (wie beispielsweise Spring) entweder mit oder können über Standard-Schnittstellen (wie beispielsweise Hibernate via JPA) einfach eingebunden werden. Web-Requests behandelt Play über Akka [3], einer Bibliothek für hochgradig parallele und verteilte Anwendungen. Akka lässt sich in der Web-Anwendung auch gut direkt nutzen, um z.B. Backend-Requests hochgradig parallel abzuarbeiten. Wir zeigen, wie eine einfache Play-Anwendung in kurzer Zeit „from scratch“ erstellt werden kann. Außerdem zeigen wir, wie sich Play in ein bewährtes und liebgewonnenes Entwicklungs-Ökosystem (Eclipse, Maven, Hot- Deployment, Debugging), Test (Unit-Testing et al) und Deployment (Play als Runtime? Oder lieber Tomcat?) einbetten lässt. Und für Erweiterungen dienen Module und Plugins: Vorgefertigte Module (z.B. für Security) sind im Play-Repository verfügbar. Sie können aber auch selbst erstellt werden, wenn eine komponentenweise Unterstrukturierung der Anwendung nötig wird. [1] https://www.playframework.com/ [2] https://typesafe.com/platform [3] http://akka.io/ Abstract https://sites.google.com/site/jugffm/home/29-04-2015-das-ist-kein-spielzeug-das-play-- framework-und-akka-fuer-reaktive-und-skalierbare-web-anwendungen
ist Diplom-Informatiker und als Cheftechnologe und Softwarearchitekt bei der Accso – Accelerated Solutions GmbH tätig. Seit Ende der 90er-Jahre arbeitet er in der Softwareentwicklung in diversen Projekten der Individualentwicklung für Kunden verschiedener Branchen. Dr. Rüdiger Grammes ist seit November 2011 als Managing Consultant ebenfalls bei der Accso – Accelerated Solutions GmbH als Softwarearchitekt in verschiedenen Projekten unterwegs. Sie befassen sich seit geraumer Zeit mit den verschiedenen Java-Frameworks für reaktive und verteilte Systeme wie Vert.x, Spring Reactor sowie Play! und Akka.
MVC: routes-Konfiguration und Controller in Java 9 # Routes GET / controllers.HelloController.index() GET /hello controllers.HelloController.sayHello() public class HelloController extends Controller { public static Result index() { return ok( index.render(form(Hello.class)) ); } public static Result sayHello() { Form<Hello> form = form(Hello.class).bindFromRequest(); ... Hello data = form.get(); return ok( hello.render(data.name, data.repeat, data.color) ); } public static class Hello { @Required public String name; @Required @Min(1) @Max(100) public Integer repeat; public String color; } Route von URL zu Controller-Methode Controller-Methode (public, static) Controller-Methode (public, static) Aufruf der View
MVC: Persistenz mit ORM über EBeans (oder JPA) 11 @Entity public class User extends Model { @Id public String email; public String firstName; public String lastName; public String password; public User(String email, String firstName, String lastName, String password) { // ... } public static Finder<String, User> finder = new Finder<String,User>(String.class, User.class); public static User authenticate(String email, String password) { return finder.where(). eq("email", email).eq("password", password).findUnique(); } public static int count() { return finder.findRowCount(); } } Leitet von EBeans-Model-Klasse ab (Hilfsmethoden wie save etc.) Public Attribute werden persistiert, getter/setter werden generiert
MVC: Persistenz mit ORM über EBeans (oder JPA) 12 @Entity public class User extends Model { @Id public String email; public String firstName; public String lastName; public String password; public User(String email, String firstName, String lastName, String password) { // ... } public static Finder<String, User> finder = new Finder<String,User>(String.class, User.class); public static User authenticate(String email, String password) { return finder.where(). eq("email", email).eq("password", password).findUnique(); } public static int count() { return finder.findRowCount(); } } Annotationen nach javax.persistence Annotationen nach javax.persistence Finder-Methoden, Query-API Finder-Methoden, Query-API EBeans ist einfach verwendbar. Nutzt keine Session. Achtung: Play 2.3 wechselt auf JPA, da Ebeans-Projekt inaktiv zu sein scheint.
Test, Hot- Deployment, Produktion, Erweiterung mit Modulen Entwicklung • Integration mit Eclipse, IntelliJ • Hot-Deployment und Debugging problemlos • Tests mit JUnit und Selenium • Build mit sbt, Integration mit Maven möglich - umgebungen Ausführungs- umgebungen • Play • Tomcat oder anderer Servlet-Container, mit https://github.com/play2war/play2-war-plugin/ Produktion • DEV und PROD mode • Konfig-File von außen mitgebbar (zur Unterscheidung umgebungsspezifischer Einstellungen) Module • Zum Beispiel für Authentifizierung & Autorisierung • Vorsicht: Play1-Modulrepository nicht nutzbar • Aktuell 75 Module gelistet auf https://www.playframework.com/documentation/2.3.x/Modules
ist Play nichts besonderes. … Web-Frameworks mit MVC gibt‘s wie Sand am Meer. ... Viele Konzepte gibt‘s anderswo (Grails, Spring Roo, …) so auch. … Warum also wirklich Play?
JAX 2015: „Von Enterprise zu Reactive“ http://de.slideshare.net/lutzh/von-enterprise-zu-reactive Traditionell: Thread per Request Dispatching (n Threads per m Requests) Vorsicht ThreadLocal nicht nutzbar. Blockierende Operationen (z.B. JDBC) blockieren den Thread global. Play ist reactive
Blobs (langläufige Backend-Requests mit viel Postprocessing) Archiv mit Blobs Archiv mit Blobs Browser B) Überwache Auftragsstatus (Fortschritt, Fehler) A) Stelle neuen Entarchivierungsauftrag ein C) Suche nach Aufträgen
zur Entarchivierung von Blobs (langläufige Backend-Requests mit viel Postprocessing) App-Server Filesystem Web-Frontend (für Use-Cases A,B,C) Backend für Entarchivierung + Postprocessing Browser
GmbH 29 Aktor State Aktor State UnboundedMailbox (default) PriorityMailbox Aktor State BoundedMailbox Blockiere Sender Aktoren arbeiten Nachrichten aus ihrer Mailbox ab Reihenfolge und Verhalten hängen von der Mailbox-Implementierung ab Es gibt kein Lookahead – Nachrichten werden immer aus der Mailbox genommen Die Ausführung erfolgt durch einen Dispatcher (z.B. Fork-Join, Thread-Pool) Blockierende und langlaufende Operationen sollten vermieden werden Thread Thread Thread Thread ThreadPool-1 ThreadPool-1 Thread Thread Thread Thread ThreadPool-2 ThreadPool-2
code! package akka.actor.dungeon private[akka] trait DeathWatch abstract class Kill extends AutoReceivedMessage with PossiblyHarmful abstract class PoisonPill extends AutoReceivedMessage with PossiblyHarmful case class Deafen(listener: ActorRef) extends ListenerMessage
zu Play für Java https://www.playframework.com/documentation/2.3.x /JavaHome Play bei Stack Overflow http://stackoverflow.com/questions/tagged/playframe work-2.0 Vorsicht bei der Suche mit Google & Co Suche nach „Play Framework“ liefert meist noch Infos zu Play 1.x -> mit Play 2.x irrelevant. Am besten immer „Play framework 2.x java <SUCHE>“
de Kaper Play for Java February 2014 | 320 pages | B&W ISBN: 9781617290909 Manning Publications http://www.manning.com/leroux/ Yann Simon und Remo Schildmann All Play and No Work Webentwicklung mit dem Play-Framework Java Magazin, 03/2013 bis 05/2013 https://jaxenter.de/java-magazin-3-2013- erschienen-web-apps-mit-play-3733