das ist kein spielzeug! play-framework und akka für reaktive und skalierbare web-anwendungen

34
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

Upload: martin-lehmann

Post on 14-Apr-2017

298 views

Category:

Technology


0 download

TRANSCRIPT

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

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

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

Copyright © Accso GmbH4

Play-Framework

Hello JUGF

Konzepte in Play

Anwendungsbeispiel

Aktoren mit Akka

Fazit

Literatur

Play-Framework: Überblick

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

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

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

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

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

Copyright © Accso GmbH7

Play-Framework: Überblick

Hello JUGF

Konzepte in Play

Anwendungsbeispiel

Aktoren mit Akka

Fazit

Literatur

Hello JUGF

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

Copyright © Accso GmbH8

Play-Framework: Überblick

Hello JUGF

Konzepte in Play

Anwendungsbeispiel

Aktoren mit Akka

Fazit

Literatur

Konzepte in Play

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

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

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

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

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

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

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

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.

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

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

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

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

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

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?

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

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

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

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

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

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

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

Copyright © Accso GmbH19

Play-Framework: Überblick

Hello JUGF

Konzepte in Play

Anwendungsbeispiel

Aktoren mit Akka

Fazit

Literatur

Anwendungsbeispiel

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

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

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

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

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

Copyright © Accso GmbH22

Play-Framework: Überblick

Hello JUGF

Konzepte in Play

Anwendungsbeispiel

Aktoren mit Akka

Fazit

Literatur

Aktoren mit Akka

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

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

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

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

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

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());

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

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!

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

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);

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

Lebenszyklus von Aktoren: Methoden können in der Aktor-Implementierung überschrieben werden.

Copyright © Accso GmbH28

Livecycle-Methoden

preStart()preRestart()postRestart()

postStop()

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

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

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

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

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

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

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

Copyright © Accso GmbH32

Play-Framework: Überblick

Hello JUGF

Konzepte in Play

Anwendungsbeispiel

Aktoren mit Akka

Fazit

Literatur

Fazit

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

Copyright © Accso GmbH33

Play-Framework: Überblick

Hello JUGF

Konzepte in Play

Anwendungsbeispiel

Aktoren mit Akka

Fazit

LiteraturLiteratur

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

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>“

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

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

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

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