Rapid Application Development mit JHipster - DOAG
←
→
Transkription von Seiteninhalten
Wenn Ihr Browser die Seite nicht korrekt rendert, bitte, lesen Sie den Inhalt der Seite unten
Rapid Application Development mit JHipster Frederik Hahne, WPS Management GmbH JHipster [1] ist eine Full-Stack-Entwicklungsplattform, um moderne Webanwendungen zu generieren, zu entwickeln und zu betreiben. Zu Beginn wurden nur AngularJS als Frontend- und Spring Boot als Backendtech- nologie unterstützt und es wurde via Command Line Interface (CLI) bedient. Inzwischen kann eine komplette Anwendung mit einer domänenspezifischen Sprache definiert und erzeugt werden. Durch das Konzept der Blueprints werden auch weitere Backends wie Micronaut, Quarkus oder NodeJS unterstützt. In diesem Artikel werden wir eine Anwendung auf Basis von Micronaut [2] erzeugen und auf Heroku deployen. Was ist JHipster? de das Modulsystem um sogenannte Blueprints erweitert [4]. Ein Ursprünglich war JHipster ein Yeoman-Generator [3], um Weban- Blueprint kann nicht nur bestehende Anwendungen über definier- wendungen schnell und einfach erstellen (Scaffolding) zu können. te Erweiterungspunkte modifizieren, sondern auch komplette Teile Im Laufe der Zeit wurden weitere Funktionen hinzugefügt, sodass austauschen oder ändern. Beispielsweise tauscht der Kotlin-Blue- JHipster den kompletten Lebenszyklus einer Anwendung von Ent- print den kompletten Java-Code durch Kotlin aus. Durch Blueprints wicklung, Testing über Deployment bis Monitoring unterstützt. Mit ist es nun auch möglich, von der bisher festen Wahl von Spring Boot Version 3 hielten Module Einzug, sodass generierte Anwendungen und Angular abzuweichen. In diesem Artikel werden wir daher eine um neue Funktionen erweitert werden konnten. Seit Version 5 wur- Anwendung mit Micronaut entwickeln. npm install -g generator-jhipster@6.10.1 generator-jhipster-micronaut@0.4.0 Listing 1: JHipster-Installation via NPM Java aktuell 01/21 55
Abbildung 1: mhipster CLI (© Frederik Hahne) Installation Beispielanwendung Um JHipster zu verwenden, sollten folgende Tools installiert sein: Im Folgenden betrachten wird eine fiktive Anwendung für einen Al- • Java 11 (Java 8 wird weiterhin unterstützt) penverein, der eine Software bauen möchte, in der Mitglieder Wan- • Node 12 derungen mit einer kurzen Beschreibung, einem Bild und weiteren • Git (optional) Informationen hinterlegen können. Um den Zugriff einzuschränken, • Docker & Docker Compose (optional) sollen die Benutzenden zentral verwaltet werden, daher wird als Die Installation erfolgt via NPM (siehe Listing 1). application { Nach der Installation kann das CLI mit dem Befehl jhipster (oder config { baseName hike mhipster für Micronaut) ausgeführt werden. Wenn die Installation applicationType monolith erfolgreich war, sollte bei Eingabe das CLI angezeigt werden (siehe Ab- authenticationType oauth2 bildung 1). packageName com.github.atomfrede.example.hike prodDatabaseType postgresql testFrameworks [protractor] JHipster Domain Language } entities * Obwohl alle Funktionen von JHipster durch das CLI bedient werden } können, ist dies, insbesondere um Entitäten zu erstellen, nicht son- derlich komfortabel. Mithilfe der JDL [5] kann die komplette Konfigu- entity HikingLocation { name String required ration einer Anwendung und aller Entitäten sowie der Deployment- description String required Optionen in einer Datei definiert werden. } entity Hike { name String required JDL definiert für alle Optionen einen Standardwert, sodass es date LocalDate required ausreicht, die Abweichungen vom Standard explizit zu definieren. description TextBlob required photo ImageBlob required Die Konfiguration (siehe Listing 2) verwendet alle Standardwerte type Difficulty required und überschreibt nur den Anwendungsnamen und den Paketna- length Integer required } men. In diesem Fall würde zum Beispiel eine monolithische An- enum Difficulty { wendung mit MySQL, JW-Autorisierung und Angular als Frontend EASZ, erzeugt werden. MEDIUM, HARD, ULTRA } application { relationship OneToOne { config { Hike{startLocation(name)} to HikingLocation, baseName hike Hike{destination(name)} to HikingLocation packageName com.githu.atomfrede.example.hike } } paginate Hike with pagination } paginate HikingLocation with pagination Listing 2: Minimale app.jdl Listing 3: Vollständige app.jdl 56 iii iii iii www.ijug.eu iii
Abbildung 2: Startseite der generierten Anwendung (© Frederik Hahne) authenticationType oauth2 verwendet, sodass jeder OpenID- Eine vollständige Liste aller Optionen und Funktionen der JHipster- Connect-kompatible Autorisierungsserver benutzt werden kann. Domain-Language kann online nachgelesen werden [5]. Neben dem Als Datenbank soll PostgreSQL verwendet werden. Die vollständi- Online-Tool JDL Studio existieren Plug-ins für Eclipse und Visual Stu- ge JDL ist in Listing 3 dargestellt. Die Konfiguration überschreibt die dio Code, sodass ein komfortables Erstellen und Editieren (Syntaxher- Datenbank, die Authentifizierungsmethode und fügt Protractor als vorhebung, Validierung und Vervollständigung) einer JDL möglich ist. zusätzliches Testframework hinzu. Es werden zwei Entitäten mit ih- ren Feldern und Validierungsregeln definiert sowie die Relation zwi- Im Folgenden werden wir das definierte Modell verwenden, um eine schen einer Wanderung (Hike) zu Start- und Zielort (HikingLocation). komplette Webanwendung zu erzeugen. Abbildung 3: Anwendungsmetriken (© Frederik Hahne) Java aktuell 01/21 57
Anwendung erzeugen liquibase: Durch Ausführen des Befehls mhipster import-jdl app.jdl wird datasources: der Generierungsprozess angestoßen. Es werden eine Menge Da- default: async: true teien sowohl für das Backend als auch für das Frontend erzeugt. change-log: classpath:config/liquibase/master.xml Wenn der Prozess erfolgreich beendet wurde, kann die Anwendung contexts: dev, faker gestartet werden. Listing 4: Konfiguration der Liquibase-Kontexte (application-dev.yml) Hierzu muss zuerst der Authentifizierungsserver gestartet werden. JHipster unterstützt Keycloak [6] und Okta [7] out of the box, es kann aber jeder OpenID-Connect-Provider verwendet werden. tionsparameter der Anwendung einzusehen und die Log-Level zu ändern (siehe Abbildung 3). JHipster stellt für alle benötigten externen Komponenten, wie zum Beispiel Datenbanken oder Monitoringsysteme, passende Docker- Unter Entities können Orte und Wanderungen angelegt werden (sie- Compose-Skripte [8] für die lokale Entwicklung bereit, sodass durch he Abbildung 4). Die vorhandenen Daten werden durch einen spezi- Eingabe von docker-compose -f src/main/docker/keycloak. ellen Liquibase-Context durch Faker.js erzeugt. Um die Fake-Daten yml up -d eine mit Benutzenden, Realms und Anwendungen konfi- nicht zu generieren, muss die Konfiguration in src/main/resources/ gurierte Keycloak-Instanz gestartet werden kann. application-dev.yml angepasst werden und der faker-Context ent- fernt werden (siehe Listing 4). Sobald Keycloak hochgefahren ist, kann die Anwendung mit Maven (./mvnw) gestartet werden. Die laufende Anwendung ist unter Da wir Protractor als zusätzliches Testframework konfiguriert ha- localhost:8080 erreichbar (siehe Abbildung 2). ben, werden sowohl für die Anwendung (Login, Administration) als auch für jede Entität End-to-End-Tests generiert. Mit npm run e2e Die Anwendung läuft im dev-Modus. Daher werden die Daten in ei- können diese gestartet werden, die Anwendung sollte dabei natür- ner lokalen H2-Datenbank gespeichert, das Frontend ist nicht opti- lich weiterhin laufen. miert und durch Verwendung des Micronaut-Maven-Plug-ins wird Hot Reloading des Backends unterstützt. In Kombination mit einem Angular, React oder Vue? lokalen Webpack-Server (npm start) sind Änderungen fast sofort Falls man React bevorzugt, kann es durch Hinzufügen der Option im Browser sicht- und testbar [9]. clientFramework react ergänzt werden (siehe Listing 5). Ein Klick auf Account > Sign in leitet weiter zu Keycloak. Mit den Die Verwendung von Vue.js ist momentan noch komplizierter, da Zugangsdaten admin/admin ist eine Anmeldung als Administrator Vue.js ebenfalls ein Blueprint und die Kompatibilität nicht notwen- möglich. Um sich als normaler Benutzender ohne Administrations- digerweise gegeben ist. Daher wird Vue.js mit JHipster 7 in den berechtigungen anzumelden, können die Zugangsdaten user/user Hauptgenerator integriert. Wer dennoch Micronaut und Vue.js kom- verwendet werden. binieren möchte, kann das auch schon heute tun. Zuerst muss der Vue.js Blueprint mit npm install -g generatorjhipster-vuejs Unter Administration finden sich verschiedene Verwaltungsoberflä- installiert werden. Die JDL muss dann unter Angabe aller Blueprints chen, um Metriken einzusehen, den Health-Status und Konfigura- mit JHipster-CLI importiert werden (siehe Listing 6). Abbildung 4: Entitäten (© Frederik Hahne) 58 iii iii iii www.ijug.eu iii
application { ment via Git in der Regel schneller ist, muss dafür der Source config { Code auf einen Heroku-Server geladen werden. Das ist nicht in baseName hike applicationType monolith jedem Fall möglich, daher kann auch nur das fertige JAR hochge- authenticationType oauth2 laden werden. Wir verwenden Git. clientFramework react packageName com.github.atomfrede.example.hike 4. Which Java version would you like to use to build and run your prodDatabaseType postgresql app? Falls es keinen Grund gibt, eine andere Version zu verwen- testFrameworks [protractor] den, kann hier der Standardwert (11) verwendet werden. } } 5. You are using OAuth 2.0. Do you want to use Okta as your identi- ty provider? Da wir uns nicht um den Betrieb eines separaten Key- Listing 5: app.jdl cloak-Servers kümmern möchten, wählen wir hier die Option Okta („Yes, provision the Okta add-on“), um automatisch zu konfigurieren. 6. Login (valid e-mail) for the JHipster Admin user – Dies ist der jhipster import-jdl app.jdl –blueprints micronaut,vuejs Login für den Administrator und muss eine valide E-Mail-Adres- se sein. Zum Beispiel max@jhipster.tech. Listing 6: Verwendung mehrerer Blueprints 7. Initial password for the JHipster Admin user – Das initiale(!) Passwort für den Administrator. Es muss den Richtlinien von Okta genügen und nach dem ersten Login geändert werden. Auf geht es in die Cloud 8. Die Abfrage, ob die pom.xml überschrieben werden soll, kann mit Bisher wurde die Anwendung im dev-Profil ausgeführt, das für die Ja beantwortet werden. Entwicklung optimiert ist. Eine Anwendung im dev-Profil zu de- ployen, ist allerdings keine gute Idee, da zum Beispiel das Logging Der Build- und Deployment-Prozess kann einige Zeit dauern. So- sehr ausführlich ist und JavaScript-Ressourcen nicht optimiert sind. bald er erfolgreich abgeschlossen wurde, kann die Anwendung Dadurch sind die Ladezeiten für die Benutzenden unnötig hoch. durch den Befehl heroku open im Browser geöffnet werden. Man Entsprechend sieht auch der Lighthouse-Report (siehe Abbildung 5) kann sich nun mit den zuvor vergebenen Zugangsdaten anmel- schlecht aus. Es werden insgesamt knapp 3,3 MB JavaScript an den den und wird aufgefordert, ein neues Passwort zu vergeben und Client ausgeliefert. eine Sicherheitsfrage auszuwählen. Danach sollte man wieder auf die Startseite der JHipster-Anwendung geleitet werden (siehe Um die Anwendung für Produktion zu bauen, muss der Build mit dem Abbildung 6). entsprechenden Profil gestartet werden: ./mvnw verify -Pprod. Durch die Optimierung des Frontends sind die Ergebnisse des Light- JHipster unterstützt verschiedene Cloud-Provider (zum Beispiel house-Reports nun sehr gut (siehe Abbildung 7). Es werden nur noch Azure oder GCP). In diesem Beispiel verwenden wir Heroku [10], knapp 280 kB JavaScript übertragen, wobei der größte Teil davon um unsere Anwendung in der Cloud zu betreiben. Heroku ist eine durch Angular verbraucht wird. JHipster legt Wert auf gute und si- Platform-as-a-Service (PaaS), sodass das Verwalten der eigentli- chere Standardkonfiguration, sodass auch ein Test auf übliche Secu- chen Infrastruktur nahezu nicht nötig ist. Dadurch ist die Verwen- rity Header in der Bestnote A resultiert (siehe Abbildung 8). dung sehr einfach. Ausblick auf JHipster 7 JHipster provisioniert alle benötigten Add-ons in Abhängigkeit von Das mit Version 5 eingeführte Konzept von Blueprints wurde mit der gewählten Konfiguration. Es werden nur kostenfreie Optionen der aktuellen Version 6 weiter verfeinert und führte zu einem regen gewählt und die sogenannten „Free Dynos“ verwendet. Hierdurch Interesse von weiteren Communities und Firmen. Inzwischen gibt ist die Performance eingeschränkt, kann aber sehr schnell seine An- es neben Micronaut-Implementierungen auch welche für Quarkus, wendung in die Cloud bringen, beispielsweise um diese testen zu NodeJS und .Net. Es werden noch nicht alle Optionen des Hauptge- können. nerators unterstützt, aber die meistbenutzten Optionen werden von allen Blueprints unterstützt. Um den Heroku-Subgenerator verwenden zu können, muss zu- nächst das Heroku-CLI installiert und konfiguriert sein. Obwohl Mit der kommenden Version 7 hält Vue.js Einzug in den Hauptgene- JHipster keine kostenpflichtigen Add-ons provisioniert, muss der rator, sodass hier die Integration und Kompatibilität zu unterschied- verwendete Heroku-Account durch das Hinzufügen einer Kreditkar- lichen Optionen besser gewährleistet werden kann. Um es den te zunächst verifiziert werden. Benutzenden einfacher zu ermöglichen, das Design des Frontends zu verändern, werden mindestens die Administrationsoberflächen Sind alle Vorbereitungen abgeschlossen, kann durch den Befehl in ein separates Projekt ausgelagert und nicht mehr Teil des gene- mhipster heroku die Konfiguration gestartet werden. Der Genera- rierten Codes sein. Das sogenannte JHipster-Control-Center funkti- tor erfordert die Eingabe von weiteren Parametern: oniert dabei ähnlich wie der Spring 1. Name to deploy as – Name der Anwendung. Kann in der Regel Boot Admin [11], wird aber zum Beispiel auch mit Quarkus- oder auf dem Standardwert belassen werden. Micronaut-Anwendungen funktionieren. Protractor als End-to-End- 2. On which region do you want to deploy? Hier sollte EU ausge- Testingframework wird durch das modernere Cypress ersetzt. Cy- wählt werden. press-Tests sind einfacher zu warten. Außerdem arbeitet Cypress 3. Which type of deployment do you want? Während das Deploy- besser mit Vue.js und React zusammen. Java aktuell 01/21 59
Abbildung 5: Lighthouse-Report (dev-Profil) (© Frederik Hahne) Abbildung 6: Nach der Anmeldung mit Okta (© Frederik Hahne) Seit Sommer 2020 ist das Prettier-Plug-in for Java [12] im Beta- Prettier formatieren, sodass keine unterschiedlichen Tools für Fron- Status und im Einsatz. JHipster 7 wird dann auch Java-Code mit tend- und Backend-Code mehr benötigt werden. 60 iii iii iii www.ijug.eu iii
Abbildung 7: Lighthouse-Report (© Frederik Hahne) [4] https://www.jhipster.tech/modules/creating-a-blueprint/ [5] https://www.jhipster.tech/jdl/ [6] https://www.keycloak.org/ [7] https://www.okta.com/ [8] https://docs.docker.com/compose/ [9] https://www.jhipster.tech/development/ [10] https://www.jhipster.tech/heroku/ Abbildung 8: Security-Headers-Report [11] https://github.com/codecentric/spring-boot-admin [12] https://github.com/jhipster/prettier-java [13] https://www.youtube.com/watch?v=Gg5CYoBdpVo Fazit [14] https://dev.to/antonioortizpola/separating-the-jhipster-layout- Mithilfe von JHipster konnte das Grundgerüst einer produktions- from-a-custom-ui-implementation-55i8 reifen Webanwendung aufgesetzt werden. Die Datenstruktur und die Bedienung der Anwendung konnten mit der erzeugten Oberflä- che direkt getestet werden. Der sichere Betrieb der Anwendung ist durch sinnvolle Standardkonfigurationen sichergestellt. Der Work- flow mit Maven/Gradle und Webpack ermöglicht es, schnell neue Funktionen zu entwickeln und in Produktion zu bringen. Natürlich ist die erzeugte UI nicht ausreichend, um von Endnutzern gerne verwendet zu werden. Um weiterhin JHipster aktualisieren zu können, sollte der generierte Code nach Möglichkeit nicht verändert werden. Hier bietet sich die Verwendung des sogenannten Side-by- Side Ansatzes [13] [14] an. Dadurch kann der generierte Code um Frederik Hahne Funktionen erweitert werden, ohne dass generierter Code verändert WPS Management GmbH werden muss. frederik.hahne@wps-management.de JHipster bietet somit eine gute Möglichkeit, den „langweiligen“ Frederik Hahne arbeitet als Software-Entwickler bei der WPS Teil einer modernen Webanwendung generieren zu lassen, sodass Management GmbH in Paderborn an der offenen B2B-Integra- tionsplattform wescale (https://wescale.com). Er ist Organisator man sich als Entwickelnder auf die eigentliche Business-Logik der JUG Paderborn und hat in Paderborn die lokale Devoxx- konzentrieren kann. 4Kids-Gruppe ins Leben gerufen. Seit 2015 ist er Mitglied des JHipster-Core-Teams und hat hier neben dem Gradle-Support Quellen in letzter Zeit vor allem am Neo4j-, Micronaut- und Heroku- Support gearbeitet. Er twittert unter @atomfrede und bloggt [1] https://jhipster.tech gelegentlich auf https://atomfrede.gitlab.io. [2] https://micronaut.io/ [3] https://yeoman.io/ Java aktuell 01/21 61
Sie können auch lesen