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
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
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
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 )
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 )
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 ?