Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Das ist kein Spielzeug! Das Play!-Framework und Akka für reaktive und skalierbare Web-Anwendungen

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

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

Martin Lehmann

April 29, 2015
Tweet

More Decks by Martin Lehmann

Other Decks in Programming

Transcript

  1. Das ist kein Spielzeug! Play!-Framework und Akka für reaktive und

    skalierbare Web-Anwendungen Martin Lehmann, Dr. Rüdiger Grammes – Java User Group Frankfurt, 29.4.2015
  2. Copyright © Accso GmbH 2 Das Play!-Framework [1] nennt sich

    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
  3. Copyright © Accso GmbH 3 Speaker 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 Martin Lehmann

    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.
  4. Copyright © Accso GmbH 4 Play-Framework Hello JUGF Konzepte in

    Play Anwendungsbeispiel Aktoren mit Akka Fazit Literatur Play-Framework: Überblick
  5. Copyright © Accso GmbH 5 Play-Framework Seit 2007 Aktuell 2.3.8

    (demnächst 3) Web- Framework (Basis: MVC) JVM Open-Source (Apache 2) reactive Typesafe Reactive Platform erweiter- bar
  6. Copyright © Accso GmbH 6 sbt Build System Resource Handling

    View Templates (Scala, HTML) Sonstige Libraries JSON, Security, … Play Core (MVC) Persistence (EBeans oder JPA, h2 Datenbank) Netty (Web- server) Play Application JUnit, Selenium Akka Java oder Scala CoffeeScript / JavaScript CSS / LESS Play-Framework
  7. Copyright © Accso GmbH 7 Play-Framework: Überblick Hello JUGF Konzepte

    in Play Anwendungsbeispiel Aktoren mit Akka Fazit Literatur Hello JUGF
  8. Copyright © Accso GmbH 8 Play-Framework: Überblick Hello JUGF Konzepte

    in Play Anwendungsbeispiel Aktoren mit Akka Fazit Literatur Konzepte in Play
  9. Copyright © Accso GmbH Die Architektur der Web-Anwendung basiert auf

    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
  10. Copyright © Accso GmbH 10 Die Architektur der Web-Anwendung basiert

    auf MVC: View-Templates in HTML & Scala @* hello.scala.html *@ @(name: String, repeat: Int, color: String) @main("Here is the result:") { <ul style="color: @if(color != null) { @color } else { inherited }"> @for(i <- 1 to repeat) { <li>Hello @name!</li> } </ul> <p class="buttons"> <a href="@routes.Application.index">Back to start page</a> </p> } Scala-Code beginnt mit @ Scala-Code beginnt mit @ Wesentliche Elemente: for-Schleife, Iteratoren, if-then-else und Template-Komposition
  11. Copyright © Accso GmbH Die Architektur der Web-Anwendung basiert auf

    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
  12. Copyright © Accso GmbH Die Architektur der Web-Anwendung basiert auf

    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.
  13. Copyright © Accso GmbH Konfiguration und Modularisierung einer Play-Anwendung 13

    Zentrale Konfigurationsdatei ist application.conf Zerlegung und Einbindung anderer Konfigs möglich Modula- risierung einer Play- Anwendung
  14. Copyright © Accso GmbH 14 Entwicklung und Tools: Build, Debug,

    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
  15. Copyright © Accso GmbH Was bringt das? 15 Bis hierhin

    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?
  16. Copyright © Accso GmbH Reactive! Was sind die Anforderungen? Anforderungen

    an Performance: Geringe Antwortzeiten, minimale Latenz, hoher Durchsatz Anforderungen an Skalierbarkeit: steigende Nutzerzahlen, Multi-Core Anforderungen an Verfügbarkeit: 24x7, Failover, hohe Fehlertoleranz Forderungen des Reactive Manifesto: Responsive, Resilient, Elastic, Message-Driven
  17. Copyright © Accso GmbH 17 Angelehnt an: Lutz Huehnken, Typesafe,

    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
  18. Copyright © Accso GmbH Play nutzt Akka „unter der Haube“

    für die asynchrone Abarbeitung von Web-Requests 18 Browser Server Proc. Unit Proc. Unit Proc. Unit Proc. Unit Proc. Unit Proc. Unit
  19. Copyright © Accso GmbH 19 Play-Framework: Überblick Hello JUGF Konzepte

    in Play Anwendungsbeispiel Aktoren mit Akka Fazit Literatur Anwendungsbeispiel
  20. Copyright © Accso GmbH 20 Beispiel: Web-Anwendung zur Entarchivierung von

    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
  21. Copyright © Accso GmbH 21 Archiv mit Blobs Beispiel: Web-Anwendung

    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
  22. Copyright © Accso GmbH 22 Play-Framework: Überblick Hello JUGF Konzepte

    in Play Anwendungsbeispiel Aktoren mit Akka Fazit Literatur Aktoren mit Akka
  23. Copyright © Accso GmbH 23 sbt Build System Resource Handling

    View Templates (Scala, HTML) Sonstige Libraries JSON, Security, … Play Core (MVC) Persistence (EBeans oder JPA, h2 Datenbank) Netty (Web- server) Play Application JUnit, Selenium Akka Java oder Scala CoffeeScript / JavaScript CSS / LESS Akka ist ein fester Bestandteil des Play-Frameworks
  24. Das Aktoren-Modell (Carl Hewitt, 1973) ist ein Modell für nebenläufige

    Berechnungen Copyright © Accso GmbH 24 Aktor Aktor Aktor State State State Aktoren sind die ausführbaren Einheiten Kommunikation über asynchrones Messaging – kein gemeinsamer globaler Zustand! (share nothing) Aktoren können dynamisch weitere Aktoren erzeugen
  25. Akka implementiert das Aktoren-Modell für Java und Scala public class

    Greeting implements Serializable { public final String who; // immutable public Greeting(String who) { this.who = who; } } public class GreetingActor extends UntypedActor { LoggingAdapter log = Logging.getLogger(getContext().system(), this); public void onReceive(Object message) throws Exception { if (message instanceof Greeting) log.info("Hello " + ((Greeting) message).who); } } Aktor ActorSystem system = ActorSystem.create("MySystem"); ActorRef greeter = system.actorOf(Props.create(GreetingActor.class), "greeter"); greeter.tell(new Greeting("Charlie Parker"), ActorRef.noSender());
  26. Aktoren sind hierarchisch in einem Aktoren-System angeordnet. Eltern haften für

    ihre Kinder. Copyright © Accso GmbH 26 Top-Level Aktoren Root-Aktoren (Guardian) Aktor-System (Root Guardian) / /user /a /c /d /b /b1 /system Fehler- Eskalation Escalate Restart Resume Stop Everything is an Actor!
  27. Adressierung: Aktoren kennen sich gegenseitig über Aktoren-Referenzen Copyright © Accso

    GmbH 27 ActorRef sender = context().sender(); ActorRef self = context().self(); ActorRef parent = context().parent(); Iterable<ActorRef> children = context().children(); • Aktoren-Referenz über den Kontext eines Aktors • Aktoren-Referenz als Konstruktor-Argument oder in einer Nachricht übergeben • Aktoren-Referenz über Lookup des Pfads ActorSelection actorSelection = context().actorSelection(path); context().actorSelection("/user/a/a2"); // absoluter Pfad context().actorSelection("../a2"); // relativer Pfad context().actorSelection("../*"); // Wildcard context().actorSelection("akka.tcp://sys@ipadr:port/user/a/a2"); // Remote actorSelection.tell(message, self()); // ggf. mehrere Nachrichten Future<ActorRef> ref = actorSelection.resolveOne(timeout);
  28. Lebenszyklus von Aktoren: Methoden können in der Aktor- Implementierung überschrieben

    werden. Copyright © Accso GmbH 28 Livecycle- Methoden preStart() preRestart() postRestart() postStop()
  29. Aktoren arbeiten Nachrichten aus ihrer Mailbox ab. Copyright © Accso

    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
  30. Anwendungsbeispiel Entarchivierung: Implementierung e. einfachen Task-Frameworks auf Basis von Spring

    und Akka Copyright © Accso GmbH 30 Task-Aktoren Router TaskExecution TaskExecution Actor TaskExecution TaskExecution Actor TaskExecution TaskExecution Actor Task-Aktoren Router TaskExecution TaskExecution Actor TaskExecution TaskExecution Actor Router StatusUpdate Actor StatusUpdate Actor
  31. Copyright © Accso GmbH 31 Scala Code? Wohl eher scary

    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
  32. Copyright © Accso GmbH 32 Play-Framework: Überblick Hello JUGF Konzepte

    in Play Anwendungsbeispiel Aktoren mit Akka Fazit Literatur Fazit
  33. Copyright © Accso GmbH 33 Play-Framework: Überblick Hello JUGF Konzepte

    in Play Anwendungsbeispiel Aktoren mit Akka Fazit Literatur Literatur
  34. Copyright © Accso GmbH 34 Literatur Play Homepage https://www.playframework.com/ Doku

    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>“
  35. Copyright © Accso GmbH 35 Literatur Nicolas Leroux and Sietse

    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
  36. Begeisterung für die anspruchsvollen Aufgaben unserer Kunden Accso – Accelerated

    Solutions GmbH www.accso.de twitter.com/accso Berliner Allee 58 64295 Darmstadt Telefon: +49 (6151) 13029-0 Fax: +49 (6151) 13029-10 Moltkestraße 131 a 50674 Köln Telefon: +49 (221) 630691-0 Fax: +49 (221) 630691-10 Theatinerstraße 11 80333 München Telefon: +49 (89) 71042-2040 Fax: + 49 (89) 71042-2001
  37. Akka Default-Konfiguration im Play-Framework play { akka { akka.loggers =

    ["akka.event.Logging$DefaultLogger", "akka.event.slf4j.Slf4jLogger"] loglevel = WARNING actor { default-dispatcher = { fork-join-executor { parallelism-factor = 1.0 // Anzahl der CPUs parallelism-max = 24 } } } } }