Upgrade to Pro — share decks privately, control downloads, hide ads and more …

The Touch and Feel of Micronaut

The Touch and Feel of Micronaut

A presentation material for KanJava 1906:
https://kanjava.connpass.com/event/134119/

Mitsuyuki Shiiba

June 20, 2019
Tweet

More Decks by Mitsuyuki Shiiba

Other Decks in Programming

Transcript

  1. The Touch and Feel of Micronaut 2019/06/20 KanJava June, 2019

    Mitsuyuki Shiiba (@bufferings) EC Incubation Development Dept. Rakuten, Inc.
  2. @bufferings #kanjava It reminds me Spring Boot, so it was

    really easy for me to try. Micronaut @Controller public class Application { public static void main(String[] args) { Micronaut.run(Application.class); } @Get("/hello/{name}") public String hello(String name) { return "Hello " + name; } }
  3. @bufferings #kanjava • Faster startup time • Low memory footprint

    • Effective use of CPU It has become matter
  4. @bufferings #kanjava 1. Multiple WARs on one application server 2.

    One server for one app with VMs 3. PaaS, 12 Factor App & Container 4. Embedded Tomcat & executable JAR by Spring Boot 5. Kubernetes & Microservices Java 10 years around me
  5. @bufferings #kanjava • Microservices – Communications over network • Blocking

    – Waiting time • Want to – Utilize CPU • Thread is heavy (Context Switch, Memory) • Reactive – RxJava, Spring 5 (Reactor) Recent Java - Reactive
  6. @bufferings #kanjava Currently we're doing a lot at Runtime. •

    Runtime Component Scan • Runtime DI & AOP It makes our app start slower & consume memory. Recent Java - Challenges
  7. @bufferings #kanjava • Compile-time DI & AOP • No reflection

    • No runtime proxy Ahead of Time (AOT) Compilation
  8. @bufferings #kanjava • Microservices in mind from the beginning •

    Inspired by Spring & Grails • First class support for Reactive based on Netty • Ahead of Time Compilation • Support for Java, Kotlin, Groovy • Support for GraalVM Native Image https://micronaut.io/ Micronaut
  9. @bufferings #kanjava • Java code to a standalone executable •

    This executable does not run on the Java VM • but includes necessary components from “Substrate VM” • The resulting program has faster startup time • and lower runtime memory overhead https://www.graalvm.org/docs/reference-manual/aot-compilation/ GraalVM Native Image (early adopter)
  10. @bufferings #kanjava My thoughts: • AOT compilation & Native Image

    would be popular in a few years • Many frameworks would start supporting them including Spring • and just I like Micronaut My Motivation
  11. @bufferings #kanjava With Micronaut 1.2.0.RC1 • Micronaut CLI • HTTP

    Server • Integration Test Demo Code: https://github.com/bufferings/kanjava1906 Demo 1
  12. @bufferings #kanjava Micronaut CLI # Create Application $ mn create-app

    demo # Interactive Mode $ mn | Starting interactive mode... | Enter a command name to run. Use TAB for completion: mn> create-controller hello
  13. @bufferings #kanjava Integration Test @Inject @Client("/") RxHttpClient client; @Test public

    void testIndex() throws Exception { assertEquals("Hello World", client.toBlocking().retrieve("/hello/World")); }
  14. @bufferings #kanjava HTTP Server (Reactive) @Controller("/hello") public class HelloController {

    @Get("/{name}") public Single<String> index(String name) { return Single.just("Hello " + name); } }
  15. @bufferings #kanjava Validation (AOP) @Controller("/hello") public class HelloController { @Get("/{name}")

    public Single<String> index(@Size(min = 10) String name) { return Single.just("Hello " + name); } } "message": "name: size must be between 10 and 2147483647"
  16. @bufferings #kanjava DI – Bean Definition @Singleton public class GreetingService

    { public String greeting(String name) { return "Hello " + name; } }
  17. @bufferings #kanjava DI – Constructor Injection @Controller("/hello") public class HelloController

    { private final GreetingService greetingService; HelloController(GreetingService greetingService) { this.greetingService = greetingService; }
  18. @bufferings #kanjava Postgres Reactive public Single<String> getScreenName(String name) { return

    client.rxPreparedQuery( "SELECT screen_name FROM speakers WHERE name=$1", Tuple.of(name) ).map(rows -> { PgIterator it = rows.iterator(); if (!it.hasNext()) return name; return it.next().getString("screen_name"); }); }
  19. @bufferings #kanjava Use Declarative HTTP Client for test @Inject HelloClient

    client; @Test public void testHello() { assertEquals("Hello World", client.hello("World")); }
  20. @bufferings #kanjava Microservices in mind • HTTP Server, HTTP Client,

    Reactive based on Netty Fast startup & low memory footprint • DI & AOP with AOT Compilation GraalVM Native Image Support • makes our app start in a few hundreds of milliseconds Summary
  21. @bufferings #kanjava Introduction to Micronaut: Lightweight Microservices with Ahead of

    Time Compilation by Graeme Rocher https://youtu.be/P1qp_l5EFic Micronaut | Technology Radar | ThoughtWorks https://www.thoughtworks.com/radar/languages-and- frameworks/micronaut References