SlideShare a Scribd company logo
wm-jug
#RESTSecurity @dblevins @tomitribe#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Lightweight Enterprise Java
With MicroProfile
Jonathan Gallimore
Tomitribe
Jean-Louis Monteiro
Tomitribe
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Agenda
• Microservices!
• What is MicroProfile?
• Specs Overview
• Demos
• MicroProfile Future
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Microservices Anyone?
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
What do people mean by Microservices?
• “Small autonomous services working together”
• “Small enough but not too small”
• “Can be wriCen in 2 weeks”
• “Single responsibility principle”
• “Domain-driven design”
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
What do others think?
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
What do others think?
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
What do others think?
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Why Microservices?
• Deliver new features quicker
• Smaller, agile teams
• Scale services independently
• Cloud
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Microservices Challenges
• Scalability
• Cost ReducLon
• Resilience
• Monitoring
• Security
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
What is MicroProfile?
• hCp://microprofile.io/
• Enterprise Java for Microservices
• Open Source (Eclipse)
• 3 years old plaUorm
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
What is MicroProfile?
• IniLal version 1.0 with CDI, JAX-RS, JSON-P in Sep 2016
• ApplicaLon portability across runLmes
• Currently at version 2.2 since Feb 2019
• ConfiguraLon, Fault Tolerance, JWT PropagaLon, Health Check,
Metrics, Open Tracing, Open API and REST Client
• ReacLve Streams released standalone
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
What is MicroProfile?
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Why MicroProfile?
• Slowdown in Java EE innovaLon
• NegaLve percepLon towards the technology
• Not prepared for Microservices development
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Why MicroProfile?
0
10
20
30
40
EE 5 Specs (2006) EE 6 Specs (2009) EE 7 Specs (2013) EE 8 Specs (2017)
39
37
30
24
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Why MicroProfile?
• A set of “standards” were required to offer guidance in building
Microservices in Java
• These need to evolve very quickly to adjust to the fast moving
Microservices world
• A community of individuals, organisaLons and vendors
collaboraLng to make this a reality
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
MicroProfile != EE (or Jakarta EE)
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Who is involved in MicroProfile?
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
MicroProfile Implementations
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
My first MicroProfile App
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
CDI
•Contexts and Dependency InjecLon
•Bean Lifecycle and Typesafe InjecLon
•Producers
•Interceptors
•Observers
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
JAX-RS
•RESTful Web Services
•AnnotaLon based
•HTTP Centric
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
JSON-P
•Parse, Generate Transform and Query JSON
•Streaming API
•Object Model API
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Putting it all together
@ApplicationScoped
@Path("books")
public class BookResource {
@Inject
private BookBean bookBean;
@GET
@Path("{id}")
public Response findById(@PathParam("id") final Long id) {
final Book book = bookBean.find(id);
final JsonObjectBuilder builder =
Json.createObjectBuilder()
.add(“id", book.getId())
.add("name", book.getTitle());
return Response.ok(builder.build().toString()).build();
}
}
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Evolving your MicroProfile App
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
number-api
book-api
Architecture
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Runtime
•Raspberry PI v3 (HypriotOS)
•Package everything with Docker
•Local Docker Registry
•Push Docker Images with Ansible
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Deployment
docker-repo Router
Microservices
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
MicroProfile Configuration
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Configuration
•ApplicaLons need configuraLon based on their running
environment
•It must be possible to change configuraLon without repacking
the applicaLon
•Based on DeltaSpike Config, Apache Tamaya and Sabot
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Configuration
•Standalone or in a CDI Container
•Default Values
•Supports the most common Java Type (including OpLonal)
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Configuration
@Inject
@ConfigProperty(
name="NUMBER_TARGET_API",
defaultValue=“http://localhost:8081/
number-api/numbers/generate")
private String numberApiTargetUrl;
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Configuration
Config config = ConfigProvider.getConfig();
final String url =
config.getValue("NUMBER_TARGET_API",
String.class);
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Config Sources
•META-INF/microprofile-config.properLes
•System properLes
•Environment variables
•Pluggable to allow custom config sources and providers through
the ServiceLoader mechanism
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
MicroProfile Fault Tolerance
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Fault Tolerance
• Different strategies to guide the execuLon and result of some
logic
• Inspired by Hystrix and Failsafe
• Supports Sync and Async execuLon
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Fault Tolerance
• Depends on CDI
• Interceptor bindings
• Business method invocaLon
• Integrates with MP Config and Metrics
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Timeout
• Prevents the execuLon from waiLng forever
• Fail the execuLon if the Lmeout is hit
• Useful when calling other services
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Retry
• Invoke the same operaLon again
• Specify criteria on when to retry
• Recover from network glitchs
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Fallback
• Invoked when the original execuLon fails
• Specify when it fails
• Fallback to some other execuLon to prevent failures
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Circuit Breaker
• Prevent repeated failures
• Fail fast
• Can be open, half-open or closed
• Protect services
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Bulkhead
• Limit number of concurrent requests
• Access from mulLple contexts
• Prevent failures from cascading
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
MicroProfile Healthchecks
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Healthchecks
• Probe the state of a computer node
• Primary target cloud infrastructure
• Automated processes to maintain the state of nodes
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Healthchecks
• Simple API to specify health status
• /health JAX-RS endpoint reporLng server health
• Response status indicates if the health check passed
• Payload can include more detail
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Healthchecks
@Health
@ApplicationScoped
public class CheckDiskSpace implements HealthCheck {
public HealthCheckResponse call() {
}
}
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Healthchecks
GET /health
{
"outcome": "UP",
"checks": [{
"name": "diskspace",
"state": "UP",
"data": {
"key": "freebytes",
"freebytes": "126000000000"
}
}]
}
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Healthcheck Demo
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
MicroProfile Metrics
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Metrics
• Monitor essenLal System Parameters
• Ensure reliable operaLon of soiware
• Monitoring endpoints to collect data
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Metrics
• Accessible via REST interface
• /metrics/base for MP compliant servers
• /metrics/applicaLon for ApplicaLon specific Metrics
• /metrics/vendor for Server specific metrics
• OPTIONS provides metadata, such as Unit of measure
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
GET /metrics/base
{
  "thread.count" : 33,
  "thread.max.count" : 47,
  "memory.maxHeap" : 3817863211,
  "memory.usedHeap" : 16859081,
  "memory.committedHeap" : 64703546
}
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
OPTIONS /metrics/base
{
  "fooVal": {
    "unit": "milliseconds",
    "type": "gauge",
    "description": "The average duration of foo requests during last 5
minutes",
    "displayName": "Duration of foo",
    "tags": "app=webshop"
  },
  "barVal": {
    "unit": "megabytes",
    "type": "gauge",
    "tags": "component=backend,app=webshop"
  }
}
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Metrics
• @Counted
• @Metered
• @Timed
• @Gauge
• Histogram
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Application Metrics
@GET
@Path(“/{id}“)
@Metered(name = “BookResource.findById_meter”)
@Timed(name = “BookResource.findById_timer”,
unit = MetricUnits.MILLISECONDS,
absolute = true)
public Response findById(@PathParam(“id") final Long id) {
...
}
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
GET /metrics/application/{meter}
Meter
{
"{meter}": {
"count": 1,
"fifteenMinRate": 0.2,
"fiveMinRate": 0.2,
"meanRate": 0.015384615384615385,
"oneMinRate": 0.2,
"unit": "per_second"
}
}
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
GET /metrics/application/{timer}
Timed
{
"{timer}": {
"count": 1,
"fifteenMinRate": 0.2,
"fiveMinRate": 0.2,
"max": 13644163,
"mean": 13644163,
"meanRate": 0.015384615384615385,
"min": 13644163,
"oneMinRate": 0.2,
"p50": 13644163,
"p75": 13644163,
"p95": 13644163,
"p98": 13644163,
"p99": 13644163,
"p999": 13644163,
"stddev": 0
}
}
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
GET /metrics/application/{counter}
Counted
{
"{counter}": 156825
}
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Gauge
public class BookResource {
private AtomicLong booksAdded = new AtomicLong();
@Gauge(name="booksadded", unit = MetricUnits.NONE)
public long count() {
return booksAdded.get();
}
}
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
GET /metrics/application/{gauge}
Gauge
{
"{gauge}": 156825
}
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Histogram
public class BookResource {
@Inject
@Metric(name = "bookcount")
private Histogram histo;
public void update(long count) {
histo.update(count);
}
}
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
MicroProfile OpenTracing
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
OpenTracing
• Trace the flow of a request across services
• OpenTracing is a distributed tracing standard for applicaLons
• Java Binding to OpenTracing ImplementaLon
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
OpenTracing
• JAX-RS calls are traced
• Context propagated to services called with REST client
•X-B3-TraceId, X-B3-ParentSpanId, X-B3-SpanId
• Traces are collected and pushed to a database
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
OpenTracing
• OperaLons are measured in Spans
• Spans are grouped together into Traces
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
@Traced
@GET
@Path(“/books")
public Response findBooks() { }
Tracing CDI Calls
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
@ApplicationScoped
public class BookBean {
@Inject
private Tracer tracer;
public Book create(final Book book) {
final Span activeSpan = tracer.activeSpan();
final Tracer.SpanBuilder spanBuilder = tracer.buildSpan("create");
if (activeSpan != null) {
spanBuilder.asChildOf(activeSpan.context());
}
final Span span = spanBuilder.withTag("created", true).start();
tracer.scopeManager().activate(span, true);
// do work
span.finish();
return book;
}
}
OpenTracing
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Zipkin Demo
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
MicroProfile JWT Propagation
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Challenges in security
• Who is the caller?
• What can he do?
• How to propagate the security context?
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
JWT Propagation
• Security Tokens
• Most common: OAuth2, OpenID Connect JWT
• Lightweight way to propagate idenLLes across different services
• Complete example - hCps://github.com/tomitribe/microservice-
with-jwt-and-microprofile
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
JWT Propagation
• Role based access control
• Keys (JWKS)
• Standard configuraLon (MP Config)
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Goals
• Extract and verify the token
• IdenLfy the caller
• Enforce authorizaLon policies
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
What is a JWT?
• Pronounced “JOT”
• SAML like but less verbose
• Fancy JSON map
• BASE 64 URL encoded
• Digitally signed (RSA-SHA256, HMAC-SHA512, etc)
• Possibly encrypted
• Built-in expiraLon
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
@LoginConfig(authMethod = "MP-JWT")
public class ApplicationConfig extends Application {
// let the server discover the endpoints
}
——
@Inject
private JsonWebToken jwtPrincipal;
@Context
private SecurityContext securityContext;
@Inject
@Claim("username")
private ClaimValue<String> username;
@Inject
@Claim("email")
private ClaimValue<String> email;
——
@RolesAllowed("create")
public Response create(final Book book, @Context UriInfo uriInfo) {
...
}
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
MicroProfile OpenAPI
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Open API
• Java API for the OpenAPI v3 specificaLon
• OpenAPI v3 is based on Swagger v2
• AnnotaLons should be similar
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Configuration
@GET
@Path("/{id}")
@Operation(summary = "Find a Book by Id")
@APIResponse(responseCode = "200",
content = {@Content(schema =
@Schema(implementation = Book.class))})
public Response findById(@PathParam("id") final Long id) {
return bookBean.findById(id)
.map(Response::ok)
.orElse(status(NOT_FOUND))
.build();
}
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
paths:
/books/{id}:
get:
parameters:
- name: "id"
required: true
style: "simple"
schema:
readOnly: false
deprecated: false
description: "The id of the Book"
writeOnly: false
deprecated: false
summary: "Find a Book by Id"
responses:
200:
content:
application/json:
schema:
…
description: ""
operationId: "findById"
GET /openapi
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
OpenAPI Demo
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
MicroProfile REST Client
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
REST Client
• Microservices typically talk REST to other services
• Several JAX-RS implementaLons already support interface
definiLon
• Consistent and easy to reuse
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
REST Client
• Type safe REST Service over HTTP
• Extends JAX-RS 2.0 API’s
• More natural code style
• Similar to Feign
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Configuration
@RegisterRestClient
@Path(“/books")
public interface BookService {
@GET
@Path("/{id}")
Response findById(@PathParam("id") final Long id);
}
@ApplicationScoped
public class BookStore {
@Inject
@RestClient
private BookService client;
}
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
MicroProfile Starter
https://start.microprofile.io
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Future
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
MicroProfile Roadmap
• MicroProfile 3.0 by June 2019
• Major updates to Health and Metrics
• GraphQl, Long Running AcLons, Concurrency, ReacLve
Messaging, Event Data, ReacLve RelaLonal DB Access
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Get Involved
@dblevins @tomitribe
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Resources
• hCp://microprofile.io/
• hCp://tomee.apache.org
• hCps://github.com/radcortez/microprofile-samples
wm-jug
#wm-jug @jongallimore @JLouisMonteiro @tomitribe
Thank you!

More Related Content

Similar to Birmingham JUG Lightweight Microservices with Microprofile and Raspberry PIs

My Top Five DevOps Learnings
My Top Five DevOps LearningsMy Top Five DevOps Learnings
My Top Five DevOps Learnings
Predix
 
Leading A DevOps Transformation: Lessons Learned
Leading A DevOps Transformation: Lessons LearnedLeading A DevOps Transformation: Lessons Learned
Leading A DevOps Transformation: Lessons Learned
Gene Kim
 
Creando microservicios con Java MicroProfile y TomEE - OGBT
Creando microservicios con Java MicroProfile y TomEE  - OGBTCreando microservicios con Java MicroProfile y TomEE  - OGBT
Creando microservicios con Java MicroProfile y TomEE - OGBT
César Hernández
 
DevOps Patterns Distilled: Implementing The Needed Practices In Practical Steps
DevOps Patterns Distilled: Implementing The Needed Practices In Practical StepsDevOps Patterns Distilled: Implementing The Needed Practices In Practical Steps
DevOps Patterns Distilled: Implementing The Needed Practices In Practical Steps
CA Technologies
 
Voxxed days cluj-napoca Nowadays architecture trends alberto_salazarv2
Voxxed days cluj-napoca Nowadays architecture trends alberto_salazarv2Voxxed days cluj-napoca Nowadays architecture trends alberto_salazarv2
Voxxed days cluj-napoca Nowadays architecture trends alberto_salazarv2
Alberto Salazar
 
DevOps: Who Will Create $2.6 Trillion In Business Value Per Year?
DevOps: Who Will Create $2.6 Trillion In Business Value Per Year?DevOps: Who Will Create $2.6 Trillion In Business Value Per Year?
DevOps: Who Will Create $2.6 Trillion In Business Value Per Year?
Gene Kim
 
ES~Conference Mexico Nowadays Architecture Trends, from Monolith to Microserv...
ES~Conference Mexico Nowadays Architecture Trends, from Monolith to Microserv...ES~Conference Mexico Nowadays Architecture Trends, from Monolith to Microserv...
ES~Conference Mexico Nowadays Architecture Trends, from Monolith to Microserv...
Alberto Salazar
 
2019 Top Lessons Learned Since the Phoenix Project Was Released
2019 Top Lessons Learned Since the Phoenix Project Was Released2019 Top Lessons Learned Since the Phoenix Project Was Released
2019 Top Lessons Learned Since the Phoenix Project Was Released
Gene Kim
 
How to build a SaaS solution in 60 days
How to build a SaaS solution in 60 daysHow to build a SaaS solution in 60 days
How to build a SaaS solution in 60 days
Brett McLain
 
The Unicorn Project and The Five Ideals (Updated Dec 2019)
The Unicorn Project and The Five Ideals (Updated Dec 2019)The Unicorn Project and The Five Ideals (Updated Dec 2019)
The Unicorn Project and The Five Ideals (Updated Dec 2019)
Gene Kim
 
Test code that will not slow you down
Test code that will not slow you downTest code that will not slow you down
Test code that will not slow you down
Kostadin Golev
 
Rendering strategies: Measuring the devil's details in core web vitals - Jam...
Rendering strategies:  Measuring the devil's details in core web vitals - Jam...Rendering strategies:  Measuring the devil's details in core web vitals - Jam...
Rendering strategies: Measuring the devil's details in core web vitals - Jam...
Jamie Indigo
 
Devnexus - Nowadays Architecture Trends, from Monolith to Microservices and S...
Devnexus - Nowadays Architecture Trends, from Monolith to Microservices and S...Devnexus - Nowadays Architecture Trends, from Monolith to Microservices and S...
Devnexus - Nowadays Architecture Trends, from Monolith to Microservices and S...
Alberto Salazar
 
Infosec at Ludicrous Speeds - Rugged DevOps
Infosec at Ludicrous Speeds - Rugged DevOps Infosec at Ludicrous Speeds - Rugged DevOps
Infosec at Ludicrous Speeds - Rugged DevOps
Gene Kim
 
MongoDB Mobile
MongoDB Mobile MongoDB Mobile
MongoDB Mobile
MongoDB
 
Docker and Devops
Docker and DevopsDocker and Devops
Docker and Devops
Docker, Inc.
 
The Unicorn Project and the Five Ideals.pdf
The Unicorn Project and the Five Ideals.pdfThe Unicorn Project and the Five Ideals.pdf
The Unicorn Project and the Five Ideals.pdf
VMware Tanzu
 
Orchestration, the conductor's score
Orchestration, the conductor's scoreOrchestration, the conductor's score
Orchestration, the conductor's score
Salesforce Engineering
 
Bye Bye Charles, Welcome Odo, Android Meetup Berlin May 2014
Bye Bye Charles, Welcome Odo, Android Meetup Berlin May 2014Bye Bye Charles, Welcome Odo, Android Meetup Berlin May 2014
Bye Bye Charles, Welcome Odo, Android Meetup Berlin May 2014
Danny Preussler
 
Jconf Colombia Nowadays Architecture Trends, from Monolith to Microservices a...
Jconf Colombia Nowadays Architecture Trends, from Monolith to Microservices a...Jconf Colombia Nowadays Architecture Trends, from Monolith to Microservices a...
Jconf Colombia Nowadays Architecture Trends, from Monolith to Microservices a...
Alberto Salazar
 

Similar to Birmingham JUG Lightweight Microservices with Microprofile and Raspberry PIs (20)

My Top Five DevOps Learnings
My Top Five DevOps LearningsMy Top Five DevOps Learnings
My Top Five DevOps Learnings
 
Leading A DevOps Transformation: Lessons Learned
Leading A DevOps Transformation: Lessons LearnedLeading A DevOps Transformation: Lessons Learned
Leading A DevOps Transformation: Lessons Learned
 
Creando microservicios con Java MicroProfile y TomEE - OGBT
Creando microservicios con Java MicroProfile y TomEE  - OGBTCreando microservicios con Java MicroProfile y TomEE  - OGBT
Creando microservicios con Java MicroProfile y TomEE - OGBT
 
DevOps Patterns Distilled: Implementing The Needed Practices In Practical Steps
DevOps Patterns Distilled: Implementing The Needed Practices In Practical StepsDevOps Patterns Distilled: Implementing The Needed Practices In Practical Steps
DevOps Patterns Distilled: Implementing The Needed Practices In Practical Steps
 
Voxxed days cluj-napoca Nowadays architecture trends alberto_salazarv2
Voxxed days cluj-napoca Nowadays architecture trends alberto_salazarv2Voxxed days cluj-napoca Nowadays architecture trends alberto_salazarv2
Voxxed days cluj-napoca Nowadays architecture trends alberto_salazarv2
 
DevOps: Who Will Create $2.6 Trillion In Business Value Per Year?
DevOps: Who Will Create $2.6 Trillion In Business Value Per Year?DevOps: Who Will Create $2.6 Trillion In Business Value Per Year?
DevOps: Who Will Create $2.6 Trillion In Business Value Per Year?
 
ES~Conference Mexico Nowadays Architecture Trends, from Monolith to Microserv...
ES~Conference Mexico Nowadays Architecture Trends, from Monolith to Microserv...ES~Conference Mexico Nowadays Architecture Trends, from Monolith to Microserv...
ES~Conference Mexico Nowadays Architecture Trends, from Monolith to Microserv...
 
2019 Top Lessons Learned Since the Phoenix Project Was Released
2019 Top Lessons Learned Since the Phoenix Project Was Released2019 Top Lessons Learned Since the Phoenix Project Was Released
2019 Top Lessons Learned Since the Phoenix Project Was Released
 
How to build a SaaS solution in 60 days
How to build a SaaS solution in 60 daysHow to build a SaaS solution in 60 days
How to build a SaaS solution in 60 days
 
The Unicorn Project and The Five Ideals (Updated Dec 2019)
The Unicorn Project and The Five Ideals (Updated Dec 2019)The Unicorn Project and The Five Ideals (Updated Dec 2019)
The Unicorn Project and The Five Ideals (Updated Dec 2019)
 
Test code that will not slow you down
Test code that will not slow you downTest code that will not slow you down
Test code that will not slow you down
 
Rendering strategies: Measuring the devil's details in core web vitals - Jam...
Rendering strategies:  Measuring the devil's details in core web vitals - Jam...Rendering strategies:  Measuring the devil's details in core web vitals - Jam...
Rendering strategies: Measuring the devil's details in core web vitals - Jam...
 
Devnexus - Nowadays Architecture Trends, from Monolith to Microservices and S...
Devnexus - Nowadays Architecture Trends, from Monolith to Microservices and S...Devnexus - Nowadays Architecture Trends, from Monolith to Microservices and S...
Devnexus - Nowadays Architecture Trends, from Monolith to Microservices and S...
 
Infosec at Ludicrous Speeds - Rugged DevOps
Infosec at Ludicrous Speeds - Rugged DevOps Infosec at Ludicrous Speeds - Rugged DevOps
Infosec at Ludicrous Speeds - Rugged DevOps
 
MongoDB Mobile
MongoDB Mobile MongoDB Mobile
MongoDB Mobile
 
Docker and Devops
Docker and DevopsDocker and Devops
Docker and Devops
 
The Unicorn Project and the Five Ideals.pdf
The Unicorn Project and the Five Ideals.pdfThe Unicorn Project and the Five Ideals.pdf
The Unicorn Project and the Five Ideals.pdf
 
Orchestration, the conductor's score
Orchestration, the conductor's scoreOrchestration, the conductor's score
Orchestration, the conductor's score
 
Bye Bye Charles, Welcome Odo, Android Meetup Berlin May 2014
Bye Bye Charles, Welcome Odo, Android Meetup Berlin May 2014Bye Bye Charles, Welcome Odo, Android Meetup Berlin May 2014
Bye Bye Charles, Welcome Odo, Android Meetup Berlin May 2014
 
Jconf Colombia Nowadays Architecture Trends, from Monolith to Microservices a...
Jconf Colombia Nowadays Architecture Trends, from Monolith to Microservices a...Jconf Colombia Nowadays Architecture Trends, from Monolith to Microservices a...
Jconf Colombia Nowadays Architecture Trends, from Monolith to Microservices a...
 

Recently uploaded

UI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
UI5con 2024 - Boost Your Development Experience with UI5 Tooling ExtensionsUI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
UI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
Peter Muessig
 
Automated software refactoring with OpenRewrite and Generative AI.pptx.pdf
Automated software refactoring with OpenRewrite and Generative AI.pptx.pdfAutomated software refactoring with OpenRewrite and Generative AI.pptx.pdf
Automated software refactoring with OpenRewrite and Generative AI.pptx.pdf
timtebeek1
 
E-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian Companies
E-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian CompaniesE-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian Companies
E-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian Companies
Quickdice ERP
 
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Crescat
 
Using Xen Hypervisor for Functional Safety
Using Xen Hypervisor for Functional SafetyUsing Xen Hypervisor for Functional Safety
Using Xen Hypervisor for Functional Safety
Ayan Halder
 
Oracle Database 19c New Features for DBAs and Developers.pptx
Oracle Database 19c New Features for DBAs and Developers.pptxOracle Database 19c New Features for DBAs and Developers.pptx
Oracle Database 19c New Features for DBAs and Developers.pptx
Remote DBA Services
 
Artificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension FunctionsArtificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension Functions
Octavian Nadolu
 
LORRAINE ANDREI_LEQUIGAN_HOW TO USE WHATSAPP.pptx
LORRAINE ANDREI_LEQUIGAN_HOW TO USE WHATSAPP.pptxLORRAINE ANDREI_LEQUIGAN_HOW TO USE WHATSAPP.pptx
LORRAINE ANDREI_LEQUIGAN_HOW TO USE WHATSAPP.pptx
lorraineandreiamcidl
 
Measures in SQL (SIGMOD 2024, Santiago, Chile)
Measures in SQL (SIGMOD 2024, Santiago, Chile)Measures in SQL (SIGMOD 2024, Santiago, Chile)
Measures in SQL (SIGMOD 2024, Santiago, Chile)
Julian Hyde
 
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
Łukasz Chruściel
 
E-commerce Application Development Company.pdf
E-commerce Application Development Company.pdfE-commerce Application Development Company.pdf
E-commerce Application Development Company.pdf
Hornet Dynamics
 
Hand Rolled Applicative User Validation Code Kata
Hand Rolled Applicative User ValidationCode KataHand Rolled Applicative User ValidationCode Kata
Hand Rolled Applicative User Validation Code Kata
Philip Schwarz
 
Using Query Store in Azure PostgreSQL to Understand Query Performance
Using Query Store in Azure PostgreSQL to Understand Query PerformanceUsing Query Store in Azure PostgreSQL to Understand Query Performance
Using Query Store in Azure PostgreSQL to Understand Query Performance
Grant Fritchey
 
OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024
OpenMetadata
 
GreenCode-A-VSCode-Plugin--Dario-Jurisic
GreenCode-A-VSCode-Plugin--Dario-JurisicGreenCode-A-VSCode-Plugin--Dario-Jurisic
GreenCode-A-VSCode-Plugin--Dario-Jurisic
Green Software Development
 
Atelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissancesAtelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissances
Neo4j
 
KuberTENes Birthday Bash Guadalajara - Introducción a Argo CD
KuberTENes Birthday Bash Guadalajara - Introducción a Argo CDKuberTENes Birthday Bash Guadalajara - Introducción a Argo CD
KuberTENes Birthday Bash Guadalajara - Introducción a Argo CD
rodomar2
 
Neo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
Neo4j - Product Vision and Knowledge Graphs - GraphSummit ParisNeo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
Neo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
Neo4j
 
What is Augmented Reality Image Tracking
What is Augmented Reality Image TrackingWhat is Augmented Reality Image Tracking
What is Augmented Reality Image Tracking
pavan998932
 
Webinar On-Demand: Using Flutter for Embedded
Webinar On-Demand: Using Flutter for EmbeddedWebinar On-Demand: Using Flutter for Embedded
Webinar On-Demand: Using Flutter for Embedded
ICS
 

Recently uploaded (20)

UI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
UI5con 2024 - Boost Your Development Experience with UI5 Tooling ExtensionsUI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
UI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
 
Automated software refactoring with OpenRewrite and Generative AI.pptx.pdf
Automated software refactoring with OpenRewrite and Generative AI.pptx.pdfAutomated software refactoring with OpenRewrite and Generative AI.pptx.pdf
Automated software refactoring with OpenRewrite and Generative AI.pptx.pdf
 
E-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian Companies
E-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian CompaniesE-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian Companies
E-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian Companies
 
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
 
Using Xen Hypervisor for Functional Safety
Using Xen Hypervisor for Functional SafetyUsing Xen Hypervisor for Functional Safety
Using Xen Hypervisor for Functional Safety
 
Oracle Database 19c New Features for DBAs and Developers.pptx
Oracle Database 19c New Features for DBAs and Developers.pptxOracle Database 19c New Features for DBAs and Developers.pptx
Oracle Database 19c New Features for DBAs and Developers.pptx
 
Artificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension FunctionsArtificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension Functions
 
LORRAINE ANDREI_LEQUIGAN_HOW TO USE WHATSAPP.pptx
LORRAINE ANDREI_LEQUIGAN_HOW TO USE WHATSAPP.pptxLORRAINE ANDREI_LEQUIGAN_HOW TO USE WHATSAPP.pptx
LORRAINE ANDREI_LEQUIGAN_HOW TO USE WHATSAPP.pptx
 
Measures in SQL (SIGMOD 2024, Santiago, Chile)
Measures in SQL (SIGMOD 2024, Santiago, Chile)Measures in SQL (SIGMOD 2024, Santiago, Chile)
Measures in SQL (SIGMOD 2024, Santiago, Chile)
 
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
 
E-commerce Application Development Company.pdf
E-commerce Application Development Company.pdfE-commerce Application Development Company.pdf
E-commerce Application Development Company.pdf
 
Hand Rolled Applicative User Validation Code Kata
Hand Rolled Applicative User ValidationCode KataHand Rolled Applicative User ValidationCode Kata
Hand Rolled Applicative User Validation Code Kata
 
Using Query Store in Azure PostgreSQL to Understand Query Performance
Using Query Store in Azure PostgreSQL to Understand Query PerformanceUsing Query Store in Azure PostgreSQL to Understand Query Performance
Using Query Store in Azure PostgreSQL to Understand Query Performance
 
OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024
 
GreenCode-A-VSCode-Plugin--Dario-Jurisic
GreenCode-A-VSCode-Plugin--Dario-JurisicGreenCode-A-VSCode-Plugin--Dario-Jurisic
GreenCode-A-VSCode-Plugin--Dario-Jurisic
 
Atelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissancesAtelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissances
 
KuberTENes Birthday Bash Guadalajara - Introducción a Argo CD
KuberTENes Birthday Bash Guadalajara - Introducción a Argo CDKuberTENes Birthday Bash Guadalajara - Introducción a Argo CD
KuberTENes Birthday Bash Guadalajara - Introducción a Argo CD
 
Neo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
Neo4j - Product Vision and Knowledge Graphs - GraphSummit ParisNeo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
Neo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
 
What is Augmented Reality Image Tracking
What is Augmented Reality Image TrackingWhat is Augmented Reality Image Tracking
What is Augmented Reality Image Tracking
 
Webinar On-Demand: Using Flutter for Embedded
Webinar On-Demand: Using Flutter for EmbeddedWebinar On-Demand: Using Flutter for Embedded
Webinar On-Demand: Using Flutter for Embedded
 

Birmingham JUG Lightweight Microservices with Microprofile and Raspberry PIs