Grails - schneller zum Ziel für Enterprise-Applikationen? Tobias Kraft, exensio GmbH Agenda Grails im Überblick Anforderungen an Enterprise Applikationen Enterprise Applikationen mit Grails Wo ist Grails in der Entwicklung schnell? 2 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 3 Aufbau von Grails 4 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 5 Groovy als Basis ● Basiert auf JVM ● Dynamisch typisierte Sprache ● Bietet zusätzliche Features zu Java Beispiele 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()}" 6 Groovy als Basis ● Basiert auf JVM ● Dynamisch typisierte Sprache ● Bietet zusätzliche Features zu Java ListBeispiele names = Arrays.asList("Berlin Expert Days", "JUG Saxony Day", "Berlin Buzz Words"); def names = ['Berlin Expert Days', 'JUG Saxony Day', 'Berlin Buzz Words'] System.out.println(names); println names Predicate<String> p = (n) -> n.toString().matches("(?i).*Berlin.*"); def berlinConfs = names.findAll{ it ==~ /(?i).*Berlin.*/ }.sort() Stream berlinConfs = names.stream().filter(p).sorted(); berlinConfs.each { println it } berlinConfs.forEach(n -> System.out.println(n)); println "number of confs in Berlin: ${berlinConfs.size()}" System.out.println("number of confs: "+ names.stream().filter(p).count()); 7 Einfaches Arbeiten mit Grails am Beispiel von GORM ● Hibernate ist der Standard ● Austausch Persistenzschicht ist möglich ● DB-Operationen erfolgen direkt am Domain-Objekt Portlet.delete() Portlet.save(flush:true) ● Abfragen einfach und intuitiv Dynamic Finders Portlet.findAllByPageAndPortal(‘Home’, portalname) Where-Queries PortletInst.where{ year(published) == 2014 && right != ‘public’ } 8 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 9 Agenda Grails im Überblick Anforderungen an Enterprise Applikationen Enterprise Applikationen mit Grails Wo ist Grails in der Entwicklung schnell? 10 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 11 Agenda Grails im Überblick Anforderungen an Enterprise Applikationen Enterprise Applikationen mit Grails Wo ist Grails in der Entwicklung schnell? 12 Funktionalitäten der Java-Laufzeitumgebung sind verfügbar ● Direkte Integration von Java-SourceCode ● 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 13 Integrations-Szenario für JEE Application Server grails war ejb ear dms_if.jar dms_if.jar EJB-Aufruf dms_ejb.jar DB DokumentenManagementSystem 14 Integrations-Szenario für JEE resources.groovy Aufruf im Service 15 Nutzung von JNDI-Resourcen ● DB Anbindung dataSource { jndiName = 'TW_DEMO_DS' dialect = 'org.hibernate.dialect.Oracle10gDialect' driverClassName = 'oracle.jdbc.OracleDriver' dbCreate = 'create-drop' } ● Mail-Service grails { mail { jndiName = 'TW_DEMO_MAIL_SESSION' disabled = false } mail.default.from = '[email protected]' } 16 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 17 Clusterszenario für Produktivbetrieb Hardware Load-Balancer Apache Web Server 1 Tomcat 1 (Weblogic, …) Server 1 Apache Web Server 2 Tomcat 2 (Weblogic, …) Tomcat 3 (Weblogic, …) Database Server 2 Tomcat 4 (Weblogic, …) Server 3 (Oracle, MySQL, …) Replication Server 4 Database 18 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. 19 Agenda Grails im Überblick Anforderungen an Enterprise Applikationen Enterprise Applikationen mit Grails Wo ist Grails in der Entwicklung schnell? 20 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 21 Scaffolding ● Generierung von CRUD Funktionalitäten ● Unterscheidung zwischen ● Dynamic ● Static grails generate-controller Project ● Layout kann angepasst werden ● Anwendungsszenarien ● Rapid Prototyping ● Ausgangsbasis ● Produktivbetrieb 22 Einfaches Scaffolding Beispiel 23 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 24 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") 25 Testing mit Spock 26 Backend Integration einfach gemacht ● JSON-Slurper 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." ● File-Import new File('/data/').eachFileMatch( ~".*xml" ) { f -> if ( f.lastModified() <= yesterday ) { def rootNode = new XmlSlurper().parse(f) assert rootNode.four.text() == "My text!" …. } } 27 Integration von Drittsystemen über Plugins eine Auswahl 28 Performance Groovy What makes Groovy groovy? — JAX London 2013 by Guillaume Laforge 29 Was ist cool und schnell an Grails? ● ● ● ● ● 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 30 http://www.morguefile.com/archive/display/196579 Was sollte beachtet werden? ● 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,…) 31 http://www.morguefile.com/archive/display/28600 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 32 Fragen? Vielen Dank! http://blog.exensio.de @tokraft Partner: