Vom Enterprise-Java-Monolithen zu
Microservices in der Container-Welt
OWL Tech & Innovation Day
26.09.2019
Dirk Weil, GEDOPLAN GmbH
Dirk Weil
GEDOPLAN GmbH, Bielefeld
GEDOPLAN IT Consulting
Consulting, coaching, concepts, reviews, development
GEDOPLAN IT Training & partner
Java, JEE, tools trainings in Berlin, Bielefeld, Köln, on-site
JEE since 1998
Speaker and author
2gedoplan.deVom Enterprise-Java-Monolithen zu Microservices in der Container-Welt
3gedoplan.de
Monolith Microservices
JVM
JEE Server
Web
Shop
Acc
oun
ting
Logi
stics
JVM
Ser-
ver
Web
Shop
Logis
tics
JVM
Ser-
ver
Acc-
oun-
ting
JVM
Ser-
ver
JVM
Ser-
ver
Cata
-log
JVM
Ser-
ver
Or-
der
JVM
Ser-
ver
Pay-
mentStock
JVM
Ser-
ver
Car-
rier
JVM
Ser-
ver
Bil-
ling
JVM
Ser-
ver
Tax
JVM
Ser-
ver
Vom Enterprise-Java-Monolithen zu Microservices in der Container-Welt
JEE
4gedoplan.de
„So neue Sachen kannste mit Java EE nicht machen!“
JS UIREST
LeichtgewichtigMonitoring
Health
Vom Enterprise-Java-Monolithen zu Microservices in der Container-Welt
Der schwergewichtige (?) Application Server
5
Anwendungsklassen
Konfigurationsfiles
(Deployment Descriptors,
Properties, …)
JEE Server
CDI Runtime
JPA Runtime
REST Runtime
Technische Konfiguration *
JRE
build deploy
run* DB-Verbindungen,
Messaging
Security
…
Thin WAR
kleingroß
gedoplan.deVom Enterprise-Java-Monolithen zu Microservices in der Container-Welt
Die leichtgewichtige (?) Alternative: „Micro“ Framework
6
Anwendungsklassen
Konfigurationsfiles *
CDI Runtime
JPA Runtime
REST Runtime
JRE
build
run
* Anwendungsparameter,
DB-Verbindungen,
Messaging
Security
…
Fat JAR
JAR + Dependencies
groß
gedoplan.deVom Enterprise-Java-Monolithen zu Microservices in der Container-Welt
Vergleichanwendung
https://github.com/GEDOPLAN/micro-comparison
REST-Service mit Persistenz
JPA + CDI/Spring + JAX-RS/Spring Web
lauffähig als WAR bzw. Fat JAR oder Docker Image
Implementierungsvarianten
klassisches WAR für WildFly (und andere JEE-Server)
Spring Boot
Quarkus
KumuluzEE
7gedoplan.deVom Enterprise-Java-Monolithen zu Microservices in der Container-Welt
Kandidaten
WildFly 16.0.0
klassischer Application Server
JEE 8 + MicroProfile 2.2
mittels Galleon provisionierbar
Spring Boot 1.5.16
populäre Alternative
zu Java EE
Runtime wird durch Dependencies kombiniert
große Vielfalt an 3rd-Party-Anbindungen
Autokonfiguration
nutzt viele JEE-Anteile
8gedoplan.deVom Enterprise-Java-Monolithen zu Microservices in der Container-Welt
Kandidaten
KumuluzEE
kombiniert Runtime aus
JEE-Dependencies
Jetty, Weld, Jersey, Hibernate, …
Anwendungscode ist 100% Standard-JEE
Quarkus
kombiniert Runtime aus
JEE-Dependencies
spezieller CDI-Container ARC
Subset von CDI 2.0
Optimierung schon zur Build-Zeit
Hot Reloading im Dev-Modus
9gedoplan.deVom Enterprise-Java-Monolithen zu Microservices in der Container-Welt
„Gewicht“: Anwendungscode
z. B. Persistenz
10gedoplan.de
@ApplicationScoped@Transactional(rollbackOn = Exception.class)public class PersonRepository extends SingleIdEntityRepository<Integer, Person> {
public List<Person> findByName(String name) {return findMultiByProperty(Person_.name, name);
}
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)public interface PersonRepository extends CrudRepository<Person, Integer> {
public List<Person> findByName(String name);}
Vom Enterprise-Java-Monolithen zu Microservices in der Container-Welt
„Gewicht“: Anwendungscode
z. B. REST-Endpunkt
11gedoplan.de
@ApplicationScoped@Path("person")public class PersonResource {
@InjectPersonRepository personRepository;
@GET@Produces(MediaType.APPLICATION_JSON)public List<Person> getAll() {
return personRepository.findAll();}
@RestController@RequestMapping("/person")public class PersonResource {
@Autowiredprivate PersonRepository personRepository;
@RequestMappingpublic Iterable<Person> getAll() {
return personRepository.findAll();}
Vom Enterprise-Java-Monolithen zu Microservices in der Container-Welt
„Gewicht“: Build
12gedoplan.de
WAR
Spring Boot
KumuluzEE
Quarkus
0
1
1
1
1
4
7
3
POM-Komplexität
Dependencies PluginsWAR
Spring Boot
KumuluzEE
Quarkus
4,8 s
8,5 s
12,7 s
4,8 s
4,6 s
5,5 s
8,5 s
Build-Zeiten
mvn clean package dito, -Pfatjar
WAR
Spring Boot
KumuluzEE
Quarkus
30.692 kB
28.252 kB
25.192 kB
404 kB
12 kB
12 kB
Größe der Build-Ergebnisse
Thin WAR / Slim JAR Fat JAR
Vom Enterprise-Java-Monolithen zu Microservices in der Container-Welt
„Gewicht“: Laufzeit
13gedoplan.de
0,0 s 1,0 s 2,0 s 3,0 s 4,0 s 5,0 s 6,0 s
WAR
Spring Boot
KumuluzEE
Quarkus
Startzeit
Server Anwendung Reload
0 MB 50 MB 100 MB 150 MB 200 MB 250 MB
WAR
Spring Boot
KumuluzEE
Quarkus
Memory
Non-Heap Heap
Vom Enterprise-Java-Monolithen zu Microservices in der Container-Welt
Test
Arquillian
De-facto-Standard für JEE-Tests
Server Lifecycle, Deployment, Test
komplex
Auswahl und Konfiguration der Zielumgebung
Zusammenstellung des Deployments
Im Demo-Projekt für WildFly und KumuluzEE genutzt
@SpringBootTest: Spring-eigener Test Runner
Server Lifecycle, Test
einfach
@QuarkusTest: Quarkus-Pendent zu @SpringBootTest
14gedoplan.deVom Enterprise-Java-Monolithen zu Microservices in der Container-Welt
Test
15gedoplan.de
WAR
Spring Boot
KumuluzEE
Quarkus
9,3 s19,0 s
9,6 s
31,4 s
12,0 s
Testausführungszeit
Self-contained mit laufendem Server
Vom Enterprise-Java-Monolithen zu Microservices in der Container-Welt
Betriebsmodell
„Server mit Deployment, Server eingebettet –
ist das nicht zukünftig eh egal?“
Container
OS
+ JVM
+ Server?
+ Anwendung
16gedoplan.de
1.168 MB
1.038 MB
1.020 MB
962 MB
328 MB
235 MB
238 MB
231 MB
WAR
Spring Boot
KumuluzEE
Quarkus
Image Size Memory lt. top im Container
Vom Enterprise-Java-Monolithen zu Microservices in der Container-Welt
Health Monitoring, Metrics
MicroProfile Health
https://javaeeblog.wordpress.com/2019/01/27/alles-gesund-
health-checking-mit-microprofile-health/
MicroProfile Metrics
https://javaeeblog.wordpress.com/2019/03/15/wie-laeufts-
denn-so-monitoring-mit-microprofile-metrics/
17gedoplan.deVom Enterprise-Java-Monolithen zu Microservices in der Container-Welt
Fazit
Micro-Frameworks auch für JEE verfügbar
Anwendungscode von JEE und Spring Boot sehr ähnlich
Projekt-Setup für klassische JEE-Anwendung einfacher
aber: Server notwendig
Entwicklungs-Zeiten für JEE und Micro vergleichbar kurz
klassische Deployzeiten vergleichbar mit Hot Reload
Footprint von Micro-Frameworks kleiner
insb. Quarkus durch Build-Time-Optimierung
Testen im klassischen JEE-Umfeld zu kompliziert
Spring Boot und Quarkus richtungsweisend
Server separat oder embedded tritt in den Hintergrund
18gedoplan.deVom Enterprise-Java-Monolithen zu Microservices in der Container-Welt
Fazit
Vom Enterprise-Java-Monolithen zu Microservices in der Container-Welt 19gedoplan.de
„… kannste sehr wohl machen!“
Ausblick
Quarkus (u. a.) bietet
Compile in Maschinencode (GraalVM)
Startzeiten im ms-Bereich
Cloud, ggf. serverless
Reactive Programming
non-blocking
asychron
abstraktes Producer/Consumer-Konzept
20gedoplan.deVom Enterprise-Java-Monolithen zu Microservices in der Container-Welt
More
github.com/GEDOPLAN/micro-comparison
Demo project
www.gedoplan-it-training.de
Trainings in Berlin, Bielefeld, inhouse
neu: JEE Microservice Foundation
neu: Java DevOps: Development und Delivery mit Docker und Kubernetes
www.gedoplan-it-consulting.de
Reviews, Coaching, …Blog
@dirkweil
21gedoplan.deVom Enterprise-Java-Monolithen zu Microservices in der Container-Welt