theme: OCI White slidenumbers: false [.hide-footer]
Ultra-Lightweight Microservices for the JVM
-- by Graeme Rocher
[.text: #000000, text-scale(0.8), alignment(left)]
- Creator of Grails (http://grails.org)
- Creator of Micronaut (http://micronaut.io)
- Author "The Definitive Guide to Grails"
- Senior Engineer at Object Computing (http://objectcomputing.com)
- 2018 Oracle Groundbreaker Award Winner
[.text: #000000, text-scale(0.8), alignment(left)]
- How we got here
- Microservice Challenges
- Microservice Framework Lanscape
- Micronaut Demos
[.text: #000000, text-scale(0.8), alignment(left)]
- Since 2008, a lot has changed
- 10 Years is a long time in technology
- Everybody was building Monoliths
- No Angular, No React, No Docker, No Microservices
[.text: #000000, text-scale(0.8), alignment(left)]
- Let's try adapt existing legacy technologies for Microservices
- Technologies like Spring, Jakarta EE etc were never optimized for low memory footprint Microservices
[.text: #000000, text-scale(0.8), alignment(left)]
Shall we:
- Try and convince people that something never designed for Microservices is still ok?
- Go back to the drawing board
[.text: #000000, text-scale(0.8), alignment(left)]
- Create a New Framework designed from the ground-up for Microservices and Serverless Computing
- Blazing fast startup time
- Low Memory Footprint
- As Small As Possible JAR Sizes
- Zero Dependency
- 12 Factor - https://12factor.net
[.text: #000000, text-scale(0.8), alignment(left)]
To meet this goal we performed an analysis of Spring and Grails and the challenges to using them to develop Microservice applications
[.text: #000000, text-scale(0.8), alignment(left)]
Spring is an amazing technical achievement and does so many things, but does them at Runtime.
- Reads the byte code of every bean it finds
- Synthesizes new annotations for each annotation on each bean method, constructor, field etc. to support Annotation metadata
- Builds Reflective Metadata for each bean for every method, constructor, field etc.
[.text: #000000, text-scale(0.8), alignment(left)]
- Frameworks based on reflection and annotations become fat
- But we love the programming model and productivity so we live with it
- So ... why should we be more efficient?
[.text: #000000, text-scale(0.8), alignment(left)]
- The Android Community already solved the problem
- Ahead of Time Compilation used extensively
- Google Dagger 2.x
- Compile Time Dependency Injector
- Reflection Free
- Limited in Scope to just DI
[.text: #000000, text-scale(0.8), alignment(left)]
- Designed from the ground up with Microservices in mind
- Ultra-light weight and Reactive - Based on Netty
- Uses Ahead of Time Compilation
- HTTP Client & Server
- Support for Java, Kotlin and Groovy
- Hello Micronaut
[.hide-footer]
@Controller
class HelloController {
@Get("/hello/{name}")
String hello(String name) { return "Hello " + name; }
}
@Client("/") // Client Generated at Compile Time
interface HelloClient {
@Get("/hello/{name}")
String hello(String name);
}
[.text: #000000, text-scale(0.8), alignment(left)]
- Smallest Micronaut Hello World JAR is 10MB when written Java or 12MB in Groovy
- Can be run with as little as 10mb Max Heap with Kotlin or Java (22mb for Groovy)
- Startup time around a second for Kotlin or Java (a little more for Groovy)
- All Dependency Injection, AOP and Proxy generation happens at compile time
[.text: #000000, text-scale(0.8), alignment(left)]
- All Dependency & Configuration Injection
- Annotation Metadata (Meta annotations)
- AOP Proxies
- Essentially all framework infrastructure
- ie. What Spring/CDI do at runtime
- Essentially, Micronaut is a AOT framework
[.text: #000000, text-scale(0.8), alignment(left)]
- New Little HTTP Frameworks appearing all the time
- If all we had achieved was another HTTP server Micronaut wouldn't be very interesting
- What else does it do?
[.text: #000000, text-scale(0.8), alignment(left)]
[.hide-footer]
- Service Discovery - Consul, Eureka, Route 53 and Kubernetes
- Configuration Sharing - Consul Supported and Amazon ParameterStore
- Client Side Load Balancing - Integrated or Netflix Ribbon Supported
- Support for Serverless Computing; AWS Lambda, OpenFaas, Fn Supported; Azure coming
- Micronaut Pet Store
[.text: #000000, text-scale(0.8), alignment(left)]
- Write Functions and Run them locally or as regular server applications
- Deploy Functions to AWS Lambda - after warm-up functions execute in milliseconds
@Field @Inject Twitter twitter
@CompileStatic
URL updateStatus(Message status) {
Status s = twitter.updateStatus(status.text)
String url = "https://twitter.com/$s.user.screenName/status/${s.id}"
return new URL(url)
}
[.text: #000000, text-scale(0.8), alignment(left)]
- New Polyglot VM from Oracle
- Runs JS, Java, Ruby, R etc.
- Ability to turn Java code native
- https://www.graalvm.org
[.text: #000000, text-scale(0.8), alignment(left)]
- Works well when:
- Little or no runtime reflection is used
- Limited or no dynamic classloading
- You plan ahead
- You use third party libraries selectively
- Micronaut + GraalVM
[.text: #000000, text-scale(0.8), alignment(left)]
- Like Graal itself at the Experimental Phase
- Mirconaut AOT compilation and refection free model makes it easier
- A lot of Micronaut already working:
- HTTP Server, Client & Serverless
- Service Discovery
- DI and AOP
[.text: #000000, text-scale(0.8), alignment(left)]
- Compile Time DI & AOP
- HTTP Client & Server
- Service Discovery
- Distributed Tracing
- Serverless Functions
- Data Access: SQL, MongoDB, Redis, Cassandra etc.
- The Micronaut CLI now available via SDKman!
$ curl -s "https://get.sdkman.io" | bash
$ source "$HOME/.sdkman/bin/sdkman-init.sh"
$ sdk install micronaut
$ mn create-app hello-world
[.text: #000000, text-scale(0.8), alignment(left)]
- Gitter Community: https://gitter.im/micronautfw
- User Guide: http://micronaut.io/documentation.html
- Micronaut Guides: http://guides.micronaut.io
- FAQ: http://micronaut.io/faq.html
- Github: https://github.com/micronaut-projects/micronaut-core
- Examples: https://github.com/micronaut-projects/micronaut-examples
[.text: #000000, text-scale(0.8), alignment(left)]
- Loads of upcoming Events
- Checkout - http://micronaut.io/events.html
- Webinar
[.text: #000000, text-scale(0.8), alignment(left)]
- Micronaut aims to provide the same wow factor for Microservices that Grails did for Monoliths
- Built by the people that made Grails, leveraging over 10 years experience in framework development
- Uses Ahead of Time Compilation to support low-memory footprint
- Micronaut 1.0 is available now
[.hide-footer]