code quality in practice - oio1 orientation in objects gmbh weinheimer str. 68 68309 mannheim...
TRANSCRIPT
1
Orientation in Objects GmbH
Weinheimer Str. 68
68309 Mannheim
www.oio.de
WildFly SwarmJava EE in one JAR
1.0
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH
Abstract
Microservices-Architekturen können mit klassischen Application Servern nichts anfangen, stattdessen geht der Trend hin zu Fat-JARs und Self-contained Systems, in denen die Anwendung ihre Ablaufumgebung mitbringt. Nach dem Erfolg von Spring Boot und Co. haben mittlerweile auch die klassischen Java-EE-Applikationsserver-Hersteller Microservices-Frameworks im Programm.
In dieser Session wollen wir uns anschauen, wie mit WildFly Swarm die notwendigen Teile des WildFly AS mit der Applikation und allen benötigten Bibliotheken in einem ausführbaren JAR verpackt werden. Dazu diskutieren wir natürlich auch über für Microservices relevante Themen wie Konfiguration, Logging, Monitoring, Resilience und Service Discovery im Umfeld von WildFly Swarm. Als Abschluss wagen wir noch einen Ausblick auf Standardisierungsversuche im Rahmen von Java EE und der MicroProfile-Initiative.
2
2
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH
Ihre Sprecher
Trainer, Berater, Entwickler
3
Falk Sippach (@sippsack)
Architektur
Agile Softwareentwicklung
Codequalität
Co-Organisator
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 4
Microservices
3
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 5
Spring BootDropwizardGrails
Play Framework
Ninja Web Framework
Vert.x
Spark Framework
WildFly Swarm
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH
6
Hello, World!
Paketierung
Konfiguration
Überwachen
Kommunikation
Ausblick
4
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 7
Hello, World!
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 8
(1) Java EE Anwendung
(2) Maven Plugin
(3) Bauen + Starten
5
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 9
(1) Java EE Anwendung
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 10
<build>
<finalName>demo</finalName>
<plugins>
<plugin>
<groupId>org.wildfly.swarm</groupId>
<artifactId>wildfly-swarm-plugin</artifactId>
<version>${version.wildfly.swarm}</version>
<executions>
<execution>
<goals>
<goal>package</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
(2) Maven Plugin
6
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 11
(3) Bauen + Starten
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 12
DEMO
7
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 13
Paketierung
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 14
WAR-Deployment Fat-JAR
8
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 15
"… by packaging them with just enough of the server runtime to
"java -jar" your application."
http://wildfly-swarm.io/
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 16
App-Code
WildFly
SwarmJAX-RS
CDI JPA
9
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 17
buildscript {
version = System.getProperty('swarmVersion') ?: '2016.11.0-SNAPSHOT'
}
apply plugin: 'wildfly-swarm'
swarm {
properties {
swarm.http.port = 8181
}
}
dependencyManagement {
imports {
mavenBom "org.wildfly.swarm:bom-all:$version"
}
}
dependencies {
compile "org.wildfly.swarm:jaxrs"
}
Und was
ist mit
Gradle?
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 18
Kommandozeilenwerkzeug: Swarmtool
10
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 19
Konfiguration
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 20
(1) Build-Abhängigkeiten
Fractions
Auto-Detection Dependencies Programmatisch
11
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 21
Fractions: Auto-Detection
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 22
Fractions: Explizite Dependencies
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>bom-all</artifactId>
<version>${version.wildfly.swarm}</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
12
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH
<!-- WildFly Swarm Fractions -->
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>cdi</artifactId>
</dependency>
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>jaxrs</artifactId>
</dependency>
23
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 24
http://wildfly-swarm.io/generator/
13
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 25
Fractions: Programmatisch
main-Methode mit DSL (Fluent Interface)
Konfiguration der Fractions und WAR-Inhalt
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 26
public class Main {
public static void main(String[] args) throws Exception {
Swarm container = new Swarm()
.fraction(new JAXRSFraction())
.start();
JAXRSArchive appDeployment = ShrinkWrap.create(JAXRSArchive.class)
.addResource(Book.class)
.addResource(BookResource.class)
.addAllDependencies();
container.deploy(appDeployment);
}
}
14
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 27
(2) Laufzeitkonfiguration
standalone.xmlSystem PropertiesProperties/YAML
Java DSL
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 28
standalone.xml
Standard im WildFly
Konfiguration von Subsystemen, Realms, Datasources, Queues, Sockets, …
java -jar myapp-swarm.jar -c configurations/standalone.xml
15
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 29
logger:
level: DEBUG
swarm:
port:
offset: 10
---
project:
stage: development
logger:
level: DEBUG
swarm:
port:
offset: 50
---
project:
stage: production
logger:
level: INFO
swarm:
port:
offset: 100
java -jar myapp-swarm.jar -S development
java -jar myapp-swarm.jar
java -jar myapp-swarm.jar -S production
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 30
Injection Konfigurationswerte
@Inject
@ConfigurationValue("swarm.context.path")
private String context;
@Inject
@ConfigurationValue("swarm.http.port")
private Integer port;
16
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 31
Argument Description
-D<name> or
-D<name>=<value>Java System Property
-P<file-or-url> Properties Datei für System Properties
-c <file-or-url> XML-Konfiguration (standalone.xml oder ein Fragment)
-s <file-or-url> YAML-Konfigurationsdatei
-S <active-profile>Name des zu aktivierenden Profils (Konfig-Block oder
project-[profile].yml)
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 32
Name Description Default
swarm.ds.name Name der Datasource ExampleDS
swarm.ds.username Benutzername treiberspezifisch
swarm.ds.password Passwort treiberspezifisch
swarm.ds.connection.url JDBC URL treiberspezifisch
Name Description Default
swarm.bind.address Interface to bind servers 0.0.0.0
swarm.port.offset Ports verschieben 0
swarm.deployment.timeout Timeout (in Sekunden), wie lange das Deployment dauern darf 300
17
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 33
Vorbereitete Server (Standalone Uber-JAR)
Keycloak
Swagger-UI
Management Console
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 34
Überwachen
18
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 35
(1) Logging
jboss-logging
Logstash-Integration
FluentD-Integration
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 36
container.fraction(new LoggingFraction()
.fileHandler("FILE", f -> {
Map<String, String> fileProps = new HashMap<>();
fileProps.put("path", "./my.log");
f.file(fileProps);
f.level(Level.INFO);
f.formatter("%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%e%n");
})
.rootLogger(Level.INFO, "FILE"));
swarm.logging=DEBUG
-Dswarm.logging=DEBUG
Konfiguration
19
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 37
swarm.logstash.hostname = logstash.intern
swarm.logstash.port = 9300
Konfiguration
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>logstash</artifactId>
</dependency>
Fraction
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 38
(2) Monitoring
Laufzeit-Status der Knoten
Health Check API
20
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 39
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>monitor</artifactId>
</dependency>
Fraction
http://localhost:8080/node
http://localhost:8080/heap
http://localhost:8080/threads
http://localhost:8080/health
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 40
@GET
@Path("/diskSpace")
@Health
public HealthStatus checkDiskspace() {
File path = new File(".");
long freeBytes = path.getFreeSpace();
long threshold = 1024 * 1024 * 100; // 100mb
return freeBytes>threshold ? HealthStatus.named("diskspace").up() :
HealthStatus.named("diskspace").down().withAttribute("freebytes", freeBytes);
}
21
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 41
(3) Management
Management Interface
Management Console
Jolokia (JMX over HTTP)
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 42
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>management</artifactId>
</dependency>
Fraction
swarm.management.http.port = 9990
swarm.management.https.port = 9993
Konfiguration
22
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 43
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>jolokia</artifactId>
</dependency>
Fraction
/jolokia/read/java.lang:type=Memory/HeapMemoryUsage
{"request": {
"mbean": "java.lang:type=Memory","attribute": "HeapMemoryUsage","type": "read"
},"value": {
"init": 268435456,"committed": 349700096,"max": 3790077952,"used": 207878656
},"timestamp": 1494375975,"status": 200
}
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 44
DEMO
23
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 45
Kommunikation
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 46
(1) Kommunikation
REST (JAX-RS)
Messaging (JMS)
24
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 47
(2) Datenzugriff
JPA, Datasources
NoSQL in Arbeit
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 48
JPA
Auto-Detection mit ExampleDS
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>${version.h2}</version>
</dependency>
25
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH
.fraction(new DatasourcesFraction()
.jdbcDriver("h2", (d) -> {
d.driverClassName("org.h2.Driver");
d.xaDatasourceClass("org.h2.jdbcx.JdbcDataSource
d.driverModuleName("com.h2database.h2");
})
.dataSource("MyDS", (ds) -> {
ds.driverName("h2");
ds.connectionUrl("jdbc:h2:mem:test;DB_CLOSE_DELAY
ds.userName("sa");
ds.password("sa");
})
)
49
Datasource
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>${version.h2}</version>
</dependency>
JDBC-Treiber
(Auto-Detection oder explizit)
Datasource-Definition
(DSL, YAML oder XML)
swarm:
datasources:
data-sources:
MyDS:
driver-name: myh2
connection-url: jdbc:h2:mem:test;DB_CLOSE_DELAY
user-name: sa
password: sa
jdbc-drivers:
myh2:
driver-class-name: org.h2.Driver
xa-datasource-name: org.h2.jdbcx.JdbcDataSource
driver-module-name: com.h2database.h2
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 50
(3) Service Discovery + Registration
Topology Fraction
JGroups oder Consul
26
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 51
Topology topology = Topology.lookup();
Map<String, ?> services = topology.asMap();
Client
JAXRSArchive deployment = ShrinkWrap.create(JAXRSArchive.class);
deployment.as(TopologyArchive.class).advertise("books");
Registrieren
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 52
(4) Resilience
Hystrix
Ribbon
27
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 53
@ResourceGroup( name="time" )
public interface TimeService {
TimeService INSTANCE = Ribbon.from(TimeService.class);
@TemplateName("currentTime")
@Http(method = Http.HttpMethod.GET, uri = "/")
@Hystrix(fallbackHandler = TimeFallbackHandler.class)
RibbonRequest<ByteBuf> currentTime();
}
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 54
(5) Security
Security Realm
JAAS
SSO mit Keycloak
28
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 55
container.fraction(new ManagementFraction()
.securityRealm("ManagementRealm", (realm) -> {
realm.inMemoryAuthentication((authn) -> {
authn.add("admin", "geheim", true);
});
realm.inMemoryAuthorization((authz) -> {
authz.add("admin", "admin");
});
})
);
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 56
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>keycloak</artifactId>
</dependency>
Fraction
JAXRSArchive deployment = ShrinkWrap.create(JAXRSArchive.class);
deployment.as(Secured.class)
.protect("/books")
.withMethod("GET")
.withRole("admin");
swarm.keycloak.json.path = /srv/…
Konfiguration
29
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 57
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>keycloak-server</artifactId>
</dependency>
Fraction
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 58
(6) Testen
Arquillian
30
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 59
@RunWith(Arquillian.class)
public class UserServiceTests {
@Inject
private UserService service;
@Test
public void testGetAllUsers() {
assertEquals(3, service.getAllUsers().size());
}
@Deployment
public static Archive createDeployment() {
JAXRSArchive deployment = ShrinkWrap.create(JAXRSArchive.class);
deployment.addResource(UserService.class);
return deployment;
}
}
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 60
Ausblick
31
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 61
(1) Java EE 8
Geplant: Sommer 2017Health Check + Configuration API
statt JMS 2.1 + MVC API
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 62
(2) Java EE 9
Geplant: 2018Reaktive APIs, OAuth + OpenID, Circuit
Breaker, NoSQL APIs
32
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 63
(3) MicroProfile
IBM, RedHat, Tomitribe, …
1.0 (2016): CDI, JAX-RS, JSON-P
Zukunft: Java EE Profil?
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 64
(3) MicroProfile Roadmap
1.1 + 1.2 geplant für 2017:
Bean Validation, JSON-B, OAuth/Open-ID
33
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 65
(4) Warum Standards?
Unabhängigkeit
Bewährt
Know-How
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 66
Fazit
34
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 67
WildFly Swarm
veröffentlicht im Mai 2015
1.0.0 seit Juni 2016
Monatliche Releases seit 2016.8.1
Apache License 2.0
http://wildfly-swarm.io
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 68
Vorteile
Lösung auf Basis von Java EE
Fat-JAR oder App-Server
Drittbibliotheken (Ribbon, Hystrix, …)
Integration (Keycloak, Hawkular, …)
35
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 69
Nachteile
kurze Releasezyklen
Unstable Fractions
wenige Drittbibliotheken
Doku und Demos "im Fluß"
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH 70
Feature WildFly Swarm
REST-APIs JAX-RS, Swagger, HATEOAS
Messaging JMS
Deployment Fat JAR oder WAR
Build-Tools Maven, Gradle, Swarmtool
Konfiguration System-/Umgebungsvariablen, standalone.xml,
Properties-/YAML-Dateien
Unterstützung von Stages/Profile
Logging jboss-logging, Logstash
Monitoring ja mit Health Checks, Hawkular
Management HTTP, JMX, Jolokia
Sicherheit JAAS, Keycloak (SSO, OAuth, OpenID)
Service Discovery JGroups oder Consul
Resilience Hystrix, Ribbon
36
WildFly Swarm - Java EE in one JAR© Orientation in Objects GmbH
Links
• WildFly Swarm User's Guide
– https://wildfly-swarm.gitbooks.io/wildfly-swarm-users-guide/
• WildFly Swarm Reference Guide
– https://reference.wildfly-swarm.io/
• WildFly Swarm HOWTO
– https://howto.wildfly-swarm.io/
• WildFly Swarm Examples
– https://github.com/wildfly-swarm/wildfly-swarm-examples
71
Orientation in Objects GmbH
Weinheimer Str. 68
68309 Mannheim
www.oio.de
Vielen Dank für Ihre
Aufmerksamkeit!