Slide 1

Slide 1 text

Migrating QUARKUS

Slide 2

Slide 2 text

Contents 1. who are we? 2. what can you expect? 3. what is quarkus? 4. why migrate? 5. migration a. application description b. steps 6. performance comparative 7. references

Slide 3

Slide 3 text

$ whoami @vilojona [email protected] aytartana.wordpress.com github.com/jonathanvila Java Champion JUG co-leader at BarcelonaJUG Co-founder of JBCNConf Software Engineer at Red Hat App. Modernisation and Migration team

Slide 4

Slide 4 text

About: 4 Miguel Pérez Colino ● Product Manager for MTA ● ~9 years in Red Hat ○ Consultant (~3) ○ Solution Architect (~2) ● Technical Project Leader ● IT Architect ● Systems Engineer ● SysAdmin @mmmmmmpc ?

Slide 5

Slide 5 text

What can you expect ? My experience v 2.2.5 v 1.7.0 opinionated option magistral lecture something that works THE way QUARKUS

Slide 6

Slide 6 text

Quarkus brief description

Slide 7

Slide 7 text

What is Quarkus ? A Kubernetes Native, Java, Scala, Kotlin stack tailored for GraalVM and OpenJDK HotSpot crafted from the best of breed Java libraries and standards.

Slide 8

Slide 8 text

300x faster 10x smaller focused on easy to code opensource fast paced releases tons of extensions Quarkus key facts

Slide 9

Slide 9 text

Quarkus extensions ( > 90 ) Kafka Camel Keycloak Spring Vert.x RestEasy …. Microprofile Openshift Jaegger Flyway Hibernate Infinispan ...

Slide 10

Slide 10 text

Quarkus evolution 2018-12 v 0.0.1 2019-06 v 0.15.0 2019-11 v 1.0.0 Release 2020-01 v 1.2.0 1 minor version every 2 weeks !!! (+/-)

Slide 11

Slide 11 text

Quarkus performance

Slide 12

Slide 12 text

Quarkus OSS status

Slide 13

Slide 13 text

Migration

Slide 14

Slide 14 text

Why to migrate My experience easy to develop with an easy CDI, REST, … long startup times, eternal tests heavyweight too many things happen under the hood easy to develop applications fast lightweight GraalVM compatible QUARKUS ✅ FaaS compatible ( lambdas ) ✅ less money on public cloud

Slide 15

Slide 15 text

Application migrated Spring Data ( repositories, jdbc , ... ) Spring Web ( REST ) Spring Security Spring documentation ( Swagger ) Spring actuators Spring micrometer Spring CDI Spring AOP Spring cache Hibernate Panache JaxRS Quarkus Security OpenAPI SmallRye Health Microprofile Metrics CDI Spec ( Arc ) --- Quarkus cache ( Caffeine ) QUARKUS

Slide 16

Slide 16 text

Elements not migrated Spring JDBC querying * no helper methods to work with Inserts, Updates…. * no equivalent to org.springframework.jdbc.core classes * we need to reimplement everything using AGROAL JMX * not supported by GraalVM definition

Slide 17

Slide 17 text

Migration Steps

Slide 18

Slide 18 text

CDI ● Replace Autowired by Inject ● Beans declaration using @ApplicationScoped ● Auto injection on Constructors ● Lazy by default

Slide 19

Slide 19 text

CDI PROs ● straight forward migration for Beans ● no feature missing ● we also can annotate the beans to be injected depending on the profile or a config property CONs ● no private members on injection

Slide 20

Slide 20 text

JPA Repositories ● Repository classes to implement PanacheRepositoryBase Quarkus will generate the implementation of the usual methods : list , find, persist, delete

Slide 21

Slide 21 text

JPA Repositories PROs ● straightforward migration CONs ● no Query DSL methods

Slide 22

Slide 22 text

Spring REST to JAX-RS ● Move from Spring REST to the standard JAX-RS @RestController @RequestMapping, @GetMapping, @PostMapping, @PutMapping, @DeleteMapping @PathVariable @Path @GET, @POST, @PUT @DELETE @PathParam QUARKUS

Slide 23

Slide 23 text

Spring REST to JAX-RS PROs ● straightforward migration INFO ● Spring also supports JAX-RS as 3rd party lib

Slide 24

Slide 24 text

Spring REST Security to Quarkus Security ● replaced Spring REST Security

Slide 25

Slide 25 text

Spring REST JDBC Security to Elytron JDBC realm Add extension dependency : elytron-security-jdbc Configure on properties file and remove configureGlobal method

Slide 26

Slide 26 text

Spring REST Security to Quarkus security PROs ● Almost the same result ● By configuration rather than code CONs ● Quarkus doesn’t have an expression language

Slide 27

Slide 27 text

CORS ● configured CORS in the application.properties file

Slide 28

Slide 28 text

CORS PROs ● easy to enable , no code involved CONs ● at global level, not per Controller

Slide 29

Slide 29 text

Metrics ● Add smallRye metrics extension ● Annotate each method ( for custom metrics ) Micrometer compatibility quarkus.smallrye-metrics.micrometer.compatibility=true

Slide 30

Slide 30 text

Metrics PROs ● OpenMetrics standard naming or Micrometer, you choose ● You can even use Micrometer extension CONs ● no AOP so you need to annotate every method

Slide 31

Slide 31 text

Validation ● Spring Validation to Hibernate Validator ● Move from @ControllerAdvice to JAX-RS ExceptionMapper

Slide 32

Slide 32 text

Validation PROs ● standard ● easy CONs ● none

Slide 33

Slide 33 text

Swagger ( OpenAPI v 3.0 ) ● Add extension “openapi” ● extend Application

Slide 34

Slide 34 text

Swagger ( OpenAPI v 3.0 ) PROs ● straightforward migration ● standard and easy way to configure ● Swagger-UI OOTB CONs ● not REST paths scan configuration

Slide 35

Slide 35 text

AOP for app metrics ● use of microprofile metrics annotations

Slide 36

Slide 36 text

AOP for repository metrics ● using Hibernate built in metrics enabled in properties

Slide 37

Slide 37 text

AOP for app metrics PROs ● standard ● easy to customise CONs ● need to annotate ALL methods one by one for custom app metrics ● no expression language to define methods affected

Slide 38

Slide 38 text

Local caching ● Spring uses a default ConcurrentHashMap ● Caffeine uses a ConcurrentLinkedHashMap ● Add “cache” extension ( Caffeine ) and annotate the method

Slide 39

Slide 39 text

Local Caching PROs ● easy to implement and configure ● straightforward migration CONs ● none

Slide 40

Slide 40 text

Test : REST MockMVC -> RestAssured

Slide 41

Slide 41 text

Test REST PROs ● RESTassured is easy to handle and very intuitive CONs ● No way to simulate Roles without creating an user for each role to test INFO ● Changed JSonPath to GPath

Slide 42

Slide 42 text

Test - resources ● Annotate test suites with @QuarkusTest to boot the app ● Annotate test suites with @QuarkusTestResource to load an embedded resource

Slide 43

Slide 43 text

Test - Mock ● Use the quarkus-mockito dependency : quarkus-junit5-mockito ● Annotate mocks with @InjectMock

Slide 44

Slide 44 text

Spring API in Quarkus

Slide 45

Slide 45 text

Spring WEB ( REST) : spring-web extension Using same Spring API for REST Supported Annotations @RestController @RequestMapping @GetMapping @PostMapping @PutMapping @DeleteMapping @PatchMapping @RequestParam @RequestHeader @MatrixVariable @PathVariable @CookieValue @RequestBody @ResponseStatus @ExceptionHandler

Slide 46

Slide 46 text

Spring DI : spring-di extension Using same API as Spring DI Annotations Supported @Autowired @Repository @Qualifier @Scope @Value @Component * doesn’t support an expression language @Configuration @Service @Bean

Slide 47

Slide 47 text

Spring Data : spring-data-jpa Using same API for Spring Data Supported Any interface of : Repository, CrudRepository, PagingAndSortingRepository, JpaRepository Derived Query Methods User defined Queries Not Supported Invocations to any method of QueryByExampleExecutor QueryDSL

Slide 48

Slide 48 text

Spring Security: spring-security extension Using same API as Spring Security Annotations Supported @Secured @Preauthorized Expressions allowed hasAnyRole permitAll denyAll isAnonymous isAuthenticated #paramName ==

Slide 49

Slide 49 text

Performance comparative (shallow) SPRING BOOT 2.2.5 QUARKUS Hotspot 1.8 QUARKUS GraalVM 20.1 build ( uber-jar ) 4.3 s 48 Mb 13 s 42 Mb 185 s 97 Mb boot 6.8 s 630 Mb 2.6 s ( 3x ) 251 Mb ( 2.5x ) 0.462 s ( 15x ) 21 Mb ( 30x )

Slide 50

Slide 50 text

References

Slide 51

Slide 51 text

Repositories ● Spring REST PetClinic https://github.com/spring-petclinic/spring-petclinic-rest ● Quarkus REST PetClinic https://github.com/jonathanvila/spring-petclinic-rest/tree/quarkus Documentation/News/Help ● https://quarkus.io ● @QuarkusIO ● https://developers.redhat.com/search/?t=quarkus ● [email protected]

Slide 52

Slide 52 text

Interactive Tutorials ( Katacoda ) ● https://developers.redhat.com/courses/quarkus/ List of Tutorials ● Getting Started ● For Spring Devs ● Streaming with Kafka ● Hibernate and Panache ● Prometeus & Grafana

Slide 53

Slide 53 text

Cheat Sheet ● https://lordofthejars.github.io/quarkus-cheat-sheet/ by Alex Soto

Slide 54

Slide 54 text

Do you want to start coding with Quarkus ? https://code.quarkus.io/

Slide 55

Slide 55 text

Migration Toolkit for Applications by Red Hat (MTA) New Web Console UI with Patternfly 4 (v 5.1.0)

Slide 56

Slide 56 text

Migration Toolkit for Applications by Red Hat (MTA) Review rules new interface in 5.1.0

Slide 57

Slide 57 text

● Rules to help to migrate from SB to Quarkus ( MTA 5.1.0 ) ○ Open Source tool to help on applications migrations ■ https://red.ht/mta ■ https://github.com/windup ○ 24 rules , covering ... ■ DI ■ Integration ■ Metrics ■ JPA ■ Security ■ Web ■ Shell ■ …. Migration Toolkit for Applications by Red Hat (MTA)

Slide 58

Slide 58 text

Migration Toolkit for Applications by Red Hat (MTA) Spring Boot to Quarkus output example

Slide 59

Slide 59 text

Migration Toolkit for Applications by Red Hat (MTA) IDE Integration Eclipse / VS Code / Eclipse Che

Slide 60

Slide 60 text

Migration Toolkit for Applications by Red Hat (MTA) OpenShift Operator (v 5.1.0)

Slide 61

Slide 61 text

Real use cases Lufthansa Technik AVIATAR experiences significant cloud resources savings by moving to Kubernetes-native Quarkus (link) Suomen Asiakastieto Oy chooses Quarkus for their microservices development (link) Vodafone Greece replaces Spring Boot with Quarkus (link) ● “Quarkus offers by default (without trying to optimize it) is 50%-60% more lightweight (in JVM mode) that what Spring offers” ● “30 to 40% better developer productivity vis-a-vis Spring Boot,” Public Clouds exp. -- Internal Labs --- Save up to : ● 37 % on Cloud ( Quarkus JVM ) ● 71 % on Cloud ( Quarkus + GraalVM )

Slide 62

Slide 62 text

@vilojona [email protected] aytartana.wordpress.com github.com/jonathanvila Thank you :) @mmmmmmpc [email protected] https://developers.redhat.com/blog/ author/miguel/ github.com/mpereco

Slide 63

Slide 63 text

Questions received on meetups ( 1/3 ) 1. What do the spring extensions do internally ? 2. Those quarkus extensions for libraries are like a fork of the general library ? 3. General library and quarkus extension will be always on sync on versions ? 4. What about the patches on the general library and the impact on quarkus extension ? 5. Have you tried compiling the bytecode with Graal ? [I assume this means the bytecode generated by the Spring version] a. Yes, but I didn’t succeed . I assume there are a lot of things to do and elements to take into consideration (libraries not supported) 6. Do you recommend to always migrate from Spring ? a. NO b. migration means investing money and time, so the goal has to be clear. Benefit is great when you have microservices with scale to zero as common, or when you can consider moving to Serverless/FaaS (lambdas) 7. Using the spring extensions would have same performace as pure quarkus ? 8. How many redhatters in the project ? a. Currently there are more than 360 contributors, and lot’s of redhatters but also non redhatters. 9. Is there an Elytron LDAP extension for security ? a. YES : https://quarkus.io/guides/security-ldap

Slide 64

Slide 64 text

Questions received on meetups ( 2/3 ) 10. How would the Quarkus support work ? a. https://quarkus.io/support/ 11. AOP on JVM ? a. NO b. because AspectJ needs to add the plugin to wave the classes on the build phase, and this conflicts with the same Quarkus plugin 12. Company using Quarkus in native mode in production ? 13. Porting websockets to Quarkus ? 14. Quarkus native throughput degradation ? a. basically related to the GraalVM way of working with AOT compilation b. switch to g1gc in native images, profile guided optimizations ( GraalVM Enterprise ) 15. Hibernate metrics affect performance ? 16. Is it possible to run Quarkus inside EAP ? 17. Does Quarkus have enterprise support ? a. YES b. https://quarkus.io/support/ 18. Difference between Hotspot and GraalVM a. hotspot mean the JVM, so you need a Virtual Machine installed to run the app b. graalvm will produce native code applications that don’t need any vm installed

Slide 65

Slide 65 text

Questions received on meetups ( 3/3 ) 19. When to migrate ? a. see question #6 20. Benefits of Quarkus vs Micronaut a. both are good technologies, with different flavour, covering a space of the optimized native applications b. you need to read and try both and decide based on your own criteria 21. Can SB compile to native with GraalVM ? a. they are working on that b. they have projects being able to go native in the labs/experimental repos 22. Does MTA/Windup use AI ? a. NO b. it statically analyses applications based on rules , mainly defined on xml files that you can create yours rules 23. How to migrate from EAP to Quarkus 24. In a migration what do you recommend , going to the standard libraries or using the spring extensions ? 25. Is Spring Kafka supported ? 26. Is there a way to debug a GraalVM compiled application ? 27. Are there many companies adopting Quarkus ? 28. How easy is to produce the native image ? 29. How easy is to deploy to cloud ?