Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
Grails - schneller zum Ziel - für Enterprise-Applikationen?
Tobias Kraft, exensio GmbH
2
Agenda
Grails im Überblick
Anforderungen an Enterprise Applikationen
Enterprise Applikationen mit Grails
Wo ist Grails in der Entwicklung schnell?
3
Was ist Grails?
A Full-Stack Web (MVC) Framework
● Install & GO!
● Nahtlose Java Integration, wird auf der Java Virtual Machine (JVM) ausgeführt
● Ursprünglich inspiriert von Ruby on Rails
● Open Source
● Grails Historie
● Projekt-Beginn 2005
● Grails 1.0 (02/2008)
● Grails 2.3.7 (03/2014, aktuelles Release)
● Basiert auf Groovy
4
Aufbau von Grails
5
Schlüsselkonzepte
Der Standard-Weg ist konfiguriert, aber Änderungen sind möglich
● Convention over Configuration (CoC)
● Don’t repeat Yourself (DRY)
● Beispiele
● Aufbau Projekt-Struktur
● DB-Mapping
● Klassennamen
● Logging
● Autowiring
6
Groovy als Basis
● Basiert auf JVM
● Dynamisch typisierte Sprache
● Bietet zusätzliche Features zu Java
def names = ['Berlin Expert Days', 'JUG Saxony Day', 'Berlin Buzz Words'] println names def berlinConfs = names.findAll{ it ==~ /(?i).*Berlin.*/ }.sort() berlinConfs.each { println it } println "number of confs: ${berlinConfs.size()}"
Beispiele
7
Groovy als Basis
● Basiert auf JVM
● Dynamisch typisierte Sprache
● Bietet zusätzliche Features zu Java
def names = ['Berlin Expert Days', 'JUG Saxony Day', 'Berlin Buzz Words'] println names def berlinConfs = names.findAll{ it ==~ /(?i).*Berlin.*/ }.sort() berlinConfs.each { println it } println "number of confs in Berlin: ${berlinConfs.size()}"
Beispiele List names = Arrays.asList("Berlin Expert Days", "JUG Saxony Day", "Berlin Buzz Words"); System.out.println(names); Predicate<String> p = (n) -> n.toString().matches("(?i).*Berlin.*"); Stream berlinConfs = names.stream().filter(p).sorted(); berlinConfs.forEach(n -> System.out.println(n)); System.out.println("number of confs: "+ names.stream().filter(p).count());
8
Einfaches Arbeiten mit Grails am Beispiel von GORM
● Hibernate ist der Standard
● Austausch Persistenzschicht ist möglich
● DB-Operationen erfolgen direkt am Domain-Objekt
● Abfragen einfach und intuitiv
Portlet.findAllByPageAndPortal(‘Home’, portalname)
PortletInst.where{ year(published) == 2014 && right != ‘public’ }
Where-Queries
Dynamic Finders
Portlet.delete() Portlet.save(flush:true)
9
Quo vadis Grails?
● Grails 2.4 (Mai 2014)
● @CompileStatic Integration
● Spring 4.0 Support
● Groovy 2.2 Support
● Grails 3.0 (Ende 2014)
● Gradle als Build System
● Unabhängigkeit vom Servlet Container
● Application Profiles / Micro Services
● Modularisierung / Plugin Platform
http://www.morguefile.com/archive/display/58914
10
Agenda
Grails im Überblick
Anforderungen an Enterprise Applikationen
Enterprise Applikationen mit Grails
Wo ist Grails in der Entwicklung schnell?
11
Anforderungen an Enterprise Applikationen
Eine Auswahl relevanter Kriterien
● Wartbarkeit, Erweiterbarkeit
● Strukturierungsmöglichkeit
● Integration / Datenaustausch
● Verteilte Transaktionen
● Security
● Testbarkeit
● Betrieb und Monitoring
● Verfügbarkeit
● Ausfallsicherheit
● Neue Anforderungen schnell umsetzbar
12
Agenda
Grails im Überblick
Anforderungen an Enterprise Applikationen
Enterprise Applikationen mit Grails
Wo ist Grails in der Entwicklung schnell?
13
Funktionalitäten der Java-Laufzeitumgebung sind verfügbar
● Direkte Integration von Java-Source-Code
● Vorhandene JEE Infrastruktur und KnowHow kann verwendet werden
● Deployment erfolgt über WAR-Datei
● Logging
● Monitoring
• JMX
• App-Server Tools
• Nagios
● Clustering
• Load-Balancing
• Session Replication
http://www.morguefile.com/archive/display/72852
14
Integrations-Szenario für JEE
Application Server
DB
Dokumenten- Management-
System
EJB-Aufruf
grails war ejb ear
dms_if.jar dms_if.jar
dms_ejb.jar
15
Integrations-Szenario für JEE
Aufruf im Service
resources.groovy
16
Nutzung von JNDI-Resourcen
● DB Anbindung
● Mail-Service
grails { mail { jndiName = 'TW_DEMO_MAIL_SESSION' disabled = false } mail.default.from = '[email protected]' }
dataSource { jndiName = 'TW_DEMO_DS' dialect = 'org.hibernate.dialect.Oracle10gDialect' driverClassName = 'oracle.jdbc.OracleDriver' dbCreate = 'create-drop' }
17
Security
● Spring-Security für Authentifizierung und Autorisierung
Features
● Authentifizierungsketten
● Windows-Authentifizierung
● Authentifizierungsmechanismen für Twitter, Facebook und diverse andere Provider
● AD- / LDAP-Anbindungen
● Hierarchische Rollen
● Einhängen von kundenspezifischen Mechanismen / Erweiterungen
● Switch-User Mechanismus
18
Clusterszenario für Produktivbetrieb
Hardware Load-Balancer
Apache Web Server 1
Tomcat 1 (Weblogic, …)
Tomcat 2 (Weblogic, …)
Server 1 Apache Web Server 2
Tomcat 3 (Weblogic, …)
Tomcat 4 (Weblogic, …)
Server 2
Database (Oracle, MySQL, …)
Server 3
Database Server 4
Replication
19
Verhalten von Grails in „großen“ Projekten
Keine negativen Erfahrungen bei Applikationen mit
● mehr als 100 Domain-Klassen
● mehr als 20 GB großen Datenbanken
● über 500 PT Aufwand
● dem Anbinden mehrerer DB‘s in einer Applikation
● der Verwendung von mehreren eigenen Plugins
Größere Vorhaben nach fachlichen Gesichtspunkten schneiden und Teile über den Plugin-Mechanismus auszulagern.
20
Agenda
Grails im Überblick
Anforderungen an Enterprise Applikationen
Enterprise Applikationen mit Grails
Wo ist Grails in der Entwicklung schnell?
21
Plugins
● In sich abgeschlossenes Bundle von Funktionalitäten
● Wiederverwendbarkeit
● Modularisierung / Kapselung
● Kern-Plugins: hibernate, resources, jquery, …
● Plugins können selbst entwickelt werden
● Grails Plugin-Repository mit ca. 1000 Plugins für
● Frontend
● Integration von Drittsystemen
● Fachliche Funktionalitäten
● Persistenzschicht
● Nichtfunktionale Erweiterungen
22
Scaffolding
● Generierung von CRUD Funktionalitäten
● Unterscheidung zwischen
● Dynamic
● Static
● Layout kann angepasst werden
● Anwendungsszenarien ● Rapid Prototyping
● Ausgangsbasis
● Produktivbetrieb
grails generate-controller Project
23
Einfaches Scaffolding Beispiel
24
Testing
● „Out of the box“ Testing
● Test-Klassen werden bei create-* Kommandos miterzeugt
● Unterstützte Testarten
● Unit
● Integration
● Functional
● Viele Plugins für Testframeworks und Testdatengenerierung
● Fixtures, Build-Testdata
● Jasmine, jsUnit, Webtest
● Continuous Integration
25
Testing mit Spock
● Bestandteil von Grails seit Version 2.3
● Testframework für Groovy und Java
● Ausdrucksstarke DSL für Spezifizierung der Tests
● Ausprobieren mit Spock Web Console
http://meetspock.appspot.com/
● Unterstützung für
● Data Driven Testing
● Interaction Based Testing
(1..3) * tweetService.message("hello")
26
Testing mit Spock
27
Backend Integration einfach gemacht
● JSON-Slurper
● File-Import
def jsonText = '''{ "message": { "header": { "from": " [email protected]"}, "body": "Hello JUG Saxony Day." } }''' def mail = new JsonSlurper().parseText(jsonText) assert mail.message.body == "Hello JUG Saxony Day."
new File('/data/').eachFileMatch( ~".*xml" ) { f -> if ( f.lastModified() <= yesterday ) { def rootNode = new XmlSlurper().parse(f) assert rootNode.four.text() == "My text!" …. } }
28
Integration von Drittsystemen über Plugins eine Auswahl
29
Performance Groovy
What makes Groovy groovy? — JAX London 2013 by Guillaume Laforge
30
Was ist cool und schnell an Grails?
http://www.morguefile.com/archive/display/196579
● Herunterladen und loslegen
● Kompletter Java-Stack ist verfügbar
● Groovy macht vieles kürzer und schneller
● Zahlreiche Plugins steigern die Produktivität
● Full-Stack Unterstützung / Continuous Integration ● Testing
● Coverage
● Build
31
Was sollte beachtet werden?
http://www.morguefile.com/archive/display/28600
● Strukturierung Code ● Schichtentrennung
● Keine schwergewichtige Taglibs
● Logik in Services
● Keine Vernachlässigung der Tests
● Zielplattform
● Version-Upgrades
● Vorsicht bei „0“-er Versionen (2.3.0,…)
32
Fazit ● Grails bringt Basis zur Umsetzung von
Enterprise Applikationen mit
● Tragfähigkeit für große Applikationen ist in der Praxis erprobt
● Einiges geht schneller und einfacher wie in der klassischen Java-Welt
● Die Java-Welt kann komplett mit verwendet werden
Fragen?
Vielen Dank!
http://blog.exensio.de
@tokraft
Partner: