SlideShare una empresa de Scribd logo
1 de 107
Descargar para leer sin conexión
#WISSENTEILEN
MicroProfile 2.0
Enterprise Java auf Diät
Lars Röwekamp
CIO New Technologies
@mobileLarson
@_openknowledge
#WISSENTEILEN
#WISSENTEILEN
ÜBER OPEN KNOWLEDGE
Branchenneutrale Softwareentwicklung & IT-Beratung
#WISSENTEILEN
ÜBER MICH
Wer bin ich - und wenn ja, wie viele?
• CIO New Technologies
• Enterprise & Mobile
• Autor, Speaker, Coach & Mentor
• Snowboard & MTB Enthusiast
Lars Röwekamp (a.k.a. @mobileLarson)
LR
#WISSENTEILEN
Mein Freund der Microservice
#WISSENTEILEN
#WISSENTEILEN
Das geht
mit JEE?
#WISSENTEILEN
Technologisch?
Auf jeden Fall!
#WISSENTEILEN
Management Monitoring Availability Security
(* Java EE 7 APIs)
#WISSENTEILEN
Ok, das geht mit JEE.
Aber passt das auch?
#WISSENTEILEN
„Max cohesion, min coupling.“
JEE Business Component
Boundary Entity Control Pattern
je Service ein eigenes WAR
Kommunikation via REST
#WISSENTEILEN
#WISSENTEILEN
Unabhängig?
#WISSENTEILEN
JEE
#WISSENTEILEN
App Server?
#WISSENTEILEN
#WISSENTEILEN
Ich will meinen
Monolithen
zurück!
#WISSENTEILEN
Don‘t panic!
#WISSENTEILEN
Folks, we must talk …
#WISSENTEILEN
#WISSENTEILEN
„Just enough Server“
• Self-Contained Java Microservices (.jar)
• Java EE Komponenten on demand
• Embedded Servlet / Web Engine
• more to come …
Das geht mit Java EE?
JEE
#WISSENTEILEN
#WISSENTEILEN
Die Mission:
„An open forum to optimize Enterprise Java
for a microservices architecture by innovating
across multiple implementations and
collaborating on common areas of interest
with a goal of standardization.“
MicroProfile
#WISSENTEILEN
Brücke zwischen Community und Standard
• breite Kooperation von Herstellern
• Portabel zwischen Implementierungen
• Förderung von Experimentierfreudigkeit
• Risikominimierung
• zügige Innovationen
MicroProfile
#WISSENTEILEN
Der Weg in die MicroProfile Zukunft:
• Schritt 1: Den „Hebel“ Java EE nutzen
• Schritt 2: Organische Innovationen
• Schritt 3: Zusammenarbeit via Open Source
MicroProfile
(*aktuelle Planung: 2-4 Releases/Jahr)
#WISSENTEILEN
Q4
2016
Q2
2017
Q3
2017
Q1
2018
MicroProfile
v. 1.3
MicroProfile
v. 1.2
Move to
(*MicroProfile 1.0: JAX-RS 2.0, CDI 1.2, JSON-P 1.0)
MicroProfile
v. 1.1
#WISSENTEILEN
#WISSENTEILEN
#WISSENTEILEN
Weniger ist mehr
#WISSENTEILEN
Was brauche ich mindestens um einen
Microservice auf Basis von Java EE APIs
implementieren zu können?
• JAX-RS 2.0
• CDI 1.2
• JSON-P 1.0
MicroProfile
#WISSENTEILEN
@Path("customers")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public class CustomerResource {
@Inject
private CustomerRepository customerRepository
@GET
@Path("/{id}")
public Response getCustomer(@PathParam("id") final UUID customerId) {
try {
Customer customer = customerRepository.find(customerId);
return Response.status(Response.Status.OK).entity(customer).build();
} catch (CustomerNotFoundException e) {
return Response.status(Response.Status.NOT_FOUND).build();
}
}
...
}
#WISSENTEILEN
verteilte Konfigurationen
#WISSENTEILEN
Wie kann ich auf einheitliche Art und Weise
in meinen Services unterschiedlichste
Konfigurationsmechanismen nutzen?
• MicroProfile Config 1.2
MicroProfile
#WISSENTEILEN
#WISSENTEILEN
#WISSENTEILEN
// inject the WHOLE configuration
@Inject
Config config;
// inject a single configuration property of type String with default value
// the property MUST exist in one of the config sources, otherwise a DeploymentException will be thrwon
@Inject
@ConfigProperty(name = "VERSION")
String version;
// inject a single configuration property of type Boolean with default value
@Inject
@ConfigProperty(name = "DEBUG", defaultValue = "no")
boolean debug;
// inject a single configuration property of custom typ using a Converter<Person> converter
@Inject
@ConfigProperty(name = "PERSON")
Optional<Person> person;
#WISSENTEILEN
MicroProfile Config 1.2
• Default ConfigSources*
System Properties, Env Vars & Config File
• Custom ConfigSources*
z.B. DB oder ConfigServer
• Startup vs. Laufzeit
ConfigProperty vs Provider
MicroProfile
*inkl. ordinal
#WISSENTEILEN
Wie geht‘s, wie steht‘s
#WISSENTEILEN
Wie kann ich auf einheitliche Art und Weise
den Health Status und weitere Metriken
meines Microservices abfragen?
• MicroProfile HealthCheck 1.0
• MicroProfile Metrics 1.1
MicroProfile
#WISSENTEILEN
MicroProfile HealthCheck 1.0
• M2M, e.g Kuberentes Liveness & Rediness
• terminate, shutdown, replace?
• Single HC Endpoint pro MP Runtime (/health)
• logisches UND (gesund, wenn alle gesund)
• REST/HTTP (andere optional z.B. JMX)
MicroProfile
#WISSENTEILEN
// simplest health check possible
@Health
@ApplicationScoped
public class AliveHealthCheck implements HealthCheck {
// health check implementation
public HealthCheckResponse call() {
return HealthCheckResponse
.named("alive")
.withData("alive status","totaly alive" )
.state(true)
.build();
}
}
#WISSENTEILEN
http://myHost.com:9080/health*
{
"checks": [
{
"data": {
"db name": "my cloud DB"
},
"name": "datasource",
"state": "UP"
},
{
"data": {
"alive status": "totaly alive"
},
"name": "alive",
"state": "UP"
}
],
"outcome": "UP"
}
*optional secured
#WISSENTEILEN
MicroProfile Metrics 1.1
• deutlich mehr als nur UP/DOWN Info für
Scopes „base“, „vendor“, „application“
• Datentrends für Kapazitätsplanung
• Auslastung für automatisches Scalling
• proaktives Feststellen von Problemen*
MicroProfile
(z.B. Disk-Usage Anomalie)
#WISSENTEILEN
MicroProfile Metrics 1.1
• Pflicht- und Optional-Metrics
• Tags via Metric Description & Config API
• Metadaten (unit, type, description, …)
• Resuable Metrics (default ist false)
• JSON & Prometheus Format (mehr geplant)
MicroProfile
#WISSENTEILEN
// RESTful method with metrics annotation for measuring time consumption
// metric scope: application
// metric name: microprofile.demo.getAllCustomer
@GET
@Timed(absolute = true,
name = "microprofile.demo.getAllCustomers",
displayName = "customer retrieval time",
description = "Time of retrieval for all customers in ns",
unit = MetricUnits.NANOSECONDS
)
public Response getAllCustomers() {
// do some time consuming work
List customers = customerRepository.findAll();
// do some addtional work
...
return Response.ok(customers).build();
}
#WISSENTEILEN
https://myhost.com:9443/metrics/application/microprofile.demo.getAllCustomers
{
"microprofile.demo.getAllCustomers": {
"fiveMinRate": 0.20986069787396025,
"max": 1651913296,
"count": 8,
"p50": 687010408,
"p95": 1651913296,
"p98": 1651913296,
"p75": 1202672502,
"p99": 1651913296,
"min": 18263144,
"fifteenMinRate": 0.20331788471046802,
"meanRate": 0.30716083402329386,
"mean": 819746459.7127254,
"p999": 1651913296,
"oneMinRate": 0.24649848683393774,
"stddev": 498437668.57033247
}
}
*optional secured
#WISSENTEILEN
MicroProfile Metrics 1.1
• @ Timer
• @ Counter
• @ Gauge
• @ Meter
• @ Histogram
MicroProfile
#WISSENTEILEN
Toleranz ist gefragt
#WISSENTEILEN
Wie kann ich mein System so aufbauen,
dass es auch bei temporäre Ausfälle und
Problemsituation einzelner Microservices
stabil läuft (a.k.a. Resilient)?
• MicroProfile Fault Tolerance 1.0
MicroProfile
#WISSENTEILEN
MicroProfile Fault Tolerance 1.0
• Business Logik um Fehlertoleranz erweitern
• Trennung der Logik von deren Ausführung
• Ausführung erlaubt Resilience Patterns
• CDI Interceptor als Mittel zum Zweck
• Hystrix/Failsafe als Vorbilder für Standard API
MicroProfile
#WISSENTEILEN
MicroProfile Fault Tolerance 1.0
• @Timeout
• @ Retry
• @ Fallback
• @ CircuitBreaker
• @ Bulkhead
MicroProfile
(Konfiguration via Config API möglich)
#WISSENTEILEN
#WISSENTEILEN
// The configured the max retries is 10 but the max duration is 500ms.
// Once the duration is reached, no more retries should be performed
// even through it has not reached the max retries.
@Retry(delay=100, maxRetries=10, maxDuration=500)
private String doSomething () {
return … ;
}
// Retry will be performed on IOException.
@Retry(retryOn={IOException.class})
private String doSomething () {
return … ;
}
#WISSENTEILEN
// Reads all customers from DB based repository.
// In case of timeout the customers will be taken from cache
@Timeout(value = 200, unit = ChronoUnit.MILLIS) // timeout is 200ms
@Fallback(fallbackMethod = "readAllCustomerFromCache")
private List<Customer> readAllCustomersFromRepository() {
return customerRepository.findAll();
}
// Reads all customers from cache.
private List<Customer> readAllCustomerFromCache() {
return customerCache.findAll();
return customerCache;
}
#WISSENTEILEN
Circuit
Breaker
#WISSENTEILEN
Circuit
Breaker
#WISSENTEILEN
Circuit
Breaker
#WISSENTEILEN
// Open circuit when once 3 (4x0.75) failures occur among the rolling
// window of 4 consecutive invocation. The circuit will stay open for
// 1000ms and then back to half open. After 10 consecutive successful
// invocations, the circuit will be back to close again.
@CircuitBreaker(successThreshold = 10,
requestVolumeThreshold = 4,
failureRatio=0.75,
delay = 1000)
@Fallback(fallbackMethod = “someFallbackMethod")
private String doSomething () {
return … ;
}
#WISSENTEILEN
Bulkheads
#WISSENTEILEN
Bulkheads
#WISSENTEILEN
Bulkheads
#WISSENTEILEN
// maximum 5 concurrent requests allowed,
// maximum 8 requests allowed in the waiting queue
@Bulkhead(value = 5,
waitingTaskQueue = 8)
@Fallback(fallbackMethod = “someFallbackMethod")
private String doSomething () {
return … ;
}
#WISSENTEILEN
Sicher ist sicher! Sicher?
#WISSENTEILEN
Wie sichere ich meine Microservices gegen
unbefugten Zugriff ab OHNE dass bei jedem
Service eine neue Authentifizierung und
Authorisierung stattfinden muss?
• MicroProfile JWT Auth 1.0
MicroProfile
#WISSENTEILEN
#WISSENTEILEN
#WISSENTEILEN
#WISSENTEILEN
#WISSENTEILEN
#WISSENTEILEN
#WISSENTEILEN
#WISSENTEILEN
MicroProfile JWT Auth 1.0
• Security Token aus Request extrahieren
• Validierung des Tokens vornehmen
• Claims aus Token extrahieren
• (JEE) Security Context erzeugen
MicroProfile
#WISSENTEILEN
MicroProfile JWT Auth 1.0
• type, alg, kid (header)
• iss, sub, exp, iat, jti, (payload IANA*)
• upn, groups (payload mp jwt auth)
• etliche optionale Claims
MicroProfile
(*Internet Assigend Number Authority)
#WISSENTEILEN
// Step 1: mark REST API as „requiring MP-JWT Access Control“
@LoginConfig(authMethod = "MP-JWT", realmName = "TCK-MP-JWT")
@ApplicationPath("api") Requiring MP-JWT Access Control
public class ApiApplication extends Application {
...
}
#WISSENTEILEN
// Step 2: Inject and use json web token or parts (claims) of it
@Path("/customers")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public class CustomerResource {
@Inject
private JsonWebToken callerPrincipal;
@Inject
@Claim(value=“iat", standard=Claims.iat)
private Long issuedAtClaim;
...
}
#WISSENTEILEN
// Step 3: Add role based acces control for REST Endpoints
@DenyAll
@Path("/customers")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public class CustomerResource {
...
@GET
@RolesAllowed("admin")
public Response getAllCustomers() { ... }
@GET
@Path("/{id}")
@RolesAllowed({"user", "admin"})
public Response getCustomer(@PathParam("id") final UUID id) { ...}
}
#WISSENTEILEN
Was geht ab?
#WISSENTEILEN
Wie lässt sich ein Request-Flow über
Servicegrenzen hinaus verfolgen?
• MicroProfile Open Tracing 1.0
MicroProfile
#WISSENTEILEN
#WISSENTEILEN
#WISSENTEILEN
MicroProfile Open Tracing 1.0
• verteiltes Tracing über Servicgrenzen hinweg
• Correlation ID als gemeinsamer Nenner
• OpenTracing Standard als Basis
• Achtung: KEIN eigener Tracing Service
sondern lediglich dessen Support
MicroProfile
#WISSENTEILEN
// Tracing is enabled by default for all JAX-RS methods.
// You „only“ have to provide a distributed tracing service, e.g. Zipkin
#WISSENTEILEN
// Tracing is enabled by default for all JAX-RS methods.
// You „only“ have to provide a distributed tracing service, e.g. Zipkin
// explicitely disable tracing for a single method
@Traced(false)
@GET
@Path("/{id}")
@Produces(MediaType.APPLICATION_JSON)
public Response getCustomer(@PathParam("id") final UUID customerId) {
try {
Customer customer = customerRepository.find(customerId);
return Response.status(Response.Status.OK).entity(customer).build();
} catch (CustomerNotFoundException e) {
return Response.status(Response.Status.NOT_FOUND).build();
}
}
#WISSENTEILEN
#WISSENTEILEN
#WISSENTEILEN
Sesam öffne dich …
#WISSENTEILEN
Wie kann ich meine Microservices APIs
so dokumentieren, dass sie von anderen
verstanden und genutzt werden können.
• MicroProfile Open API 1.0
MicroProfile
#WISSENTEILEN
(Quelle: MicroProfile Open Api 1.0 Specifikation)
#WISSENTEILEN
MicroProfile Open API 1.0
• OpenAPI v3 Standard (abgeleitet von Swagger)
• Scan- und Annotationen-basiert (fast 50 @s)
• frei konfigurierbar (Scanpath etc.)
• mit YAML, JSON kombinierbar (in META-INF)
• Filter setzen via Config API
MicroProfile
#WISSENTEILEN
@GET
@Path("/{id}")
@Produces(MediaType.APPLICATION_JSON)
@Operation(summary = "Get user by user id")
@APIResponse(responseCode = "200",
description = "The user",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = Customer.class)))
@APIResponse(responseCode = "404",
description = "User not found")
public Response getCustomer(
@Parameter(description = "The unique id that needs to be fetched. ", required = true)
@PathParam("id") final UUID id) {
try {
Customer customer = customerRepository.find(id);
return Response.status(Response.Status.OK).entity(customer).build();
} catch (CustomerNotFoundException e) {
return Response.status(Response.Status.NOT_FOUND).build();
}
}
#WISSENTEILEN
@GET
@Path("/{id}")
@Produces(MediaType.APPLICATION_JSON)
@Operation(summary = "Get user by user id")
@APIResponse(responseCode = "200",
description = "The user",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = Customer.class)))
@APIResponse(responseCode = "404",
description = "User not found")
public Response getCustomer(
@Parameter(description = "The unique id that needs to be fetched. ", required = true)
@PathParam("id") final UUID id) {
try {
Customer customer = customerRepository.find(id);
return Response.status(Response.Status.OK).entity(customer).build();
} catch (CustomerNotFoundException e) {
return Response.status(Response.Status.NOT_FOUND).build();
}
}
#WISSENTEILEN
#WISSENTEILEN
Back to the Future
#WISSENTEILEN
(Source: Microprofile.io Webseite)
#WISSENTEILEN
(Source: Microprofile.io Webseite)
#WISSENTEILEN
MicroProfile
Configuration
Fault Tolerance
Health Check
Metrics
JWT Token Security
Disributed Tracing
Swagger
CDI 2.0
JSON-P 1.1
JAX-RS 2.1
JSON-B 1.0
Distributed Logging
Service Discovery
Bean Validation
JPA
…
#WISSENTEILEN
MicroProfile
WebSockets
Concurrency Utilities
Messaging / Eventing
Async/Reactive
EJB Lite
Servlets
HTTP/2
Uber-jar
Eventing Systems
Big Data/NoSQL
NetFlix OSS Integration
jCache
Java 9 Modularity
...
#WISSENTEILEN
MicroProfile Ramp-Up
MicroProfile.io
bit.ly/MicroProfileForum
github.com/microprofile/microprofile-samples
#WISSENTEILEN
#WISSENTEILEN
#WISSENTEILEN
„Ein Microservice
kommt selten allein!“
by Lars Röwekamp
#WISSENTEILEN
#WISSENTEILEN
„Komplexität
wird durch Microservices
verlagert, nicht verringert!
by Lars Röwekamp
#WISSENTEILEN
#WISSENTEILEN
„BFF“
Best Friends Forever!
#WISSENTEILEN
FRAGEN
? ? ?
#WISSENTEILEN
Kontakt
LARS RÖWEKAMP
CIO NEW TECHNOLOGIES
lars.roewekamp@openknowledge.de
+49 (0)441 4082 – 0
@mobileLarson
@_openknowledge
OFFENKUNDIGGUT
#WISSENTEILEN
Bildnachweise
#03 © Daniel Steger – openphoto.net
#06,17 © Andrew Rich – istockphoto.com
#15 © Netflix Techblock - techblog.netflix.com
#28 © print10 – istockphoto.com
#98 ©MichaelJayBerlin - shutterstock.com
All other pictures inside this presentation orginate
from pixabay.com or were created by my own.

Más contenido relacionado

Similar a MicroProfile 2.x: Der alternative Standard

Java EE meets Microservices: MicroProfile 2.x to the Rescue
Java EE meets Microservices: MicroProfile 2.x to the RescueJava EE meets Microservices: MicroProfile 2.x to the Rescue
Java EE meets Microservices: MicroProfile 2.x to the RescueOPEN KNOWLEDGE GmbH
 
Microservices mit dem MicroProfile
Microservices mit dem MicroProfileMicroservices mit dem MicroProfile
Microservices mit dem MicroProfileOPEN KNOWLEDGE GmbH
 
Lightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPALightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPAmh0708
 
Schnell, schneller, Quarkus!!
Schnell, schneller, Quarkus!!Schnell, schneller, Quarkus!!
Schnell, schneller, Quarkus!!gedoplan
 
Cloud Native und Java EE: Freund oder Feind?
Cloud Native und Java EE: Freund oder Feind?Cloud Native und Java EE: Freund oder Feind?
Cloud Native und Java EE: Freund oder Feind?Josef Adersberger
 
Cloud Native & Java EE: Freund oder Feind?
Cloud Native & Java EE: Freund oder Feind?Cloud Native & Java EE: Freund oder Feind?
Cloud Native & Java EE: Freund oder Feind?QAware GmbH
 
Anforderungsanalyse und UML Grundlagen
Anforderungsanalyse und UML GrundlagenAnforderungsanalyse und UML Grundlagen
Anforderungsanalyse und UML GrundlagenChristian Baranowski
 
Microprofile-Anwendungen mit Quarkus
Microprofile-Anwendungen mit Quarkus Microprofile-Anwendungen mit Quarkus
Microprofile-Anwendungen mit Quarkus gedoplan
 
2009 03 17 Spring101
2009 03 17 Spring1012009 03 17 Spring101
2009 03 17 Spring101gueste4be40
 
Best Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptBest Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptSebastian Springer
 
96% macoun 2013
96% macoun 201396% macoun 2013
96% macoun 2013Maxim Zaks
 
Testen im EE-Umfeld – Seien Sie feige!
Testen im EE-Umfeld – Seien Sie feige!Testen im EE-Umfeld – Seien Sie feige!
Testen im EE-Umfeld – Seien Sie feige!gedoplan
 
Legacy Code refaktorisieren
Legacy Code refaktorisierenLegacy Code refaktorisieren
Legacy Code refaktorisierenHendrik Lösch
 
Hands-on Hystrix - Best Practices und Stolperfallen
Hands-on Hystrix - Best Practices und StolperfallenHands-on Hystrix - Best Practices und Stolperfallen
Hands-on Hystrix - Best Practices und Stolperfalleninovex GmbH
 
Die Zukunft der Webstandards - Webinale 31.05.2010
Die Zukunft der Webstandards - Webinale 31.05.2010Die Zukunft der Webstandards - Webinale 31.05.2010
Die Zukunft der Webstandards - Webinale 31.05.2010Patrick Lauke
 

Similar a MicroProfile 2.x: Der alternative Standard (20)

Java EE meets Microservices: MicroProfile 2.x to the Rescue
Java EE meets Microservices: MicroProfile 2.x to the RescueJava EE meets Microservices: MicroProfile 2.x to the Rescue
Java EE meets Microservices: MicroProfile 2.x to the Rescue
 
Microservices mit dem MicroProfile
Microservices mit dem MicroProfileMicroservices mit dem MicroProfile
Microservices mit dem MicroProfile
 
Lightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPALightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPA
 
Schnell, schneller, Quarkus!!
Schnell, schneller, Quarkus!!Schnell, schneller, Quarkus!!
Schnell, schneller, Quarkus!!
 
Cloud Native und Java EE: Freund oder Feind?
Cloud Native und Java EE: Freund oder Feind?Cloud Native und Java EE: Freund oder Feind?
Cloud Native und Java EE: Freund oder Feind?
 
Cloud Native & Java EE: Freund oder Feind?
Cloud Native & Java EE: Freund oder Feind?Cloud Native & Java EE: Freund oder Feind?
Cloud Native & Java EE: Freund oder Feind?
 
Feature Flags mit Togglz
Feature Flags mit TogglzFeature Flags mit Togglz
Feature Flags mit Togglz
 
Anforderungsanalyse und UML Grundlagen
Anforderungsanalyse und UML GrundlagenAnforderungsanalyse und UML Grundlagen
Anforderungsanalyse und UML Grundlagen
 
Microprofile-Anwendungen mit Quarkus
Microprofile-Anwendungen mit Quarkus Microprofile-Anwendungen mit Quarkus
Microprofile-Anwendungen mit Quarkus
 
2009 03 17 Spring101
2009 03 17 Spring1012009 03 17 Spring101
2009 03 17 Spring101
 
Best Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptBest Practices für TDD in JavaScript
Best Practices für TDD in JavaScript
 
96% macoun 2013
96% macoun 201396% macoun 2013
96% macoun 2013
 
Webapplikationen mit Node.js
Webapplikationen mit Node.jsWebapplikationen mit Node.js
Webapplikationen mit Node.js
 
Testen im EE-Umfeld – Seien Sie feige!
Testen im EE-Umfeld – Seien Sie feige!Testen im EE-Umfeld – Seien Sie feige!
Testen im EE-Umfeld – Seien Sie feige!
 
GWT – Google Web Toolkit in der Praxis
GWT – Google Web Toolkit in der PraxisGWT – Google Web Toolkit in der Praxis
GWT – Google Web Toolkit in der Praxis
 
Legacy Code refaktorisieren
Legacy Code refaktorisierenLegacy Code refaktorisieren
Legacy Code refaktorisieren
 
MVVM mit WPF
MVVM mit WPFMVVM mit WPF
MVVM mit WPF
 
Hands-on Hystrix - Best Practices und Stolperfallen
Hands-on Hystrix - Best Practices und StolperfallenHands-on Hystrix - Best Practices und Stolperfallen
Hands-on Hystrix - Best Practices und Stolperfallen
 
A/B Testing mit Node.js
A/B Testing mit Node.jsA/B Testing mit Node.js
A/B Testing mit Node.js
 
Die Zukunft der Webstandards - Webinale 31.05.2010
Die Zukunft der Webstandards - Webinale 31.05.2010Die Zukunft der Webstandards - Webinale 31.05.2010
Die Zukunft der Webstandards - Webinale 31.05.2010
 

Más de OPEN KNOWLEDGE GmbH

Warum der Computer "Nein" sagt - Mehr Nachvollziehbarkeit dank Explainable AI
Warum der Computer "Nein" sagt - Mehr Nachvollziehbarkeit dank Explainable AIWarum der Computer "Nein" sagt - Mehr Nachvollziehbarkeit dank Explainable AI
Warum der Computer "Nein" sagt - Mehr Nachvollziehbarkeit dank Explainable AIOPEN KNOWLEDGE GmbH
 
Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...
Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...
Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...OPEN KNOWLEDGE GmbH
 
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die CloudFrom Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die CloudOPEN KNOWLEDGE GmbH
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)OPEN KNOWLEDGE GmbH
 
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data Imputation
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data ImputationFEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data Imputation
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data ImputationOPEN KNOWLEDGE GmbH
 
Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!OPEN KNOWLEDGE GmbH
 
From Zero to still Zero: The most beautiful mistakes going into the cloud.
From Zero to still Zero: The most beautiful mistakes going into the cloud. From Zero to still Zero: The most beautiful mistakes going into the cloud.
From Zero to still Zero: The most beautiful mistakes going into the cloud. OPEN KNOWLEDGE GmbH
 
Ready for the Future: Jakarta EE in Zeiten von Cloud Native & Co
Ready for the Future: Jakarta EE in Zeiten von Cloud Native & CoReady for the Future: Jakarta EE in Zeiten von Cloud Native & Co
Ready for the Future: Jakarta EE in Zeiten von Cloud Native & CoOPEN KNOWLEDGE GmbH
 
Shared Data in verteilten Architekturen
Shared Data in verteilten ArchitekturenShared Data in verteilten Architekturen
Shared Data in verteilten ArchitekturenOPEN KNOWLEDGE GmbH
 
Machine Learning mit TensorFlow.js
Machine Learning mit TensorFlow.jsMachine Learning mit TensorFlow.js
Machine Learning mit TensorFlow.jsOPEN KNOWLEDGE GmbH
 
It's not Rocket Science: Neuronale Netze
It's not Rocket Science: Neuronale NetzeIt's not Rocket Science: Neuronale Netze
It's not Rocket Science: Neuronale NetzeOPEN KNOWLEDGE GmbH
 
Shared Data in verteilten Systemen
Shared Data in verteilten SystemenShared Data in verteilten Systemen
Shared Data in verteilten SystemenOPEN KNOWLEDGE GmbH
 
Mehr Sicherheit durch Automatisierung
Mehr Sicherheit durch AutomatisierungMehr Sicherheit durch Automatisierung
Mehr Sicherheit durch AutomatisierungOPEN KNOWLEDGE GmbH
 
API-Design, Microarchitecture und Testing
API-Design, Microarchitecture und TestingAPI-Design, Microarchitecture und Testing
API-Design, Microarchitecture und TestingOPEN KNOWLEDGE GmbH
 
Supersonic Java für die Cloud: Quarkus
Supersonic Java für die Cloud: QuarkusSupersonic Java für die Cloud: Quarkus
Supersonic Java für die Cloud: QuarkusOPEN KNOWLEDGE GmbH
 
Hilfe, ich will meinen Monolithen zurück!
Hilfe, ich will meinen Monolithen zurück!Hilfe, ich will meinen Monolithen zurück!
Hilfe, ich will meinen Monolithen zurück!OPEN KNOWLEDGE GmbH
 

Más de OPEN KNOWLEDGE GmbH (20)

Warum der Computer "Nein" sagt - Mehr Nachvollziehbarkeit dank Explainable AI
Warum der Computer "Nein" sagt - Mehr Nachvollziehbarkeit dank Explainable AIWarum der Computer "Nein" sagt - Mehr Nachvollziehbarkeit dank Explainable AI
Warum der Computer "Nein" sagt - Mehr Nachvollziehbarkeit dank Explainable AI
 
Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...
Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...
Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...
 
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die CloudFrom Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)
 
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data Imputation
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data ImputationFEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data Imputation
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data Imputation
 
Nie wieder Log-Files!
Nie wieder Log-Files!Nie wieder Log-Files!
Nie wieder Log-Files!
 
Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!
 
From Zero to still Zero: The most beautiful mistakes going into the cloud.
From Zero to still Zero: The most beautiful mistakes going into the cloud. From Zero to still Zero: The most beautiful mistakes going into the cloud.
From Zero to still Zero: The most beautiful mistakes going into the cloud.
 
API Expand Contract
API Expand ContractAPI Expand Contract
API Expand Contract
 
Ready for the Future: Jakarta EE in Zeiten von Cloud Native & Co
Ready for the Future: Jakarta EE in Zeiten von Cloud Native & CoReady for the Future: Jakarta EE in Zeiten von Cloud Native & Co
Ready for the Future: Jakarta EE in Zeiten von Cloud Native & Co
 
Shared Data in verteilten Architekturen
Shared Data in verteilten ArchitekturenShared Data in verteilten Architekturen
Shared Data in verteilten Architekturen
 
Machine Learning mit TensorFlow.js
Machine Learning mit TensorFlow.jsMachine Learning mit TensorFlow.js
Machine Learning mit TensorFlow.js
 
KI und Architektur
KI und ArchitekturKI und Architektur
KI und Architektur
 
It's not Rocket Science: Neuronale Netze
It's not Rocket Science: Neuronale NetzeIt's not Rocket Science: Neuronale Netze
It's not Rocket Science: Neuronale Netze
 
Shared Data in verteilten Systemen
Shared Data in verteilten SystemenShared Data in verteilten Systemen
Shared Data in verteilten Systemen
 
Business-Mehrwert durch KI
Business-Mehrwert durch KIBusiness-Mehrwert durch KI
Business-Mehrwert durch KI
 
Mehr Sicherheit durch Automatisierung
Mehr Sicherheit durch AutomatisierungMehr Sicherheit durch Automatisierung
Mehr Sicherheit durch Automatisierung
 
API-Design, Microarchitecture und Testing
API-Design, Microarchitecture und TestingAPI-Design, Microarchitecture und Testing
API-Design, Microarchitecture und Testing
 
Supersonic Java für die Cloud: Quarkus
Supersonic Java für die Cloud: QuarkusSupersonic Java für die Cloud: Quarkus
Supersonic Java für die Cloud: Quarkus
 
Hilfe, ich will meinen Monolithen zurück!
Hilfe, ich will meinen Monolithen zurück!Hilfe, ich will meinen Monolithen zurück!
Hilfe, ich will meinen Monolithen zurück!
 

MicroProfile 2.x: Der alternative Standard