?
for help
Entscheidend: Geringe Komplexität/Aufwand sowie geringe Größe
Sinatra-inspiriert
Minimaler Boilerplate
Ausdrucksstärke
Standalone (Jetty 9)
Java 8 & Kotlin
zusätzliche Spark-DSL unter Kotlin
2.7.1 (Nov. 2017), APL2
Start: ~Feb. 2013
http://sparkjava.com/
build.gradle
apply plugin: 'java'
apply plugin: 'application'
repositories {
jcenter()
}
dependencies {
mainClassName = 'bentolor.HelloSpark'
compile 'com.sparkjava:spark-core:2.5'
}
build.gradle
package bentolor.sparkjava;
import static spark.Spark.*;
public class HelloWorld {
public static void main(String[] args) {
get("/hello", "text/plain", (req, res) -> "Hello World!");
get("/greet/:name", "text/plain",
(req, res) -> "Hello "+req.params("name")+"!");
}
}
Elegant & Minimalistisch
Sinatra-inspiriert. Deklarativ.
Strukturierung: Routen, Filter, Transformer,
optional Template Engines – That's it!
Jetty 9, slf4j
CoC
MVC
Stateless
Full-Stack
Hibernate, Guice, Jackson,
Flyway, Ehcache, …
Nicht wirklich „Micro“
6.2.2 (Jan. 2018), APL2
Start: Juli 2012
http://www.ninjaframework.org/
← Immer: controllers
← Guice Dependency Injection
← Immer: Result
← /GroceryListController/index.ftl.html
← Request Body
geparsed via Content-Type
← URL Parameter
← Utility Methoden für Result
Full Stack & MVC
Umfassende Konventionen
Play!-inspired
Client-side Session
daher einfache Skalierbarkeit
Jetty 9, Guice, Guava, Logback, Jackson,
Woodstox, 6x commons-*, joda-time, ehcache,
memcached, flyway, freemarker, hibernate, prettytime, slf4j
Sehr umfassend.
Kombiniert viele etablierte Frameworks.
Architektur sehr stark vorgegeben. Wenig Flexibilität / Modularität
Umgehen von Detailproblemen durch monolithischen Ansatz teils schwer
Von Verbreitung eher Nische gegenüber Dropwizard/Spring Boot/Play!
var myApp = angular.module('myApp', ['ng-admin']);
myApp.config(['NgAdminConfigurationProvider',
function (NgAdminConfigurationProvider) {
var nga = NgAdminConfigurationProvider;
var admin = nga.application('My Grocery Lists');
var configureFields = function (view) {
return view.fields([
nga.field('id').editable(false),
nga.field('comment'),
nga.field('settled', 'boolean'),
nga.field('date', 'date'),
nga.field('shoppingItems', 'embedded_list')
.targetFields([
nga.field('quantity', 'number'),
nga.field('unit', 'choice').choices([
{value: 'pcs', label: 'pieces'},
{value: 'kg', label: 'kilogram'},
{value: 'g', label: 'gram'},
{value: 'l', label: 'litre'}
]),
nga.field('name', 'string')
])
]);
};
// lists entity
var list = nga.entity('list');
list.listView()
.fields([
nga.field('comment'),
nga.field('settled', 'boolean'),
nga.field('date', 'date')])
.listActions(['show', 'edit', 'delete'])
.title("My shopping lists");
configureFields(list.editionView())
.title('Edit "{{ entry.values.comment }}"')
.actions(['show', 'list', 'delete']);
configureFields(list.showView())
.title('View "{{ entry.values.comment }}"');
configureFields(list.creationView());
admin.addEntity(list);
nga.configure(admin);
}]);
Komplettes
Baukastensystem
an Microframeworks & Tools !
IoC, AOP,
Bean-Validation,
SQL/OR-Mapper,
HTML Parser, …
Einzeln einbindbar
Alles zusammen: 1,7MB
4.2.0 (März 2018), APL2
Start: 2009
https://jodd.org/
Und noch einiges mehr in nur 1,7MB!
(Validierung, HTTP, Utils, CSS, …)
Ausgeprägt
Leichtgewichtig / Modular / KISS
Trotz 1,7MB weit mehr als nur Web-Framework. Geringe Verbreitung.
nichts!
Große Breite
bei geringer Größe & Einfachheit.
Microframework at it's best!
Öfters Breaking changes. Engagierter Maintainer – aktuell aber in der Sinnkrise
In komplexeren Fällen ggf. Rückgriff auf umfassendere Lösungen notwendig
Reaktiv, Asynchron
Event-basiert,
stark typisiert
hohe Ähnlichkeit mit Vert.X
Basis:
Java 8, Netty & Promises
Zahlreiche Module:
Guice, Groovy, Jackson, Redis, Hystrix, Templating
1.5.3 (März 2018), APL2
Start: 2012
https://ratpack.io/
Asynchron
non-blocking
reaktiv
Netty, Jackson, Javassist, SnakeYaml, slf4j
Interessanter Ansatz & Konzept
Problematisch: viele Lücken in der Dokumentation
Asynchronen Programmierung in Kombination mit vielen Lambda-Ausdrücke begrenzt intuitiv.
Komplexität vs. Gewinn?
CoC für Spring
= Full-stack
Auswahl an „Starters"
Maven-zentrisch
Ziele
Möglichst viel Autokonfiguration
Standalone Apps
„Opinionated“ Vorlagen
Hier gewählt
Spring 5 mit WebFlux (reaktiv)
2.0.0 (März 2018), APL2
https://projects.spring.io/
Mainstream. Full-stack.
Kein "Micro" – eher ganze Landschaft
Spring Boot, Spring Web/Beans/Core/JCL,
WebFlux, Reactor/ReactiveStreams, Netty
Hibernate Validator, slf4j, SnakeYaml, Logback, Jackson
Viel Automagie.
Hohe Komplexität & Lernkurve
Detailanforderungen können schnell Expertenwissen erfordern
Höchstes Niveau an
Support & Verbreitung
Umfangreiche Dokumentation
$ ab -n 400000 -c 400 "http://localhost:8080/list?_page=1&_…"
Sehr schnell erste Ergebnisse.
Macht Spaß in der Verwendung!
Minimalismus bedeutet aber auch:
Zergliederung, Fehlerbehandlung Antwortseiten in Entwicklerverantwortung
Dokumentation könnte umfassender & gründlicher sein. Code aber gut verständlich & debugbar