SlideShare a Scribd company logo
Microservices with Micronaut
2021-09-01 - Moritz Kammerer
WeAreDevelopers
About me
● 2013 M.Sc. Computer Science @ Munich
University of Applied Sciences
● 2013 Software Engineer @ QAware
● …
● 2021 Expert Software Engineer @ QAware
Working on backend stuff, mostly Java.
LinkedIn | GitHub
Why Cloud?
What’s the problem?
Why does it take so long?
● Start time of Spring (Boot)
○ Depends on the number of beans in the context
○ Reading of bytecode [3]
○ Creating proxies at runtime
○ Runtime AOP
○ Reflection
○ Annotation Synthesizing [1] [2]
● Memory usage
○ Reflective Metadata Cache
● Debugging
○ Very very long stacktraces
○ … with code in dynamically generated proxy classes
[1] https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/annotation/AnnotationUtils.html
[2] https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/annotation/AliasFor.html
[3] https://github.com/spring-projects/spring-framework/blob/master/spring-core/src/main/java/org/springframework/core/type/classreading/AbstractRecursiveAnnotationVisitor.java
Micronaut to the rescue!
What’s the (promised) solution?
● Create stuff at compile time
○ Proxies
○ Dependency Injection
○ AOP
● Why?
○ Compiled once, run often
○ Tradeoff: Compile time vs. Runtime
● Goal:
○ No reflection - or as little as possible
○ No proxies
○ Minimize startup time
○ Minimize memory usage
○ Readable stacktraces
And how does that work?
● Annotation Processor
○ Reads bytecode & annotations of the classes
○ Creates new classes
○ Doesn’t touch your code, just extends it
● Gradle
○ annotationProcessor "io.micronaut:micronaut-inject-java"
○ annotationProcessor "io.micronaut:micronaut-validation"
● Also runs with Maven
○ < Insert 500 KB of XML here >
And this is really working?
● Spring Boot 2.1.2 (starter-web), Java 11, @Component on empty class
○ 0 Beans: 1.236 seconds
○ 1000 Beans: 1.808 seconds
○ 2000 Beans: 2.356 seconds
○ 4000 Beans: 3.259 seconds
○ 8000 Beans: 6.498 seconds
○ 16000 Beans: 9.231 seconds
● Micronaut 1.0.4, Java 11, @Singleton on empty class
○ 0 Beans: 1085ms
○ 1000 Beans: 1870ms
○ 2000 Beans: 2757ms
○ 4000 Beans: 4529ms
○ 8000 Beans: 8038ms
○ 16000 Beans: 15861ms
Hmmmm...
Debunked: It’s not the classpath scanning
● Not so expensive:
○ Classpath scanning (Spring)
○ Injection with reflection (Spring)
● Expensive
○ Class Loading (Micronaut + Spring)
○ Runtime AOP Proxies (Spring)
○ Annotation Synthesizing (Spring)
○ Read bytecode on big classes (Spring)
○ Auto-Configuration Magic (Spring)
● Most of the expensive stuff is done at Micronaut compile time
Looks great, so not disadvantages?
The price you pay: Compile time (16k Beans)
Spring:
[INFO] Total time: 7.958 s
Micronaut:
BUILD SUCCESSFUL in 5m 3s
Benchmarking is hard!
● This was NOT a real benchmark
● Most time spent in the applications shown on the first slides: Spring
autoconfiguration magic
● It really depends on the needed feature of your application
○ Actuator
○ JPA / Hibernate
○ Tracing
○ Metrics
○ @FeignClient
○ @Transactional
○ @Cacheable
○ …
● Real benchmarks later in the slides :)
Okay... what else does Micronaut bring to the table?
● Dependency Injection
○ @Inject, @Named, @Singleton, @Prototype, ...
● REST Controller
○ @Controller, @GET, @POST, …
● Events
○ @PostConstruct
○ @EventListener
● AOP
○ Around Advice, Introduction Advice, …
● Validation
○ @Validated, @NotNull, ...
...
● Caching
○ @Cachable, @CacheInvalidate, …
● Retry
○ @Retryable
● Circuit Breaking
○ @CircuitBreaker
● Fallback / Recovery
○ @Recoverable / @Fallback
● Scheduling
○ @Scheduled
...
● Reactive & Blocking HTTP with Netty
○ Compile Time Route Validation
○ @Error Exception Handling ala Spring
● Websocket Server & Clients
● Server side views
○ Thymeleaf, Handlebars, Velocity
● OpenAPI / Swagger
○ Open API spec is created on compile time!
● HTTP Clients
○ @Client
○ Client-side load balancing
○ Service discovery (Consul, Eureka, K8S, Route 53, DNS based)
○ OpenTracing (Zipkin, Jaeger)
...
● Application Configuration
○ application.yml / .json / .groovy
○ Different Environments
○ Property Sources (ENV, System Properties, …)
○ @ConfigurationProperties, @Value
○ Distributed config with Consul, AWS Parameter Store
● Database support
○ JPA, Mongo, Neo4J, Postgres-Reactive, Redis, Cassandra
● Monitoring
○ @Endpoint (/beans, /info, /health, …)
○ Metrics with Micrometer
○ Change log level at runtime
...
● Security
○ Like Spring Security with users and roles (RBAC)
○ Basic Auth / Session based
○ JWT (JWS and JWE) incl. automatic token propagation
○ Auth with LDAP
● Function-as-a-Service (AWS Lambda, OpenFaaS)
● Message driven services (RabbitMQ / Kafka)
● CLI applications
● Good documentation!
○ e.g. with tutorials for Let’s Encrypt, starting Consul, etc.
Enough bla bla, show code!
Service to be
written github.com
My browser
HTTP Server
HTTP Client
The Internet
Bootstrapping a project
mn create-app --build=maven demo
Creating a HTTP endpoint
Dependency Injection
Message: No bean of type [demo.service.ProjectService] exists.
Path Taken: new ProjectsController(ProjectService projectService) --> new ProjectsController([ProjectService
projectService])
Failed to inject value for parameter [projectService] of class: demo.ProjectsController
Service to be
written github.com
My browser
HTTP Server
HTTP Client
The Internet
Creating a HTTP client
https://api.github.com/search/repositories?q=stars:%3E1&sort=stars
Caching
application.yml
1st request 2nd request
Failure Recovery
Scheduled beans
Reading configuration values
application.yml
Benchmarks
Spring vs. Micronaut - GitHub Scraper
Micronaut 2.2.1
BUILD SUCCESSFUL in 3s
0,89s user 0,07s system 22% cpu 4,199 total
Startup completed in 625ms
Spring vs. Micronaut - GitHub Scraper
Spring 2.4.1
BUILD SUCCESSFUL in 1s
0,86s user 0,09s system 67% cpu 1,414 total
Started DemoApplication in 1.21 seconds (JVM running for 1.556)
Micronaut (JAR: 14.8 MB)
java -Xms16M -Xmx512M -jar github-scraper-0.1-all.jar / OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.9+11)
Micronaut
wrk -t 8 -c 80 -d 30s --latency http://localhost:8080/github/stars
Running 30s test @ http://localhost:8080/github/stars
8 threads and 80 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 2.21ms 5.33ms 139.33ms 91.82%
Req/Sec 15.22k 5.34k 27.39k 72.74%
Latency Distribution
50% 286.00us
75% 1.98ms
90% 6.44ms
99% 22.34ms
2765210 requests in 30.07s, 1.38GB read
Requests/sec: 91956.68
Transfer/sec: 47.01MB
Spring Boot (JAR: 30.6 MB)
java -Xms16M -Xmx512M -jar github-scraper-spring-0.0.1-SNAPSHOT.jar / OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.9+11)
Spring Boot
wrk -t 8 -c 80 -d 30s --latency http://localhost:8080/github/stars
Running 30s test @ http://localhost:8080/github/stars
8 threads and 80 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 10.23ms 65.15ms 778.07ms 97.82%
Req/Sec 9.29k 2.69k 14.24k 78.93%
Latency Distribution
50% 0.87ms
75% 1.55ms
90% 3.36ms
99% 414.50ms
2169903 requests in 30.10s, 1.07GB read
Requests/sec: 72091.42
Transfer/sec: 36.38MB
How much RAM do I have to use?
Minimal Heap Size - Micronaut (-Xmx32M)
Minimal Heap Size - Micronaut (-Xmx32M)
wrk -t 8 -c 80 -d 30s --latency http://localhost:8080/github/stars
Running 30s test @ http://localhost:8080/github/stars
8 threads and 80 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 2.68ms 6.40ms 135.54ms 91.54%
Req/Sec 11.34k 4.58k 23.37k 68.22%
Latency Distribution
50% 270.00us
75% 2.58ms
90% 8.02ms
99% 27.00ms
1717518 requests in 30.06s, 631.95MB read
Socket errors: connect 0, read 0, write 0, timeout 80
Requests/sec: 57134.45
Transfer/sec: 21.02MB
Minimal Heap Size - Spring (-Xmx32M)
Minimal Heap Size - Spring (-Xmx32M)
wrk -t 8 -c 80 -d 30s --latency http://localhost:8080/github/stars
Running 30s test @ http://localhost:8080/github/stars
8 threads and 80 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 16.38ms 87.16ms 955.97ms 97.33%
Req/Sec 3.92k 1.19k 6.21k 75.93%
Latency Distribution
50% 2.11ms
75% 4.21ms
90% 8.59ms
99% 578.98ms
905844 requests in 30.05s, 457.16MB read
Requests/sec: 30148.82
Transfer/sec: 15.22MB
Minimal Heap Size - Spring (-Xmx64M)
Minimal Heap Size - Spring (-Xmx64M)
wrk -t 8 -c 80 -d 30s --latency http://localhost:8080/github/stars
Running 30s test @ http://localhost:8080/github/stars
8 threads and 80 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 10.50ms 66.17ms 786.18ms 97.73%
Req/Sec 8.60k 2.27k 13.25k 79.23%
Latency Distribution
50% 0.95ms
75% 1.68ms
90% 3.30ms
99% 423.31ms
2006502 requests in 30.09s, 0.99GB read
Requests/sec: 66689.38
Transfer/sec: 33.66MB
Minimal Heap Size - Micronaut (-Xmx64M)
Minimal Heap Size - Micronaut (-Xmx64M)
wrk -t 8 -c 80 -d 30s --latency http://localhost:8080/github/stars
Running 30s test @ http://localhost:8080/github/stars
8 threads and 80 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 2.28ms 5.05ms 95.77ms 90.92%
Req/Sec 14.11k 5.15k 25.09k 73.51%
Latency Distribution
50% 283.00us
75% 2.12ms
90% 6.78ms
99% 23.54ms
2451595 requests in 30.06s, 1.22GB read
Requests/sec: 81556.51
Transfer/sec: 41.69MB
Graal VM
“High-performance polyglot VM”
(and AOT compiler)
Graal Substrate VM
$ ./gradlew nativeImage (or ./mvnw package -Dpackaging=native-image)
… 2 minutes later …
$ file application
application: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked,
interpreter /lib64/ld-linux-x86-64.so.2 for GNU/Linux 3.2.0, with debug_info, not stripped
$ ll application
-rwxr-xr-x. 1 moe moe 62M 18. Dez 11:29 application
$ ldd application
linux-vdso.so.1 (0x00007ffd7cbbe000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fc717414000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fc71740d000)
libz.so.1 => /lib64/libz.so.1 (0x00007fc7173f3000)
librt.so.1 => /lib64/librt.so.1 (0x00007fc7173e8000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fc7173cd000)
libc.so.6 => /lib64/libc.so.6 (0x00007fc717202000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc717456000)
Graal (no -Xmx set)
KB = 92 MB
Idle:
Under load:
Startup completed in 67ms.
Graal - Benchmark
wrk -t 8 -c 80 -d 30s --latency http://localhost:8080/github/stars
Running 30s test @ http://localhost:8080/github/stars
8 threads and 80 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.60ms 2.28ms 41.76ms 86.51%
Req/Sec 8.88k 1.21k 12.09k 79.71%
Latency Distribution
50% 416.00us
75% 2.34ms
90% 4.61ms
99% 10.16ms
1355757 requests in 30.04s, 305.29MB read
Socket errors: connect 0, read 0, write 0, timeout 80
Requests/sec: 45130.28
Transfer/sec: 10.16MB
Conclusion
Experience from the trenches
Pro:
● Services start faster than Spring Boot
● Smaller JARs
● Tests are faster, as the embedded server starts fast
○ Spring mitigates this with application context caching!
Contra:
● No separation of management and API port
● Spring Boot is more common (more documentation, blog posts, Stack
Overflow answers)
● Extension story from Spring is better (e.g. OAuth2)
Conclusion
● Good documentation
● Recommendation for writing small services
○ I have no experience with bigger services in Micronaut. If you have, please contact me :)
● Development is fun
● If the features are sufficient: Try it!
● GraalVM Substrate VM, if you get it to run, is really cool
○ This is NOT a JVM, so profilers / metrics / thread dumps etc. won’t work
○ Build times like it’s C++ (> 30s)
○ Not all libraries are compatible and workarounds must be used
■ I ran into trouble with Caffeine Cache (GitHub Issue)
Literature
● GitHub Repo: https://github.com/qaware/microservices-with-micronaut
● Micronaut documentation: https://docs.micronaut.io/latest/guide/index.html
● GraalVM: https://www.graalvm.org/
Questions?
Contact: moritz.kammerer@qaware.de

More Related Content

What's hot

Brian Ketelsen - Microservices in Go using Micro - Codemotion Milan 2017
Brian Ketelsen - Microservices in Go using Micro - Codemotion Milan 2017Brian Ketelsen - Microservices in Go using Micro - Codemotion Milan 2017
Brian Ketelsen - Microservices in Go using Micro - Codemotion Milan 2017
Codemotion
 
NetflixOSS season 2 episode 2 - Reactive / Async
NetflixOSS   season 2 episode 2 - Reactive / AsyncNetflixOSS   season 2 episode 2 - Reactive / Async
NetflixOSS season 2 episode 2 - Reactive / Async
Ruslan Meshenberg
 
Multi tenancy for docker
Multi tenancy for dockerMulti tenancy for docker
Multi tenancy for docker
Ananth Padmanabhan
 
Real World Enterprise Reactive Programming using Vert.x
Real World Enterprise Reactive Programming using Vert.xReal World Enterprise Reactive Programming using Vert.x
Real World Enterprise Reactive Programming using Vert.x
Sascha Möllering
 
QCon NYC: Distributed systems in practice, in theory
QCon NYC: Distributed systems in practice, in theoryQCon NYC: Distributed systems in practice, in theory
QCon NYC: Distributed systems in practice, in theory
Aysylu Greenberg
 
Building your own NSQL store
Building your own NSQL storeBuilding your own NSQL store
Building your own NSQL store
Edward Capriolo
 
GIDS_what does_cloud-native_mean_anyway?
GIDS_what does_cloud-native_mean_anyway?GIDS_what does_cloud-native_mean_anyway?
GIDS_what does_cloud-native_mean_anyway?
Grace Jansen
 
Kubernetes Summit 2019 - Harden Your Kubernetes Cluster
Kubernetes Summit 2019 - Harden Your Kubernetes ClusterKubernetes Summit 2019 - Harden Your Kubernetes Cluster
Kubernetes Summit 2019 - Harden Your Kubernetes Cluster
smalltown
 
Node js internal
Node js internalNode js internal
Node js internal
Chinh Ngo Nguyen
 
Reactive applications and microservices with Vert.x tool-kit
Reactive applications and microservices with Vert.x tool-kitReactive applications and microservices with Vert.x tool-kit
Reactive applications and microservices with Vert.x tool-kit
Victor Hugo
 
2 Day Bootcamp for OpenStack--Cloud Training by Mirantis (Preview)
2 Day Bootcamp for OpenStack--Cloud Training by Mirantis (Preview)2 Day Bootcamp for OpenStack--Cloud Training by Mirantis (Preview)
2 Day Bootcamp for OpenStack--Cloud Training by Mirantis (Preview)
Mirantis
 
Openstack meetup-pune-aug22-overview
Openstack meetup-pune-aug22-overviewOpenstack meetup-pune-aug22-overview
Openstack meetup-pune-aug22-overview
rajdeep
 
Building a multi-tenant cloud service from legacy code with Docker containers
Building a multi-tenant cloud service from legacy code with Docker containersBuilding a multi-tenant cloud service from legacy code with Docker containers
Building a multi-tenant cloud service from legacy code with Docker containers
aslomibm
 
Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...
Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...
Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...
Felix Gessert
 
VMware Hybrid Cloud Service - Overview
VMware Hybrid Cloud Service - OverviewVMware Hybrid Cloud Service - Overview
VMware Hybrid Cloud Service - Overview
rajdeep
 
Orchestration tool roundup - OpenStack Israel summit - kubernetes vs. docker...
Orchestration tool roundup  - OpenStack Israel summit - kubernetes vs. docker...Orchestration tool roundup  - OpenStack Israel summit - kubernetes vs. docker...
Orchestration tool roundup - OpenStack Israel summit - kubernetes vs. docker...
Uri Cohen
 
Locking down your Kubernetes cluster with Linkerd
Locking down your Kubernetes cluster with LinkerdLocking down your Kubernetes cluster with Linkerd
Locking down your Kubernetes cluster with Linkerd
Buoyant
 
Monitoring and Tuning GlassFish
Monitoring and Tuning GlassFishMonitoring and Tuning GlassFish
Monitoring and Tuning GlassFish
C2B2 Consulting
 
Powering Microservices with Docker, Kubernetes, Kafka, & MongoDB
Powering Microservices with Docker, Kubernetes, Kafka, & MongoDBPowering Microservices with Docker, Kubernetes, Kafka, & MongoDB
Powering Microservices with Docker, Kubernetes, Kafka, & MongoDB
MongoDB
 
Service Discovery In Kubernetes
Service Discovery In KubernetesService Discovery In Kubernetes
Service Discovery In Kubernetes
Knoldus Inc.
 

What's hot (20)

Brian Ketelsen - Microservices in Go using Micro - Codemotion Milan 2017
Brian Ketelsen - Microservices in Go using Micro - Codemotion Milan 2017Brian Ketelsen - Microservices in Go using Micro - Codemotion Milan 2017
Brian Ketelsen - Microservices in Go using Micro - Codemotion Milan 2017
 
NetflixOSS season 2 episode 2 - Reactive / Async
NetflixOSS   season 2 episode 2 - Reactive / AsyncNetflixOSS   season 2 episode 2 - Reactive / Async
NetflixOSS season 2 episode 2 - Reactive / Async
 
Multi tenancy for docker
Multi tenancy for dockerMulti tenancy for docker
Multi tenancy for docker
 
Real World Enterprise Reactive Programming using Vert.x
Real World Enterprise Reactive Programming using Vert.xReal World Enterprise Reactive Programming using Vert.x
Real World Enterprise Reactive Programming using Vert.x
 
QCon NYC: Distributed systems in practice, in theory
QCon NYC: Distributed systems in practice, in theoryQCon NYC: Distributed systems in practice, in theory
QCon NYC: Distributed systems in practice, in theory
 
Building your own NSQL store
Building your own NSQL storeBuilding your own NSQL store
Building your own NSQL store
 
GIDS_what does_cloud-native_mean_anyway?
GIDS_what does_cloud-native_mean_anyway?GIDS_what does_cloud-native_mean_anyway?
GIDS_what does_cloud-native_mean_anyway?
 
Kubernetes Summit 2019 - Harden Your Kubernetes Cluster
Kubernetes Summit 2019 - Harden Your Kubernetes ClusterKubernetes Summit 2019 - Harden Your Kubernetes Cluster
Kubernetes Summit 2019 - Harden Your Kubernetes Cluster
 
Node js internal
Node js internalNode js internal
Node js internal
 
Reactive applications and microservices with Vert.x tool-kit
Reactive applications and microservices with Vert.x tool-kitReactive applications and microservices with Vert.x tool-kit
Reactive applications and microservices with Vert.x tool-kit
 
2 Day Bootcamp for OpenStack--Cloud Training by Mirantis (Preview)
2 Day Bootcamp for OpenStack--Cloud Training by Mirantis (Preview)2 Day Bootcamp for OpenStack--Cloud Training by Mirantis (Preview)
2 Day Bootcamp for OpenStack--Cloud Training by Mirantis (Preview)
 
Openstack meetup-pune-aug22-overview
Openstack meetup-pune-aug22-overviewOpenstack meetup-pune-aug22-overview
Openstack meetup-pune-aug22-overview
 
Building a multi-tenant cloud service from legacy code with Docker containers
Building a multi-tenant cloud service from legacy code with Docker containersBuilding a multi-tenant cloud service from legacy code with Docker containers
Building a multi-tenant cloud service from legacy code with Docker containers
 
Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...
Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...
Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...
 
VMware Hybrid Cloud Service - Overview
VMware Hybrid Cloud Service - OverviewVMware Hybrid Cloud Service - Overview
VMware Hybrid Cloud Service - Overview
 
Orchestration tool roundup - OpenStack Israel summit - kubernetes vs. docker...
Orchestration tool roundup  - OpenStack Israel summit - kubernetes vs. docker...Orchestration tool roundup  - OpenStack Israel summit - kubernetes vs. docker...
Orchestration tool roundup - OpenStack Israel summit - kubernetes vs. docker...
 
Locking down your Kubernetes cluster with Linkerd
Locking down your Kubernetes cluster with LinkerdLocking down your Kubernetes cluster with Linkerd
Locking down your Kubernetes cluster with Linkerd
 
Monitoring and Tuning GlassFish
Monitoring and Tuning GlassFishMonitoring and Tuning GlassFish
Monitoring and Tuning GlassFish
 
Powering Microservices with Docker, Kubernetes, Kafka, & MongoDB
Powering Microservices with Docker, Kubernetes, Kafka, & MongoDBPowering Microservices with Docker, Kubernetes, Kafka, & MongoDB
Powering Microservices with Docker, Kubernetes, Kafka, & MongoDB
 
Service Discovery In Kubernetes
Service Discovery In KubernetesService Discovery In Kubernetes
Service Discovery In Kubernetes
 

Similar to Microservices with Micronaut

Microservices with Micronaut
Microservices with MicronautMicroservices with Micronaut
Microservices with Micronaut
QAware GmbH
 
Best Practices for performance evaluation and diagnosis of Java Applications ...
Best Practices for performance evaluation and diagnosis of Java Applications ...Best Practices for performance evaluation and diagnosis of Java Applications ...
Best Practices for performance evaluation and diagnosis of Java Applications ...
IndicThreads
 
End to End Processing of 3.7 Million Telemetry Events per Second using Lambda...
End to End Processing of 3.7 Million Telemetry Events per Second using Lambda...End to End Processing of 3.7 Million Telemetry Events per Second using Lambda...
End to End Processing of 3.7 Million Telemetry Events per Second using Lambda...
DataWorks Summit/Hadoop Summit
 
Container Performance Analysis Brendan Gregg, Netflix
Container Performance Analysis Brendan Gregg, NetflixContainer Performance Analysis Brendan Gregg, Netflix
Container Performance Analysis Brendan Gregg, Netflix
Docker, Inc.
 
Container Performance Analysis
Container Performance AnalysisContainer Performance Analysis
Container Performance Analysis
Brendan Gregg
 
Writing Serverless Application in Java with comparison of 3 approaches: AWS S...
Writing Serverless Application in Java with comparison of 3 approaches: AWS S...Writing Serverless Application in Java with comparison of 3 approaches: AWS S...
Writing Serverless Application in Java with comparison of 3 approaches: AWS S...
Andrew Zakordonets
 
Java Memory Model
Java Memory ModelJava Memory Model
Java Memory Model
Łukasz Koniecki
 
Looming Marvelous - Virtual Threads in Java Javaland.pdf
Looming Marvelous - Virtual Threads in Java Javaland.pdfLooming Marvelous - Virtual Threads in Java Javaland.pdf
Looming Marvelous - Virtual Threads in Java Javaland.pdf
jexp
 
Hs java open_party
Hs java open_partyHs java open_party
Hs java open_party
Open Party
 
Introduction to apache kafka
Introduction to apache kafkaIntroduction to apache kafka
Introduction to apache kafka
Samuel Kerrien
 
YOW2018 Cloud Performance Root Cause Analysis at Netflix
YOW2018 Cloud Performance Root Cause Analysis at NetflixYOW2018 Cloud Performance Root Cause Analysis at Netflix
YOW2018 Cloud Performance Root Cause Analysis at Netflix
Brendan Gregg
 
Node.js Web Apps @ ebay scale
Node.js Web Apps @ ebay scaleNode.js Web Apps @ ebay scale
Node.js Web Apps @ ebay scale
Dmytro Semenov
 
Netflix Keystone Pipeline at Samza Meetup 10-13-2015
Netflix Keystone Pipeline at Samza Meetup 10-13-2015Netflix Keystone Pipeline at Samza Meetup 10-13-2015
Netflix Keystone Pipeline at Samza Meetup 10-13-2015
Monal Daxini
 
Software Profiling: Understanding Java Performance and how to profile in Java
Software Profiling: Understanding Java Performance and how to profile in JavaSoftware Profiling: Understanding Java Performance and how to profile in Java
Software Profiling: Understanding Java Performance and how to profile in Java
Isuru Perera
 
Performance Tuning Oracle Weblogic Server 12c
Performance Tuning Oracle Weblogic Server 12cPerformance Tuning Oracle Weblogic Server 12c
Performance Tuning Oracle Weblogic Server 12c
Ajith Narayanan
 
Hadoop cluster performance profiler
Hadoop cluster performance profilerHadoop cluster performance profiler
Hadoop cluster performance profiler
Ihor Bobak
 
Software Profiling: Java Performance, Profiling and Flamegraphs
Software Profiling: Java Performance, Profiling and FlamegraphsSoftware Profiling: Java Performance, Profiling and Flamegraphs
Software Profiling: Java Performance, Profiling and Flamegraphs
Isuru Perera
 
Java and Containers - Make it Awesome !
Java and Containers - Make it Awesome !Java and Containers - Make it Awesome !
Java and Containers - Make it Awesome !
Dinakar Guniguntala
 
Deep Dive on Amazon EC2 instances
Deep Dive on Amazon EC2 instancesDeep Dive on Amazon EC2 instances
Deep Dive on Amazon EC2 instances
Amazon Web Services
 
Open Source XMPP for Cloud Services
Open Source XMPP for Cloud ServicesOpen Source XMPP for Cloud Services
Open Source XMPP for Cloud Services
mattjive
 

Similar to Microservices with Micronaut (20)

Microservices with Micronaut
Microservices with MicronautMicroservices with Micronaut
Microservices with Micronaut
 
Best Practices for performance evaluation and diagnosis of Java Applications ...
Best Practices for performance evaluation and diagnosis of Java Applications ...Best Practices for performance evaluation and diagnosis of Java Applications ...
Best Practices for performance evaluation and diagnosis of Java Applications ...
 
End to End Processing of 3.7 Million Telemetry Events per Second using Lambda...
End to End Processing of 3.7 Million Telemetry Events per Second using Lambda...End to End Processing of 3.7 Million Telemetry Events per Second using Lambda...
End to End Processing of 3.7 Million Telemetry Events per Second using Lambda...
 
Container Performance Analysis Brendan Gregg, Netflix
Container Performance Analysis Brendan Gregg, NetflixContainer Performance Analysis Brendan Gregg, Netflix
Container Performance Analysis Brendan Gregg, Netflix
 
Container Performance Analysis
Container Performance AnalysisContainer Performance Analysis
Container Performance Analysis
 
Writing Serverless Application in Java with comparison of 3 approaches: AWS S...
Writing Serverless Application in Java with comparison of 3 approaches: AWS S...Writing Serverless Application in Java with comparison of 3 approaches: AWS S...
Writing Serverless Application in Java with comparison of 3 approaches: AWS S...
 
Java Memory Model
Java Memory ModelJava Memory Model
Java Memory Model
 
Looming Marvelous - Virtual Threads in Java Javaland.pdf
Looming Marvelous - Virtual Threads in Java Javaland.pdfLooming Marvelous - Virtual Threads in Java Javaland.pdf
Looming Marvelous - Virtual Threads in Java Javaland.pdf
 
Hs java open_party
Hs java open_partyHs java open_party
Hs java open_party
 
Introduction to apache kafka
Introduction to apache kafkaIntroduction to apache kafka
Introduction to apache kafka
 
YOW2018 Cloud Performance Root Cause Analysis at Netflix
YOW2018 Cloud Performance Root Cause Analysis at NetflixYOW2018 Cloud Performance Root Cause Analysis at Netflix
YOW2018 Cloud Performance Root Cause Analysis at Netflix
 
Node.js Web Apps @ ebay scale
Node.js Web Apps @ ebay scaleNode.js Web Apps @ ebay scale
Node.js Web Apps @ ebay scale
 
Netflix Keystone Pipeline at Samza Meetup 10-13-2015
Netflix Keystone Pipeline at Samza Meetup 10-13-2015Netflix Keystone Pipeline at Samza Meetup 10-13-2015
Netflix Keystone Pipeline at Samza Meetup 10-13-2015
 
Software Profiling: Understanding Java Performance and how to profile in Java
Software Profiling: Understanding Java Performance and how to profile in JavaSoftware Profiling: Understanding Java Performance and how to profile in Java
Software Profiling: Understanding Java Performance and how to profile in Java
 
Performance Tuning Oracle Weblogic Server 12c
Performance Tuning Oracle Weblogic Server 12cPerformance Tuning Oracle Weblogic Server 12c
Performance Tuning Oracle Weblogic Server 12c
 
Hadoop cluster performance profiler
Hadoop cluster performance profilerHadoop cluster performance profiler
Hadoop cluster performance profiler
 
Software Profiling: Java Performance, Profiling and Flamegraphs
Software Profiling: Java Performance, Profiling and FlamegraphsSoftware Profiling: Java Performance, Profiling and Flamegraphs
Software Profiling: Java Performance, Profiling and Flamegraphs
 
Java and Containers - Make it Awesome !
Java and Containers - Make it Awesome !Java and Containers - Make it Awesome !
Java and Containers - Make it Awesome !
 
Deep Dive on Amazon EC2 instances
Deep Dive on Amazon EC2 instancesDeep Dive on Amazon EC2 instances
Deep Dive on Amazon EC2 instances
 
Open Source XMPP for Cloud Services
Open Source XMPP for Cloud ServicesOpen Source XMPP for Cloud Services
Open Source XMPP for Cloud Services
 

More from QAware GmbH

Mit ChatGPT Dinosaurier besiegen - Möglichkeiten und Grenzen von LLM für die ...
Mit ChatGPT Dinosaurier besiegen - Möglichkeiten und Grenzen von LLM für die ...Mit ChatGPT Dinosaurier besiegen - Möglichkeiten und Grenzen von LLM für die ...
Mit ChatGPT Dinosaurier besiegen - Möglichkeiten und Grenzen von LLM für die ...
QAware GmbH
 
50 Shades of K8s Autoscaling #JavaLand24.pdf
50 Shades of K8s Autoscaling #JavaLand24.pdf50 Shades of K8s Autoscaling #JavaLand24.pdf
50 Shades of K8s Autoscaling #JavaLand24.pdf
QAware GmbH
 
Make Agile Great - PM-Erfahrungen aus zwei virtuellen internationalen SAFe-Pr...
Make Agile Great - PM-Erfahrungen aus zwei virtuellen internationalen SAFe-Pr...Make Agile Great - PM-Erfahrungen aus zwei virtuellen internationalen SAFe-Pr...
Make Agile Great - PM-Erfahrungen aus zwei virtuellen internationalen SAFe-Pr...
QAware GmbH
 
Fully-managed Cloud-native Databases: The path to indefinite scale @ CNN Mainz
Fully-managed Cloud-native Databases: The path to indefinite scale @ CNN MainzFully-managed Cloud-native Databases: The path to indefinite scale @ CNN Mainz
Fully-managed Cloud-native Databases: The path to indefinite scale @ CNN Mainz
QAware GmbH
 
Down the Ivory Tower towards Agile Architecture
Down the Ivory Tower towards Agile ArchitectureDown the Ivory Tower towards Agile Architecture
Down the Ivory Tower towards Agile Architecture
QAware GmbH
 
"Mixed" Scrum-Teams – Die richtige Mischung macht's!
"Mixed" Scrum-Teams – Die richtige Mischung macht's!"Mixed" Scrum-Teams – Die richtige Mischung macht's!
"Mixed" Scrum-Teams – Die richtige Mischung macht's!
QAware GmbH
 
Make Developers Fly: Principles for Platform Engineering
Make Developers Fly: Principles for Platform EngineeringMake Developers Fly: Principles for Platform Engineering
Make Developers Fly: Principles for Platform Engineering
QAware GmbH
 
Der Tod der Testpyramide? – Frontend-Testing mit Playwright
Der Tod der Testpyramide? – Frontend-Testing mit PlaywrightDer Tod der Testpyramide? – Frontend-Testing mit Playwright
Der Tod der Testpyramide? – Frontend-Testing mit Playwright
QAware GmbH
 
Was kommt nach den SPAs
Was kommt nach den SPAsWas kommt nach den SPAs
Was kommt nach den SPAs
QAware GmbH
 
Cloud Migration mit KI: der Turbo
Cloud Migration mit KI: der Turbo Cloud Migration mit KI: der Turbo
Cloud Migration mit KI: der Turbo
QAware GmbH
 
Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
 Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See... Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
QAware GmbH
 
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
QAware GmbH
 
Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.
Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.
Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.
QAware GmbH
 
Kubernetes with Cilium in AWS - Experience Report!
Kubernetes with Cilium in AWS - Experience Report!Kubernetes with Cilium in AWS - Experience Report!
Kubernetes with Cilium in AWS - Experience Report!
QAware GmbH
 
50 Shades of K8s Autoscaling
50 Shades of K8s Autoscaling50 Shades of K8s Autoscaling
50 Shades of K8s Autoscaling
QAware GmbH
 
Kontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAP
Kontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAPKontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAP
Kontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAP
QAware GmbH
 
Service Mesh Pain & Gain. Experiences from a client project.
Service Mesh Pain & Gain. Experiences from a client project.Service Mesh Pain & Gain. Experiences from a client project.
Service Mesh Pain & Gain. Experiences from a client project.
QAware GmbH
 
50 Shades of K8s Autoscaling
50 Shades of K8s Autoscaling50 Shades of K8s Autoscaling
50 Shades of K8s Autoscaling
QAware GmbH
 
Blue turns green! Approaches and technologies for sustainable K8s clusters.
Blue turns green! Approaches and technologies for sustainable K8s clusters.Blue turns green! Approaches and technologies for sustainable K8s clusters.
Blue turns green! Approaches and technologies for sustainable K8s clusters.
QAware GmbH
 
Per Anhalter zu Cloud Nativen API Gateways
Per Anhalter zu Cloud Nativen API GatewaysPer Anhalter zu Cloud Nativen API Gateways
Per Anhalter zu Cloud Nativen API Gateways
QAware GmbH
 

More from QAware GmbH (20)

Mit ChatGPT Dinosaurier besiegen - Möglichkeiten und Grenzen von LLM für die ...
Mit ChatGPT Dinosaurier besiegen - Möglichkeiten und Grenzen von LLM für die ...Mit ChatGPT Dinosaurier besiegen - Möglichkeiten und Grenzen von LLM für die ...
Mit ChatGPT Dinosaurier besiegen - Möglichkeiten und Grenzen von LLM für die ...
 
50 Shades of K8s Autoscaling #JavaLand24.pdf
50 Shades of K8s Autoscaling #JavaLand24.pdf50 Shades of K8s Autoscaling #JavaLand24.pdf
50 Shades of K8s Autoscaling #JavaLand24.pdf
 
Make Agile Great - PM-Erfahrungen aus zwei virtuellen internationalen SAFe-Pr...
Make Agile Great - PM-Erfahrungen aus zwei virtuellen internationalen SAFe-Pr...Make Agile Great - PM-Erfahrungen aus zwei virtuellen internationalen SAFe-Pr...
Make Agile Great - PM-Erfahrungen aus zwei virtuellen internationalen SAFe-Pr...
 
Fully-managed Cloud-native Databases: The path to indefinite scale @ CNN Mainz
Fully-managed Cloud-native Databases: The path to indefinite scale @ CNN MainzFully-managed Cloud-native Databases: The path to indefinite scale @ CNN Mainz
Fully-managed Cloud-native Databases: The path to indefinite scale @ CNN Mainz
 
Down the Ivory Tower towards Agile Architecture
Down the Ivory Tower towards Agile ArchitectureDown the Ivory Tower towards Agile Architecture
Down the Ivory Tower towards Agile Architecture
 
"Mixed" Scrum-Teams – Die richtige Mischung macht's!
"Mixed" Scrum-Teams – Die richtige Mischung macht's!"Mixed" Scrum-Teams – Die richtige Mischung macht's!
"Mixed" Scrum-Teams – Die richtige Mischung macht's!
 
Make Developers Fly: Principles for Platform Engineering
Make Developers Fly: Principles for Platform EngineeringMake Developers Fly: Principles for Platform Engineering
Make Developers Fly: Principles for Platform Engineering
 
Der Tod der Testpyramide? – Frontend-Testing mit Playwright
Der Tod der Testpyramide? – Frontend-Testing mit PlaywrightDer Tod der Testpyramide? – Frontend-Testing mit Playwright
Der Tod der Testpyramide? – Frontend-Testing mit Playwright
 
Was kommt nach den SPAs
Was kommt nach den SPAsWas kommt nach den SPAs
Was kommt nach den SPAs
 
Cloud Migration mit KI: der Turbo
Cloud Migration mit KI: der Turbo Cloud Migration mit KI: der Turbo
Cloud Migration mit KI: der Turbo
 
Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
 Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See... Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
 
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
 
Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.
Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.
Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.
 
Kubernetes with Cilium in AWS - Experience Report!
Kubernetes with Cilium in AWS - Experience Report!Kubernetes with Cilium in AWS - Experience Report!
Kubernetes with Cilium in AWS - Experience Report!
 
50 Shades of K8s Autoscaling
50 Shades of K8s Autoscaling50 Shades of K8s Autoscaling
50 Shades of K8s Autoscaling
 
Kontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAP
Kontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAPKontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAP
Kontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAP
 
Service Mesh Pain & Gain. Experiences from a client project.
Service Mesh Pain & Gain. Experiences from a client project.Service Mesh Pain & Gain. Experiences from a client project.
Service Mesh Pain & Gain. Experiences from a client project.
 
50 Shades of K8s Autoscaling
50 Shades of K8s Autoscaling50 Shades of K8s Autoscaling
50 Shades of K8s Autoscaling
 
Blue turns green! Approaches and technologies for sustainable K8s clusters.
Blue turns green! Approaches and technologies for sustainable K8s clusters.Blue turns green! Approaches and technologies for sustainable K8s clusters.
Blue turns green! Approaches and technologies for sustainable K8s clusters.
 
Per Anhalter zu Cloud Nativen API Gateways
Per Anhalter zu Cloud Nativen API GatewaysPer Anhalter zu Cloud Nativen API Gateways
Per Anhalter zu Cloud Nativen API Gateways
 

Recently uploaded

Cell The Unit of Life for NEET Multiple Choice Questions.docx
Cell The Unit of Life for NEET Multiple Choice Questions.docxCell The Unit of Life for NEET Multiple Choice Questions.docx
Cell The Unit of Life for NEET Multiple Choice Questions.docx
vasanthatpuram
 
原版一比一爱尔兰都柏林大学毕业证(UCD毕业证书)如何办理
原版一比一爱尔兰都柏林大学毕业证(UCD毕业证书)如何办理 原版一比一爱尔兰都柏林大学毕业证(UCD毕业证书)如何办理
原版一比一爱尔兰都柏林大学毕业证(UCD毕业证书)如何办理
tzu5xla
 
DATA COMMS-NETWORKS YR2 lecture 08 NAT & CLOUD.docx
DATA COMMS-NETWORKS YR2 lecture 08 NAT & CLOUD.docxDATA COMMS-NETWORKS YR2 lecture 08 NAT & CLOUD.docx
DATA COMMS-NETWORKS YR2 lecture 08 NAT & CLOUD.docx
SaffaIbrahim1
 
Drownings spike from May to August in children
Drownings spike from May to August in childrenDrownings spike from May to August in children
Drownings spike from May to August in children
Bisnar Chase Personal Injury Attorneys
 
社内勉強会資料_Hallucination of LLMs               .
社内勉強会資料_Hallucination of LLMs               .社内勉強会資料_Hallucination of LLMs               .
社内勉強会資料_Hallucination of LLMs               .
NABLAS株式会社
 
原版制作(unimelb毕业证书)墨尔本大学毕业证Offer一模一样
原版制作(unimelb毕业证书)墨尔本大学毕业证Offer一模一样原版制作(unimelb毕业证书)墨尔本大学毕业证Offer一模一样
原版制作(unimelb毕业证书)墨尔本大学毕业证Offer一模一样
ihavuls
 
Experts live - Improving user adoption with AI
Experts live - Improving user adoption with AIExperts live - Improving user adoption with AI
Experts live - Improving user adoption with AI
jitskeb
 
一比一原版英国赫特福德大学毕业证(hertfordshire毕业证书)如何办理
一比一原版英国赫特福德大学毕业证(hertfordshire毕业证书)如何办理一比一原版英国赫特福德大学毕业证(hertfordshire毕业证书)如何办理
一比一原版英国赫特福德大学毕业证(hertfordshire毕业证书)如何办理
nyvan3
 
Data Scientist Machine Learning Profiles .pdf
Data Scientist Machine Learning  Profiles .pdfData Scientist Machine Learning  Profiles .pdf
Data Scientist Machine Learning Profiles .pdf
Vineet
 
一比一原版(lbs毕业证书)伦敦商学院毕业证如何办理
一比一原版(lbs毕业证书)伦敦商学院毕业证如何办理一比一原版(lbs毕业证书)伦敦商学院毕业证如何办理
一比一原版(lbs毕业证书)伦敦商学院毕业证如何办理
ywqeos
 
一比一原版加拿大麦吉尔大学毕业证(mcgill毕业证书)如何办理
一比一原版加拿大麦吉尔大学毕业证(mcgill毕业证书)如何办理一比一原版加拿大麦吉尔大学毕业证(mcgill毕业证书)如何办理
一比一原版加拿大麦吉尔大学毕业证(mcgill毕业证书)如何办理
agdhot
 
Module 1 ppt BIG DATA ANALYTICS NOTES FOR MCA
Module 1 ppt BIG DATA ANALYTICS NOTES FOR MCAModule 1 ppt BIG DATA ANALYTICS NOTES FOR MCA
Module 1 ppt BIG DATA ANALYTICS NOTES FOR MCA
yuvarajkumar334
 
Digital Marketing Performance Marketing Sample .pdf
Digital Marketing Performance Marketing  Sample .pdfDigital Marketing Performance Marketing  Sample .pdf
Digital Marketing Performance Marketing Sample .pdf
Vineet
 
ML-PPT-UNIT-2 Generative Classifiers Discriminative Classifiers
ML-PPT-UNIT-2 Generative Classifiers Discriminative ClassifiersML-PPT-UNIT-2 Generative Classifiers Discriminative Classifiers
ML-PPT-UNIT-2 Generative Classifiers Discriminative Classifiers
MastanaihnaiduYasam
 
一比一原版(uob毕业证书)伯明翰大学毕业证如何办理
一比一原版(uob毕业证书)伯明翰大学毕业证如何办理一比一原版(uob毕业证书)伯明翰大学毕业证如何办理
一比一原版(uob毕业证书)伯明翰大学毕业证如何办理
9gr6pty
 
[VCOSA] Monthly Report - Cotton & Yarn Statistics May 2024
[VCOSA] Monthly Report - Cotton & Yarn Statistics May 2024[VCOSA] Monthly Report - Cotton & Yarn Statistics May 2024
[VCOSA] Monthly Report - Cotton & Yarn Statistics May 2024
Vietnam Cotton & Spinning Association
 
Overview IFM June 2024 Consumer Confidence INDEX Report.pdf
Overview IFM June 2024 Consumer Confidence INDEX Report.pdfOverview IFM June 2024 Consumer Confidence INDEX Report.pdf
Overview IFM June 2024 Consumer Confidence INDEX Report.pdf
nhutnguyen355078
 
一比一原版(Sheffield毕业证书)谢菲尔德大学毕业证如何办理
一比一原版(Sheffield毕业证书)谢菲尔德大学毕业证如何办理一比一原版(Sheffield毕业证书)谢菲尔德大学毕业证如何办理
一比一原版(Sheffield毕业证书)谢菲尔德大学毕业证如何办理
1tyxnjpia
 
一比一原版马来西亚博特拉大学毕业证(upm毕业证)如何办理
一比一原版马来西亚博特拉大学毕业证(upm毕业证)如何办理一比一原版马来西亚博特拉大学毕业证(upm毕业证)如何办理
一比一原版马来西亚博特拉大学毕业证(upm毕业证)如何办理
eudsoh
 
一比一原版英属哥伦比亚大学毕业证(UBC毕业证书)学历如何办理
一比一原版英属哥伦比亚大学毕业证(UBC毕业证书)学历如何办理一比一原版英属哥伦比亚大学毕业证(UBC毕业证书)学历如何办理
一比一原版英属哥伦比亚大学毕业证(UBC毕业证书)学历如何办理
z6osjkqvd
 

Recently uploaded (20)

Cell The Unit of Life for NEET Multiple Choice Questions.docx
Cell The Unit of Life for NEET Multiple Choice Questions.docxCell The Unit of Life for NEET Multiple Choice Questions.docx
Cell The Unit of Life for NEET Multiple Choice Questions.docx
 
原版一比一爱尔兰都柏林大学毕业证(UCD毕业证书)如何办理
原版一比一爱尔兰都柏林大学毕业证(UCD毕业证书)如何办理 原版一比一爱尔兰都柏林大学毕业证(UCD毕业证书)如何办理
原版一比一爱尔兰都柏林大学毕业证(UCD毕业证书)如何办理
 
DATA COMMS-NETWORKS YR2 lecture 08 NAT & CLOUD.docx
DATA COMMS-NETWORKS YR2 lecture 08 NAT & CLOUD.docxDATA COMMS-NETWORKS YR2 lecture 08 NAT & CLOUD.docx
DATA COMMS-NETWORKS YR2 lecture 08 NAT & CLOUD.docx
 
Drownings spike from May to August in children
Drownings spike from May to August in childrenDrownings spike from May to August in children
Drownings spike from May to August in children
 
社内勉強会資料_Hallucination of LLMs               .
社内勉強会資料_Hallucination of LLMs               .社内勉強会資料_Hallucination of LLMs               .
社内勉強会資料_Hallucination of LLMs               .
 
原版制作(unimelb毕业证书)墨尔本大学毕业证Offer一模一样
原版制作(unimelb毕业证书)墨尔本大学毕业证Offer一模一样原版制作(unimelb毕业证书)墨尔本大学毕业证Offer一模一样
原版制作(unimelb毕业证书)墨尔本大学毕业证Offer一模一样
 
Experts live - Improving user adoption with AI
Experts live - Improving user adoption with AIExperts live - Improving user adoption with AI
Experts live - Improving user adoption with AI
 
一比一原版英国赫特福德大学毕业证(hertfordshire毕业证书)如何办理
一比一原版英国赫特福德大学毕业证(hertfordshire毕业证书)如何办理一比一原版英国赫特福德大学毕业证(hertfordshire毕业证书)如何办理
一比一原版英国赫特福德大学毕业证(hertfordshire毕业证书)如何办理
 
Data Scientist Machine Learning Profiles .pdf
Data Scientist Machine Learning  Profiles .pdfData Scientist Machine Learning  Profiles .pdf
Data Scientist Machine Learning Profiles .pdf
 
一比一原版(lbs毕业证书)伦敦商学院毕业证如何办理
一比一原版(lbs毕业证书)伦敦商学院毕业证如何办理一比一原版(lbs毕业证书)伦敦商学院毕业证如何办理
一比一原版(lbs毕业证书)伦敦商学院毕业证如何办理
 
一比一原版加拿大麦吉尔大学毕业证(mcgill毕业证书)如何办理
一比一原版加拿大麦吉尔大学毕业证(mcgill毕业证书)如何办理一比一原版加拿大麦吉尔大学毕业证(mcgill毕业证书)如何办理
一比一原版加拿大麦吉尔大学毕业证(mcgill毕业证书)如何办理
 
Module 1 ppt BIG DATA ANALYTICS NOTES FOR MCA
Module 1 ppt BIG DATA ANALYTICS NOTES FOR MCAModule 1 ppt BIG DATA ANALYTICS NOTES FOR MCA
Module 1 ppt BIG DATA ANALYTICS NOTES FOR MCA
 
Digital Marketing Performance Marketing Sample .pdf
Digital Marketing Performance Marketing  Sample .pdfDigital Marketing Performance Marketing  Sample .pdf
Digital Marketing Performance Marketing Sample .pdf
 
ML-PPT-UNIT-2 Generative Classifiers Discriminative Classifiers
ML-PPT-UNIT-2 Generative Classifiers Discriminative ClassifiersML-PPT-UNIT-2 Generative Classifiers Discriminative Classifiers
ML-PPT-UNIT-2 Generative Classifiers Discriminative Classifiers
 
一比一原版(uob毕业证书)伯明翰大学毕业证如何办理
一比一原版(uob毕业证书)伯明翰大学毕业证如何办理一比一原版(uob毕业证书)伯明翰大学毕业证如何办理
一比一原版(uob毕业证书)伯明翰大学毕业证如何办理
 
[VCOSA] Monthly Report - Cotton & Yarn Statistics May 2024
[VCOSA] Monthly Report - Cotton & Yarn Statistics May 2024[VCOSA] Monthly Report - Cotton & Yarn Statistics May 2024
[VCOSA] Monthly Report - Cotton & Yarn Statistics May 2024
 
Overview IFM June 2024 Consumer Confidence INDEX Report.pdf
Overview IFM June 2024 Consumer Confidence INDEX Report.pdfOverview IFM June 2024 Consumer Confidence INDEX Report.pdf
Overview IFM June 2024 Consumer Confidence INDEX Report.pdf
 
一比一原版(Sheffield毕业证书)谢菲尔德大学毕业证如何办理
一比一原版(Sheffield毕业证书)谢菲尔德大学毕业证如何办理一比一原版(Sheffield毕业证书)谢菲尔德大学毕业证如何办理
一比一原版(Sheffield毕业证书)谢菲尔德大学毕业证如何办理
 
一比一原版马来西亚博特拉大学毕业证(upm毕业证)如何办理
一比一原版马来西亚博特拉大学毕业证(upm毕业证)如何办理一比一原版马来西亚博特拉大学毕业证(upm毕业证)如何办理
一比一原版马来西亚博特拉大学毕业证(upm毕业证)如何办理
 
一比一原版英属哥伦比亚大学毕业证(UBC毕业证书)学历如何办理
一比一原版英属哥伦比亚大学毕业证(UBC毕业证书)学历如何办理一比一原版英属哥伦比亚大学毕业证(UBC毕业证书)学历如何办理
一比一原版英属哥伦比亚大学毕业证(UBC毕业证书)学历如何办理
 

Microservices with Micronaut

  • 1. Microservices with Micronaut 2021-09-01 - Moritz Kammerer WeAreDevelopers
  • 2. About me ● 2013 M.Sc. Computer Science @ Munich University of Applied Sciences ● 2013 Software Engineer @ QAware ● … ● 2021 Expert Software Engineer @ QAware Working on backend stuff, mostly Java. LinkedIn | GitHub
  • 5. Why does it take so long? ● Start time of Spring (Boot) ○ Depends on the number of beans in the context ○ Reading of bytecode [3] ○ Creating proxies at runtime ○ Runtime AOP ○ Reflection ○ Annotation Synthesizing [1] [2] ● Memory usage ○ Reflective Metadata Cache ● Debugging ○ Very very long stacktraces ○ … with code in dynamically generated proxy classes [1] https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/annotation/AnnotationUtils.html [2] https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/annotation/AliasFor.html [3] https://github.com/spring-projects/spring-framework/blob/master/spring-core/src/main/java/org/springframework/core/type/classreading/AbstractRecursiveAnnotationVisitor.java
  • 7. What’s the (promised) solution? ● Create stuff at compile time ○ Proxies ○ Dependency Injection ○ AOP ● Why? ○ Compiled once, run often ○ Tradeoff: Compile time vs. Runtime ● Goal: ○ No reflection - or as little as possible ○ No proxies ○ Minimize startup time ○ Minimize memory usage ○ Readable stacktraces
  • 8. And how does that work? ● Annotation Processor ○ Reads bytecode & annotations of the classes ○ Creates new classes ○ Doesn’t touch your code, just extends it ● Gradle ○ annotationProcessor "io.micronaut:micronaut-inject-java" ○ annotationProcessor "io.micronaut:micronaut-validation" ● Also runs with Maven ○ < Insert 500 KB of XML here >
  • 9.
  • 10. And this is really working? ● Spring Boot 2.1.2 (starter-web), Java 11, @Component on empty class ○ 0 Beans: 1.236 seconds ○ 1000 Beans: 1.808 seconds ○ 2000 Beans: 2.356 seconds ○ 4000 Beans: 3.259 seconds ○ 8000 Beans: 6.498 seconds ○ 16000 Beans: 9.231 seconds ● Micronaut 1.0.4, Java 11, @Singleton on empty class ○ 0 Beans: 1085ms ○ 1000 Beans: 1870ms ○ 2000 Beans: 2757ms ○ 4000 Beans: 4529ms ○ 8000 Beans: 8038ms ○ 16000 Beans: 15861ms
  • 12. Debunked: It’s not the classpath scanning ● Not so expensive: ○ Classpath scanning (Spring) ○ Injection with reflection (Spring) ● Expensive ○ Class Loading (Micronaut + Spring) ○ Runtime AOP Proxies (Spring) ○ Annotation Synthesizing (Spring) ○ Read bytecode on big classes (Spring) ○ Auto-Configuration Magic (Spring) ● Most of the expensive stuff is done at Micronaut compile time
  • 13. Looks great, so not disadvantages?
  • 14. The price you pay: Compile time (16k Beans) Spring: [INFO] Total time: 7.958 s Micronaut: BUILD SUCCESSFUL in 5m 3s
  • 15. Benchmarking is hard! ● This was NOT a real benchmark ● Most time spent in the applications shown on the first slides: Spring autoconfiguration magic ● It really depends on the needed feature of your application ○ Actuator ○ JPA / Hibernate ○ Tracing ○ Metrics ○ @FeignClient ○ @Transactional ○ @Cacheable ○ … ● Real benchmarks later in the slides :)
  • 16. Okay... what else does Micronaut bring to the table? ● Dependency Injection ○ @Inject, @Named, @Singleton, @Prototype, ... ● REST Controller ○ @Controller, @GET, @POST, … ● Events ○ @PostConstruct ○ @EventListener ● AOP ○ Around Advice, Introduction Advice, … ● Validation ○ @Validated, @NotNull, ...
  • 17. ... ● Caching ○ @Cachable, @CacheInvalidate, … ● Retry ○ @Retryable ● Circuit Breaking ○ @CircuitBreaker ● Fallback / Recovery ○ @Recoverable / @Fallback ● Scheduling ○ @Scheduled
  • 18. ... ● Reactive & Blocking HTTP with Netty ○ Compile Time Route Validation ○ @Error Exception Handling ala Spring ● Websocket Server & Clients ● Server side views ○ Thymeleaf, Handlebars, Velocity ● OpenAPI / Swagger ○ Open API spec is created on compile time! ● HTTP Clients ○ @Client ○ Client-side load balancing ○ Service discovery (Consul, Eureka, K8S, Route 53, DNS based) ○ OpenTracing (Zipkin, Jaeger)
  • 19. ... ● Application Configuration ○ application.yml / .json / .groovy ○ Different Environments ○ Property Sources (ENV, System Properties, …) ○ @ConfigurationProperties, @Value ○ Distributed config with Consul, AWS Parameter Store ● Database support ○ JPA, Mongo, Neo4J, Postgres-Reactive, Redis, Cassandra ● Monitoring ○ @Endpoint (/beans, /info, /health, …) ○ Metrics with Micrometer ○ Change log level at runtime
  • 20. ... ● Security ○ Like Spring Security with users and roles (RBAC) ○ Basic Auth / Session based ○ JWT (JWS and JWE) incl. automatic token propagation ○ Auth with LDAP ● Function-as-a-Service (AWS Lambda, OpenFaaS) ● Message driven services (RabbitMQ / Kafka) ● CLI applications ● Good documentation! ○ e.g. with tutorials for Let’s Encrypt, starting Consul, etc.
  • 21. Enough bla bla, show code!
  • 22. Service to be written github.com My browser HTTP Server HTTP Client The Internet
  • 24.
  • 25.
  • 27.
  • 28. Creating a HTTP endpoint
  • 29.
  • 30.
  • 32.
  • 33.
  • 34. Message: No bean of type [demo.service.ProjectService] exists. Path Taken: new ProjectsController(ProjectService projectService) --> new ProjectsController([ProjectService projectService]) Failed to inject value for parameter [projectService] of class: demo.ProjectsController
  • 35.
  • 36.
  • 37. Service to be written github.com My browser HTTP Server HTTP Client The Internet
  • 38. Creating a HTTP client
  • 40.
  • 41.
  • 42.
  • 43.
  • 45.
  • 46.
  • 48. 1st request 2nd request
  • 50.
  • 51.
  • 52.
  • 54.
  • 57.
  • 59. Spring vs. Micronaut - GitHub Scraper Micronaut 2.2.1 BUILD SUCCESSFUL in 3s 0,89s user 0,07s system 22% cpu 4,199 total Startup completed in 625ms
  • 60. Spring vs. Micronaut - GitHub Scraper Spring 2.4.1 BUILD SUCCESSFUL in 1s 0,86s user 0,09s system 67% cpu 1,414 total Started DemoApplication in 1.21 seconds (JVM running for 1.556)
  • 61. Micronaut (JAR: 14.8 MB) java -Xms16M -Xmx512M -jar github-scraper-0.1-all.jar / OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.9+11)
  • 62. Micronaut wrk -t 8 -c 80 -d 30s --latency http://localhost:8080/github/stars Running 30s test @ http://localhost:8080/github/stars 8 threads and 80 connections Thread Stats Avg Stdev Max +/- Stdev Latency 2.21ms 5.33ms 139.33ms 91.82% Req/Sec 15.22k 5.34k 27.39k 72.74% Latency Distribution 50% 286.00us 75% 1.98ms 90% 6.44ms 99% 22.34ms 2765210 requests in 30.07s, 1.38GB read Requests/sec: 91956.68 Transfer/sec: 47.01MB
  • 63. Spring Boot (JAR: 30.6 MB) java -Xms16M -Xmx512M -jar github-scraper-spring-0.0.1-SNAPSHOT.jar / OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.9+11)
  • 64. Spring Boot wrk -t 8 -c 80 -d 30s --latency http://localhost:8080/github/stars Running 30s test @ http://localhost:8080/github/stars 8 threads and 80 connections Thread Stats Avg Stdev Max +/- Stdev Latency 10.23ms 65.15ms 778.07ms 97.82% Req/Sec 9.29k 2.69k 14.24k 78.93% Latency Distribution 50% 0.87ms 75% 1.55ms 90% 3.36ms 99% 414.50ms 2169903 requests in 30.10s, 1.07GB read Requests/sec: 72091.42 Transfer/sec: 36.38MB
  • 65. How much RAM do I have to use?
  • 66. Minimal Heap Size - Micronaut (-Xmx32M)
  • 67. Minimal Heap Size - Micronaut (-Xmx32M) wrk -t 8 -c 80 -d 30s --latency http://localhost:8080/github/stars Running 30s test @ http://localhost:8080/github/stars 8 threads and 80 connections Thread Stats Avg Stdev Max +/- Stdev Latency 2.68ms 6.40ms 135.54ms 91.54% Req/Sec 11.34k 4.58k 23.37k 68.22% Latency Distribution 50% 270.00us 75% 2.58ms 90% 8.02ms 99% 27.00ms 1717518 requests in 30.06s, 631.95MB read Socket errors: connect 0, read 0, write 0, timeout 80 Requests/sec: 57134.45 Transfer/sec: 21.02MB
  • 68. Minimal Heap Size - Spring (-Xmx32M)
  • 69. Minimal Heap Size - Spring (-Xmx32M) wrk -t 8 -c 80 -d 30s --latency http://localhost:8080/github/stars Running 30s test @ http://localhost:8080/github/stars 8 threads and 80 connections Thread Stats Avg Stdev Max +/- Stdev Latency 16.38ms 87.16ms 955.97ms 97.33% Req/Sec 3.92k 1.19k 6.21k 75.93% Latency Distribution 50% 2.11ms 75% 4.21ms 90% 8.59ms 99% 578.98ms 905844 requests in 30.05s, 457.16MB read Requests/sec: 30148.82 Transfer/sec: 15.22MB
  • 70. Minimal Heap Size - Spring (-Xmx64M)
  • 71. Minimal Heap Size - Spring (-Xmx64M) wrk -t 8 -c 80 -d 30s --latency http://localhost:8080/github/stars Running 30s test @ http://localhost:8080/github/stars 8 threads and 80 connections Thread Stats Avg Stdev Max +/- Stdev Latency 10.50ms 66.17ms 786.18ms 97.73% Req/Sec 8.60k 2.27k 13.25k 79.23% Latency Distribution 50% 0.95ms 75% 1.68ms 90% 3.30ms 99% 423.31ms 2006502 requests in 30.09s, 0.99GB read Requests/sec: 66689.38 Transfer/sec: 33.66MB
  • 72. Minimal Heap Size - Micronaut (-Xmx64M)
  • 73. Minimal Heap Size - Micronaut (-Xmx64M) wrk -t 8 -c 80 -d 30s --latency http://localhost:8080/github/stars Running 30s test @ http://localhost:8080/github/stars 8 threads and 80 connections Thread Stats Avg Stdev Max +/- Stdev Latency 2.28ms 5.05ms 95.77ms 90.92% Req/Sec 14.11k 5.15k 25.09k 73.51% Latency Distribution 50% 283.00us 75% 2.12ms 90% 6.78ms 99% 23.54ms 2451595 requests in 30.06s, 1.22GB read Requests/sec: 81556.51 Transfer/sec: 41.69MB
  • 74. Graal VM “High-performance polyglot VM” (and AOT compiler)
  • 75. Graal Substrate VM $ ./gradlew nativeImage (or ./mvnw package -Dpackaging=native-image) … 2 minutes later … $ file application application: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2 for GNU/Linux 3.2.0, with debug_info, not stripped $ ll application -rwxr-xr-x. 1 moe moe 62M 18. Dez 11:29 application $ ldd application linux-vdso.so.1 (0x00007ffd7cbbe000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fc717414000) libdl.so.2 => /lib64/libdl.so.2 (0x00007fc71740d000) libz.so.1 => /lib64/libz.so.1 (0x00007fc7173f3000) librt.so.1 => /lib64/librt.so.1 (0x00007fc7173e8000) libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fc7173cd000) libc.so.6 => /lib64/libc.so.6 (0x00007fc717202000) /lib64/ld-linux-x86-64.so.2 (0x00007fc717456000)
  • 76. Graal (no -Xmx set) KB = 92 MB Idle: Under load: Startup completed in 67ms.
  • 77. Graal - Benchmark wrk -t 8 -c 80 -d 30s --latency http://localhost:8080/github/stars Running 30s test @ http://localhost:8080/github/stars 8 threads and 80 connections Thread Stats Avg Stdev Max +/- Stdev Latency 1.60ms 2.28ms 41.76ms 86.51% Req/Sec 8.88k 1.21k 12.09k 79.71% Latency Distribution 50% 416.00us 75% 2.34ms 90% 4.61ms 99% 10.16ms 1355757 requests in 30.04s, 305.29MB read Socket errors: connect 0, read 0, write 0, timeout 80 Requests/sec: 45130.28 Transfer/sec: 10.16MB
  • 79. Experience from the trenches Pro: ● Services start faster than Spring Boot ● Smaller JARs ● Tests are faster, as the embedded server starts fast ○ Spring mitigates this with application context caching! Contra: ● No separation of management and API port ● Spring Boot is more common (more documentation, blog posts, Stack Overflow answers) ● Extension story from Spring is better (e.g. OAuth2)
  • 80. Conclusion ● Good documentation ● Recommendation for writing small services ○ I have no experience with bigger services in Micronaut. If you have, please contact me :) ● Development is fun ● If the features are sufficient: Try it! ● GraalVM Substrate VM, if you get it to run, is really cool ○ This is NOT a JVM, so profilers / metrics / thread dumps etc. won’t work ○ Build times like it’s C++ (> 30s) ○ Not all libraries are compatible and workarounds must be used ■ I ran into trouble with Caffeine Cache (GitHub Issue)
  • 81. Literature ● GitHub Repo: https://github.com/qaware/microservices-with-micronaut ● Micronaut documentation: https://docs.micronaut.io/latest/guide/index.html ● GraalVM: https://www.graalvm.org/