View
298
Download
0
Category
Preview:
Citation preview
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
Copyright © Accso GmbH4
Play-Framework
Hello JUGF
Konzepte in Play
Anwendungsbeispiel
Aktoren mit Akka
Fazit
Literatur
Play-Framework: Überblick
Copyright © Accso GmbH5
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
Copyright © Accso GmbH6
sbt
Bu
ild S
yste
m
Resource Handling
View Templates(Scala, HTML)
Sonstige Libraries
JSON, Security, …
Play Core(MVC)
Persistence(EBeans oder JPA,
h2 Datenbank)
Netty(Web-server)
Play Application
JUn
it, S
ele
niu
m
Akka
Java
od
er
Scal
a
Co
ffe
eSc
rip
t /
Java
Scri
pt
CSS
/ L
ESS
Play-Framework
Copyright © Accso GmbH7
Play-Framework: Überblick
Hello JUGF
Konzepte in Play
Anwendungsbeispiel
Aktoren mit Akka
Fazit
Literatur
Hello JUGF
Copyright © Accso GmbH8
Play-Framework: Überblick
Hello JUGF
Konzepte in Play
Anwendungsbeispiel
Aktoren mit Akka
Fazit
Literatur
Konzepte in Play
Copyright © Accso GmbH
Die Architektur der Web-Anwendung basiert auf MVC:routes-Konfiguration und Controller in Java
9
# RoutesGET / 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
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-Codebeginnt mit @
Wesentliche Elemente: for-Schleife, Iteratoren, if-then-else und Template-Komposition
Copyright © Accso GmbH
Die Architektur der Web-Anwendung basiert auf MVC:Persistenz mit ORM über EBeans (oder JPA)
11
@Entitypublic class User extends Model {
@Idpublic 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
Copyright © Accso GmbH
Die Architektur der Web-Anwendung basiert auf MVC:Persistenz mit ORM über EBeans (oder JPA)
12
@Entitypublic class User extends Model {
@Idpublic 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.
Copyright © Accso GmbH
Konfiguration und Modularisierung einer Play-Anwendung
13
Zentrale Konfigurationsdateiist application.conf
Zerlegung und Einbindung
anderer Konfigs möglich
Modula-risierung
einer Play-Anwendung
Copyright © Accso GmbH14
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
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
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?
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
Copyright © Accso GmbH17Angelehnt an: Lutz Huehnken, Typesafe, JAX 2015: „Von Enterprise zu Reactive“
http://de.slideshare.net/lutzh/von-enterprise-zu-reactive
Traditionell:Threadper Request
Dispatching(n Threads per m Requests)
VorsichtThreadLocal nicht nutzbar.Blockierende Operationen
(z.B. JDBC) blockieren den Thread global.
Play ist reactive
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
Copyright © Accso GmbH19
Play-Framework: Überblick
Hello JUGF
Konzepte in Play
Anwendungsbeispiel
Aktoren mit Akka
Fazit
Literatur
Anwendungsbeispiel
Copyright © Accso GmbH20
Beispiel: Web-Anwendung zur Entarchivierung von Blobs (langläufige Backend-Requests mit viel Postprocessing)
Archivmit
Blobs
BrowserB) Überwache Auftragsstatus
(Fortschritt, Fehler)
A) Stelle neuen Entarchivierungsauftrag ein
C) Suche nach Aufträgen
Copyright © Accso GmbH21
Archivmit
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ürEntarchivierung +
Postprocessing
Browser
Copyright © Accso GmbH22
Play-Framework: Überblick
Hello JUGF
Konzepte in Play
Anwendungsbeispiel
Aktoren mit Akka
Fazit
Literatur
Aktoren mit Akka
Copyright © Accso GmbH23
sbt
Bu
ild S
yste
m
Resource Handling
View Templates(Scala, HTML)
Sonstige Libraries
JSON, Security, …
Play Core(MVC)
Persistence(EBeans oder JPA,
h2 Datenbank)
Netty(Web-server)
Play Application
JUn
it, S
ele
niu
m
Akka
Java
od
er
Scal
a
Co
ffe
eSc
rip
t /
Java
Scri
pt
CSS
/ L
ESS
Akka ist ein fester Bestandteil des Play-Frameworks
Das Aktoren-Modell (Carl Hewitt, 1973) ist ein Modell für nebenläufige Berechnungen
Copyright © Accso GmbH24
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
Akka implementiert das Aktoren-Modell für Java und Scala
public class Greeting implements Serializable {public final String who; // immutablepublic 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());
Aktoren sind hierarchisch in einem Aktoren-System angeordnet. Eltern haften für ihre Kinder.
Copyright © Accso GmbH26
Top-Level Aktoren
Root-Aktoren(Guardian)
Aktor-System(Root Guardian) /
/user
/a
/c /d
/b
/b1
/systemFehler-
Eskalation
EscalateRestartResume
Stop
Everything isan Actor!
Adressierung: Aktoren kennen sich gegenseitig über Aktoren-Referenzen
Copyright © Accso GmbH27
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 Pfadcontext().actorSelection("../*"); // Wildcardcontext().actorSelection("akka.tcp://sys@ipadr:port/user/a/a2"); // Remote
actorSelection.tell(message, self()); // ggf. mehrere NachrichtenFuture<ActorRef> ref = actorSelection.resolveOne(timeout);
Lebenszyklus von Aktoren: Methoden können in der Aktor-Implementierung überschrieben werden.
Copyright © Accso GmbH28
Livecycle-Methoden
preStart()preRestart()postRestart()
postStop()
Aktoren arbeiten Nachrichten aus ihrer Mailbox ab.
Copyright © Accso GmbH29
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
ThreadThreadThreadPool-1 ThreadThreadThreadPool-2
Anwendungsbeispiel Entarchivierung: Implementierung e. einfachen Task-Frameworks auf Basis von Spring und Akka
Copyright © Accso GmbH30
Task-Aktoren
Ro
ute
r
TaskExecutionActor
TaskExecutionActor
TaskExecutionActor
Task-Aktoren
Ro
ute
r
TaskExecutionActor
TaskExecutionActor
Ro
ute
r
StatusUpdateActor
StatusUpdateActor
Copyright © Accso GmbH31
Scala Code? Wohl eher scary code!
package akka.actor.dungeon
private[akka] trait DeathWatch
abstract class Kill extendsAutoReceivedMessage with PossiblyHarmful
abstract class PoisonPillextends AutoReceivedMessagewith PossiblyHarmful
case class Deafen(listener: ActorRef) extendsListenerMessage
Copyright © Accso GmbH32
Play-Framework: Überblick
Hello JUGF
Konzepte in Play
Anwendungsbeispiel
Aktoren mit Akka
Fazit
Literatur
Fazit
Copyright © Accso GmbH33
Play-Framework: Überblick
Hello JUGF
Konzepte in Play
Anwendungsbeispiel
Aktoren mit Akka
Fazit
LiteraturLiteratur
Copyright © Accso GmbH34
Literatur
Play Homepagehttps://www.playframework.com/
Doku zu Play für Javahttps://www.playframework.com/documentation/2.3.x/JavaHome
Play bei Stack Overflowhttp://stackoverflow.com/questions/tagged/playframework-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>“
Copyright © Accso GmbH35
Literatur
Nicolas Leroux and Sietse de KaperPlay for Java
February 2014 | 320 pages | B&WISBN: 9781617290909Manning Publications
http://www.manning.com/leroux/
Yann Simon und Remo SchildmannAll Play and No WorkWebentwicklung mit dem Play-Framework
Java Magazin, 03/2013 bis 05/2013
https://jaxenter.de/java-magazin-3-2013-erschienen-web-apps-mit-play-3733
Begeisterung für dieanspruchsvollen Aufgaben unserer Kunden
Accso – Accelerated Solutions GmbHwww.accso.detwitter.com/accso
Berliner Allee 5864295 DarmstadtTelefon: +49 (6151) 13029-0Fax: +49 (6151) 13029-10
Moltkestraße 131 a50674 KölnTelefon: +49 (221) 630691-0Fax: +49 (221) 630691-10
Theatinerstraße 1180333 MünchenTelefon: +49 (89) 71042-2040Fax: + 49 (89) 71042-2001
Recommended