SlideShare a Scribd company logo
The Path Towards Spring
Boot Native Applications
September 2–3, 2020
springone.io
Join https://springone.slack.com #session-the-path-towards-spring-boot-native-applications
1
Andy Clement
Sébastien Deleuze
Safe Harbor Statement
The following is intended to outline the general direction of VMware's offerings. It is intended for information
purposes only and may not be incorporated into any contract. Any information regarding pre-release of
VMware offerings, future updates or other planned modifications is subject to ongoing evaluation by
VMware and is subject to change. This information is provided without warranty or any kind, express or
implied, and is not a commitment to deliver any material, code, or functionality, and should not be relied
upon in making purchasing decisions regarding VMware's offerings. These purchasing decisions should only
be based on features currently available. The development, release, and timing of any features or
functionality described for VMware's offerings in this presentation remain at the sole discretion of Pivotal.
Pivotal has no obligation to update forward looking information in this presentation.
2
Agenda
● Native applications
● Spring Boot native applications
● Where are we?
● Getting started
● Demo
● spring-graalvm-native
● The road ahead
3
Native applications
5
Native ahead-of-time compilation
Java or Kotlin
application
GraalVM native
compiler
Native
executable
Lightweight
container image
EXE0110
5
Two main benefits
6
Instant startup
Reduced memory
consumption
7
Scale to zero
You only pay when your application is
used
Serverless for any kind of workload
including regular web applications
Good fit with platforms like Knative
3x to 5x memory reduction (RSS)
Cheaper cloud instances
Critical with systems splitted into multiple
microservices
Instant Startup
Reduced memory
consumption
Our goal is cheaper hosting of your Spring Boot applicationsCheaper and more sustainable Spring Boot applications
7
JVM and native executables trade-offs
8
Key differences between JVM and native
9
● Static analysis of your application from the main entry point
● Configuration required for:
○ Reflection
○ Proxies
○ Resources
● Classpath fixed at build time
● No class lazy loading
● Some code will run at build time
GraalVM native is a source of inspiration for the
JVM ecosystem
10
An upcoming Java platform standard with
Project Leyden
11
GraalVM 20.2
● Better static container image support
● Faster native image generation
● java.* and javax.* classes are now mostly initialized at runtime
● Enterprise edition only
○ Low Latency Garbage Collector (G1 like)
○ Loop unrolling optimization
12
Still in “early adopter” mode (supported with breaking
changes) but matures quickly
13
Spring Boot native applications
Good fit with Spring Boot stand-alone
deployment model
15
Compiling your application to a native executable
requires reflection/proxy/resources configuration
16
The Spring team is doing most of the hard work
17
Our goal is to support compilation of existing or
new Spring Boot applications to native
executables. Unchanged.
18
“We are excited about the great partnership between the Spring and
GraalVM engineering teams to support native ahead-of-time
compilation for millions of Spring Boot applications. This is a game
changer enabling low memory footprint and instant startup for these
workloads.”
Thomas Wuerthinger, GraalVM founder & project lead
19
Collaboration between Spring and GraalVM teams
Leverage Spring Boot container image support
2
0
> mvn spring-boot:build-image
or
> gradle bootBuildImage
Using Paketo Buildpacks
21
https://paketo.io/
To create lightweight container images
2
2
Where are we?
Timeline
GraalVM fixes
and improvements
Incubating support in
spring-graalvm-native
Spring Boot support
We are here
24
https://github.com/oracle/graal/labels/spring
25
Timeline
GraalVM fixes
and improvements
Incubating support in
spring-graalvm-native
Spring Boot support
We are here
26
https://github.com/spring-projects-experimental/spring-graalvm-native
27
spring-graalvm-native
● Incubating Spring Boot native application support
○ It includes a plugin for the GraalVM native image builder
● Analyses the Spring Boot application at build time
○ Computes the most optimal native image configuration
○ Challenge is doing that with static analysis
● Also perform some build time transformation for:
○ Optimized footprint
○ Compatibility
28
We have just released 0.8.0
● GraalVM 20.2 baseline
● Use Spring Boot 2.4.0 latest milestone
● Significant footprint improvements
● Wider range of supported technology
● New experimental functional mode
● Spring Boot lightweight container integration
○ Maven
○ Gradle
29
Patch updates until Spring Boot 2.4.0
● 0.8.1 (September 2020)
○ Upgrade to Spring Boot 2.4.0-M3
● 0.8.2 (October 2020)
○ Upgrade to Spring Boot 2.4.0-RC1
● 0.8.3 (November 2020)
○ Upgrade to Spring Boot 2.4.0
○ GraalVM 20.3 baseline
30
Starters supported in 0.8.x
● Actuator
● Cache
● Data JPA, MongoDB, R2DBC, Redis
● JDBC
● Logging (Logback)
● Thymeleaf
● Validation
● Web (Spring MVC with Tomcat)
● Webflux (Netty)
● Wavefront
● Spring Cloud Function
31
Timeline
GraalVM fixes
and improvements
Incubating support in
spring-graalvm-native
Spring Boot support
We are here
32
Comparing Spring Boot 2.3 LoggingSystem ...
33
Map<String, String> systems = new LinkedHashMap<>();
systems.put("ch.qos.logback.core.Appender",
"org.springframework.boot.logging.logback.LogbackLoggingSystem");
systems.put("org.apache.logging.log4j.core.impl.Log4jContextFactory",
"org.springframework.boot.logging.log4j2.Log4J2LoggingSystem");
systems.put("java.util.logging.LogManager",
"org.springframework.boot.logging.java.JavaLoggingSystem");
SYSTEMS = Collections.unmodifiableMap(systems);
… with Spring Boot 2.4 one
34
ClassLoader classLoader = LoggingSystem.class.getClassLoader();
if (ClassUtils.isPresent("ch.qos.logback.core.Appender", classLoader)) {
return LogbackLoggingSystem::new;
}
if (ClassUtils.isPresent("org.apache.logging.log4j.core.impl.Log4jContextFactory", classLoader)) {
return Log4J2LoggingSystem::new;
}
if (ClassUtils.isPresent("java.util.logging.LogManager", classLoader)) {
return JavaLoggingSystem::new;
}
throw new IllegalStateException("No suitable logging system located");
New flags available in Spring Framework 5.3
# -3.6M RSS
-Dspring.xml.ignore=true
# -0.5M RSS
-Dspring.spel.ignore=true
35
A new Tomcat artifact optimized for native apps
<!-- -3.5M RSS -->
<dependency>
<groupId>org.apache.tomcat.experimental</groupId>
<artifactId>tomcat-embed-programmatic</artifactId>
<version>9.0.38</version>
</dependency>
36
Getting started
start.spring.io or an existing project
38
Make sure to use Spring Boot 2.4 latest milestone
39
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.0-M2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
Update configuration to avoid using proxies
40
@SpringBootApplication(proxyBeanMethods = false)
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
Configure Maven plugin
41
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<image>
<env>
<BP_BOOT_NATIVE_IMAGE>true</BP_BOOT_NATIVE_IMAGE>
</env>
</image>
</configuration>
</plugin>
Add the spring-graalvm-native dependency
42
<dependency>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-graalvm-native</artifactId>
<version>0.8.0</version>
</dependency>
Build the native application
43
> mvn spring-boot:build-image
Successfully built image 'docker.io/library/demo:0.0.1-SNAPSHOT'
Total time: 60 s
● No need for a GraalVM native local install
● Build happens in a container
● And produces a container
Run the native application
44
> docker run -p 8080:8080 docker.io/library/demo:0.0.1-SNAPSHOT
. ____ _ __ _ _
/ / ___'_ __ _ _(_)_ __ __ _    
( ( )___ | '_ | '_| | '_ / _` |    
/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |___, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot ::
Started application in 0.05 seconds (JVM running for 0.009)
You can also build a native executable without
using containers
45
Configure Maven plugin in a native profile
46
<plugin>
<groupId>org.graalvm.nativeimage</groupId>
<artifactId>native-image-maven-plugin</artifactId>
<version>20.2.0</version>
<configuration>
<mainClass>com.example.demo.DemoApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>native-image</goal>
</goals>
<phase>package</phase>
</execution>
</executions>
</plugin>
Build the native application
47
> mvn -Pnative clean package
Total time: 60 s
● Need for a GraalVM native local install
● Build happens directly on your host (Linux, Mac and Windows are
supported)
● Produces a native executable
● No cross compilation
Run the native application
48
> target/com.example.demo.demoapplication
. ____ _ __ _ _
/ / ___'_ __ _ _(_)_ __ __ _    
( ( )___ | '_ | '_| | '_ / _` |    
/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |___, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot ::
Started application in 0.05 seconds (JVM running for 0.009)
Petclinic Demo
49
How fast is your PetClinic?
50
Sample On the JDK native-executable
petclinic-jdbc Build: 9s
Memory(RSS): 417M
Startup time: 2.6s
Build: 194s +2050%
Memory(RSS): 101M -75%
Startup time: 0.158s -94%
Ongoing work on footprint
Key metrics: build time, size of resultant image, and runtime memory footprint
51
Sample SpringOne 2019 SpringOne 2020
commandlinerunner Build: 90s
Exec. size: 48M
Memory(RSS): 29M
Build: 50s -45%
Exec. size: 22M -55%
Memory(RSS): 24M -17%
webflux-netty Build: 193s
Exec. size: 81M
Memory(RSS): 95M
Build: 79s -60%
Exec. size: 43M -47%
Memory(RSS): 47M -50%
webmvc-tomcat Build: 203s
Exec size: 105M
Memory(RSS): 70M
Build: 67s -67%
Exec. size: 42M -60%
Memory(RSS): 51M -27%
You can specify additional native configuration
52
For additional native configuration (eg. resources)
● Create a META-INF/native-image/resource-config.json file
● Wildcard patterns can be used
● Similar config for reflection and proxies
● See GraalVM documentation for more details
{
"resources": [
{ "pattern": "myresource.*" }
],
"bundles": [
{ "name": "your.pkg.Bundle" }
]
}
53
Tracing agent collected configuration
● An agent can assist in generating these files, available with GraalVM
java -Dorg.graalvm.nativeimage.imagecode=agent
-agentlib:native-image-agent=config-output-dir=META-INF/native-image Demo
● Agent has improved greatly during 2020, thanks to the GraalVM team
● Run application with agent attached to produce .json files
○ Exercise all code paths (manually or via tests) - producing (merging) many of
these collected configurations
● Access filter file supported to avoid including unnecessary infrastructure
5
4
Our CI checks Java 8/11 x GraalVM 20.2/20.3
55
spring-graalvm-native
Project structure and extensibility
● Core static analysis engine for Spring Applications
○ static: behaviour driven by separate ‘hints’
○ dynamic: extensible with Spring portfolio project awareness via plugins
● @NativeImageHint
○ Same information as JSON, but more modular, more type safe
○ hints attached to a trigger - an auto configuration active or a classpath
presence check
○ application analysis determines if triggers are active => activates those
hints
57
Hint with auto-configuration trigger
@NativeImageHint(trigger = R2dbcAutoConfiguration.class,
proxyInfos = {
@ProxyInfo(types={Serializable.class, InterfaceFoo.class})
},
typeInfos= {
@TypeInfo(types = EmbeddedDatabase.class,
access = AccessBits.LOAD_AND_CONSTRUCT)
}
)
public class R2dbcHints implements NativeImageConfiguration {
}
58
Opportunity for the community to contribute
59
The road ahead
spring-graalvm-native 0.9.0 (December 2020)
● First release with beta support
○ Spring Boot 2.4.0 and GraalVM 20.3 baseline
○ Subset of starters supported
○ Breaking change will happen (with upgrade paths)
● Wider support
○ Spring Security
○ Spring Batch
● Development-oriented container image
61
More starters supported in upcoming 0.9.x releases
62
Hidden gem in Spring Framework since 5.0:
functional bean registration
63
Comparing annotation and functional bean definition
@Configuration
public class SampleConfiguration {
@Bean
public Foo foo() {
return new Foo();
}
@Bean
public Bar bar(Foo foo) {
return new Bar(foo);
}
}
64
public class SampleInitializer implements
ApplicationContextInitializer<GenericApplicationContext> {
@Override
public void initialize(GenericApplicationContext ctx) {
ctx.registerBean(Foo.class, () -> new Foo());
ctx.registerBean(Bar.class,
() -> new Bar(ctx.getBean(Foo.class)));
}
}
@Configuration to functional configuration
65
Automated
transformation
from @Configuration
to functional
configuration
66
spring-init
Native applications functional configuration
67
Sample webmvc-tomcat webmvc-functional
With build time transformation to
functional configuration
Regular Spring Boot
application with Spring MVC,
Tomcat and Jackson
Build: 67s
Exec. size: 42M
Memory(RSS): 51M
Startup time: 0.06s
Build: 60s -10%
Exec. size: 37M -12%
Memory(RSS): 26M -49%
Startup time: 0.02s -66%
Experimentations on more build time transformations
● @Configuration to functional configuration transformation with
spring-init
● Infer proxyBeanMethods = false when possible
● Automatically set optimization flags when relevant
68
Spring Boot 3, based on Spring Framework 6, is
expected to provide first-class support for native
application deployment, as well as an optimized
footprint on the JVM.
69
Takeaways
● Spring Boot native applications are great to build lightweight containers
● Try it now with spring-graalvm-native 0.8
● Contribute support for your favorite starter
● Beta support in December with spring-graalvm-native 0.9
● Wider support and smaller footprint during 0.9.x releases
● Upcoming first-class native support in Spring Boot 3 / Framework 6
70
https://github.com/spring-projects-experimental/spring-graalvm-native
https://spring.io/blog
@sdeleuze on for fresh news
#springone@SpringOne
Stay Connected.

More Related Content

PDF
Spring Native and Spring AOT
PDF
Spring Boot
PDF
Gitlab, GitOps & ArgoCD
PDF
Kuberneteの運用を支えるGitOps
PDF
A GitOps Kubernetes Native CICD Solution with Argo Events, Workflows, and CD
PDF
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
PDF
FridaによるAndroidアプリの動的解析とフッキングの基礎
Spring Native and Spring AOT
Spring Boot
Gitlab, GitOps & ArgoCD
Kuberneteの運用を支えるGitOps
A GitOps Kubernetes Native CICD Solution with Argo Events, Workflows, and CD
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
FridaによるAndroidアプリの動的解析とフッキングの基礎

What's hot (20)

PDF
BuildKitの概要と最近の機能
PDF
Azure ADと外部アプリのID連携/SSO - Deep Dive
PDF
【Unite Tokyo 2019】大量のアセットも怖くない!~HTTP/2による高速な通信の実装例~
PDF
Kubernetes Architecture and Introduction
PPTX
[Konveyor] migrate and modernize your application portfolio to kubernetes wit...
PDF
Gitops: the kubernetes way
PDF
クラウドTCOの真実
PPTX
Discover Quarkus and GraalVM
PDF
CSI Driverを開発し自社プライベートクラウドにより適した安全なKubernetes Secrets管理を実現した話
PDF
REST API のコツ
PDF
DI(依存性注入)について
PDF
Event driven autoscaling with KEDA
PPTX
GitOps w/argocd
PDF
OpenShift Container Platform 4.12 Release Notes
PDF
차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서
PDF
Event-driven autoscaling through KEDA and Knative Integration | DevNation Tec...
PDF
Ingress on Azure Kubernetes Service
PDF
Apache Bigtop3.2 (仮)(Open Source Conference 2022 Online/Hiroshima 発表資料)
PDF
WebAssemblyのWeb以外のことぜんぶ話す
BuildKitの概要と最近の機能
Azure ADと外部アプリのID連携/SSO - Deep Dive
【Unite Tokyo 2019】大量のアセットも怖くない!~HTTP/2による高速な通信の実装例~
Kubernetes Architecture and Introduction
[Konveyor] migrate and modernize your application portfolio to kubernetes wit...
Gitops: the kubernetes way
クラウドTCOの真実
Discover Quarkus and GraalVM
CSI Driverを開発し自社プライベートクラウドにより適した安全なKubernetes Secrets管理を実現した話
REST API のコツ
DI(依存性注入)について
Event driven autoscaling with KEDA
GitOps w/argocd
OpenShift Container Platform 4.12 Release Notes
차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서
Event-driven autoscaling through KEDA and Knative Integration | DevNation Tec...
Ingress on Azure Kubernetes Service
Apache Bigtop3.2 (仮)(Open Source Conference 2022 Online/Hiroshima 発表資料)
WebAssemblyのWeb以外のことぜんぶ話す
Ad

Similar to The Path Towards Spring Boot Native Applications (20)

PDF
Spring Boot Native written by software developers
PDF
Going Serverless Using the Spring Framework Ecosystem
PPTX
Lean microservices through ahead of time compilation (Tobias Piper, Loveholid...
PDF
Spring: Your Next Java Micro-Framework
PDF
Pivotal Platform - December Release A First Look
PPTX
Meet Magento Spain 2019 - Our Experience with Magento Cloud
PPTX
Java and windows azure cloud service
PPTX
[20200720]cloud native develoment - Nelson Lin
PDF
AOT and Native with Spring Boot 3.0
PDF
Effective Spring on Kubernetes
PPTX
[JOI] TOTVS Developers Joinville - Java #1
PPTX
Django app deployment in Azure By Saurabh Agarwal
PDF
D. Andreadis, Red Hat: Concepts and technical overview of Quarkus
PPTX
GCP - Continuous Integration and Delivery into Kubernetes with GitHub, Travis...
PDF
Spring Boot 3 And Beyond
PDF
GeoServer Developers Workshop
PPTX
Micronaut: A new way to build microservices
PDF
Microservices - java ee vs spring boot and spring cloud
PDF
Node.js Tools Ecosystem
PDF
Reactive Amsterdam - Maxim Burgerhout - Quarkus Intro
Spring Boot Native written by software developers
Going Serverless Using the Spring Framework Ecosystem
Lean microservices through ahead of time compilation (Tobias Piper, Loveholid...
Spring: Your Next Java Micro-Framework
Pivotal Platform - December Release A First Look
Meet Magento Spain 2019 - Our Experience with Magento Cloud
Java and windows azure cloud service
[20200720]cloud native develoment - Nelson Lin
AOT and Native with Spring Boot 3.0
Effective Spring on Kubernetes
[JOI] TOTVS Developers Joinville - Java #1
Django app deployment in Azure By Saurabh Agarwal
D. Andreadis, Red Hat: Concepts and technical overview of Quarkus
GCP - Continuous Integration and Delivery into Kubernetes with GitHub, Travis...
Spring Boot 3 And Beyond
GeoServer Developers Workshop
Micronaut: A new way to build microservices
Microservices - java ee vs spring boot and spring cloud
Node.js Tools Ecosystem
Reactive Amsterdam - Maxim Burgerhout - Quarkus Intro
Ad

More from VMware Tanzu (20)

PDF
Spring into AI presented by Dan Vega 5/14
PDF
What AI Means For Your Product Strategy And What To Do About It
PDF
Make the Right Thing the Obvious Thing at Cardinal Health 2023
PPTX
Enhancing DevEx and Simplifying Operations at Scale
PDF
Spring Update | July 2023
PPTX
Platforms, Platform Engineering, & Platform as a Product
PPTX
Building Cloud Ready Apps
PDF
Spring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdf
PDF
Simplify and Scale Enterprise Apps in the Cloud | Boston 2023
PDF
Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023
PPTX
tanzu_developer_connect.pptx
PDF
Tanzu Virtual Developer Connect Workshop - French
PDF
Tanzu Developer Connect Workshop - English
PDF
Virtual Developer Connect Workshop - English
PDF
Tanzu Developer Connect - French
PDF
Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023
PDF
SpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring Boot
PDF
SpringOne Tour: The Influential Software Engineer
PDF
SpringOne Tour: Domain-Driven Design: Theory vs Practice
PDF
SpringOne Tour: Spring Recipes: A Collection of Common-Sense Solutions
Spring into AI presented by Dan Vega 5/14
What AI Means For Your Product Strategy And What To Do About It
Make the Right Thing the Obvious Thing at Cardinal Health 2023
Enhancing DevEx and Simplifying Operations at Scale
Spring Update | July 2023
Platforms, Platform Engineering, & Platform as a Product
Building Cloud Ready Apps
Spring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdf
Simplify and Scale Enterprise Apps in the Cloud | Boston 2023
Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023
tanzu_developer_connect.pptx
Tanzu Virtual Developer Connect Workshop - French
Tanzu Developer Connect Workshop - English
Virtual Developer Connect Workshop - English
Tanzu Developer Connect - French
Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023
SpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring Boot
SpringOne Tour: The Influential Software Engineer
SpringOne Tour: Domain-Driven Design: Theory vs Practice
SpringOne Tour: Spring Recipes: A Collection of Common-Sense Solutions

Recently uploaded (20)

PDF
EN-Survey-Report-SAP-LeanIX-EA-Insights-2025.pdf
PDF
Upgrade and Innovation Strategies for SAP ERP Customers
PDF
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
PPTX
Operating system designcfffgfgggggggvggggggggg
PDF
top salesforce developer skills in 2025.pdf
PPTX
Introduction to Artificial Intelligence
PDF
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
PPTX
Odoo POS Development Services by CandidRoot Solutions
PPTX
ai tools demonstartion for schools and inter college
PDF
How Creative Agencies Leverage Project Management Software.pdf
PDF
Adobe Illustrator 28.6 Crack My Vision of Vector Design
PDF
System and Network Administraation Chapter 3
PDF
wealthsignaloriginal-com-DS-text-... (1).pdf
PPTX
CHAPTER 2 - PM Management and IT Context
PDF
Design an Analysis of Algorithms II-SECS-1021-03
PDF
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
PDF
How to Migrate SBCGlobal Email to Yahoo Easily
PDF
Which alternative to Crystal Reports is best for small or large businesses.pdf
PDF
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
PPTX
Essential Infomation Tech presentation.pptx
EN-Survey-Report-SAP-LeanIX-EA-Insights-2025.pdf
Upgrade and Innovation Strategies for SAP ERP Customers
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
Operating system designcfffgfgggggggvggggggggg
top salesforce developer skills in 2025.pdf
Introduction to Artificial Intelligence
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
Odoo POS Development Services by CandidRoot Solutions
ai tools demonstartion for schools and inter college
How Creative Agencies Leverage Project Management Software.pdf
Adobe Illustrator 28.6 Crack My Vision of Vector Design
System and Network Administraation Chapter 3
wealthsignaloriginal-com-DS-text-... (1).pdf
CHAPTER 2 - PM Management and IT Context
Design an Analysis of Algorithms II-SECS-1021-03
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
How to Migrate SBCGlobal Email to Yahoo Easily
Which alternative to Crystal Reports is best for small or large businesses.pdf
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
Essential Infomation Tech presentation.pptx

The Path Towards Spring Boot Native Applications

  • 1. The Path Towards Spring Boot Native Applications September 2–3, 2020 springone.io Join https://springone.slack.com #session-the-path-towards-spring-boot-native-applications 1 Andy Clement Sébastien Deleuze
  • 2. Safe Harbor Statement The following is intended to outline the general direction of VMware's offerings. It is intended for information purposes only and may not be incorporated into any contract. Any information regarding pre-release of VMware offerings, future updates or other planned modifications is subject to ongoing evaluation by VMware and is subject to change. This information is provided without warranty or any kind, express or implied, and is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions regarding VMware's offerings. These purchasing decisions should only be based on features currently available. The development, release, and timing of any features or functionality described for VMware's offerings in this presentation remain at the sole discretion of Pivotal. Pivotal has no obligation to update forward looking information in this presentation. 2
  • 3. Agenda ● Native applications ● Spring Boot native applications ● Where are we? ● Getting started ● Demo ● spring-graalvm-native ● The road ahead 3
  • 5. 5 Native ahead-of-time compilation Java or Kotlin application GraalVM native compiler Native executable Lightweight container image EXE0110 5
  • 6. Two main benefits 6 Instant startup Reduced memory consumption
  • 7. 7 Scale to zero You only pay when your application is used Serverless for any kind of workload including regular web applications Good fit with platforms like Knative 3x to 5x memory reduction (RSS) Cheaper cloud instances Critical with systems splitted into multiple microservices Instant Startup Reduced memory consumption Our goal is cheaper hosting of your Spring Boot applicationsCheaper and more sustainable Spring Boot applications 7
  • 8. JVM and native executables trade-offs 8
  • 9. Key differences between JVM and native 9 ● Static analysis of your application from the main entry point ● Configuration required for: ○ Reflection ○ Proxies ○ Resources ● Classpath fixed at build time ● No class lazy loading ● Some code will run at build time
  • 10. GraalVM native is a source of inspiration for the JVM ecosystem 10
  • 11. An upcoming Java platform standard with Project Leyden 11
  • 12. GraalVM 20.2 ● Better static container image support ● Faster native image generation ● java.* and javax.* classes are now mostly initialized at runtime ● Enterprise edition only ○ Low Latency Garbage Collector (G1 like) ○ Loop unrolling optimization 12
  • 13. Still in “early adopter” mode (supported with breaking changes) but matures quickly 13
  • 14. Spring Boot native applications
  • 15. Good fit with Spring Boot stand-alone deployment model 15
  • 16. Compiling your application to a native executable requires reflection/proxy/resources configuration 16
  • 17. The Spring team is doing most of the hard work 17
  • 18. Our goal is to support compilation of existing or new Spring Boot applications to native executables. Unchanged. 18
  • 19. “We are excited about the great partnership between the Spring and GraalVM engineering teams to support native ahead-of-time compilation for millions of Spring Boot applications. This is a game changer enabling low memory footprint and instant startup for these workloads.” Thomas Wuerthinger, GraalVM founder & project lead 19 Collaboration between Spring and GraalVM teams
  • 20. Leverage Spring Boot container image support 2 0 > mvn spring-boot:build-image or > gradle bootBuildImage
  • 22. To create lightweight container images 2 2
  • 24. Timeline GraalVM fixes and improvements Incubating support in spring-graalvm-native Spring Boot support We are here 24
  • 26. Timeline GraalVM fixes and improvements Incubating support in spring-graalvm-native Spring Boot support We are here 26
  • 28. spring-graalvm-native ● Incubating Spring Boot native application support ○ It includes a plugin for the GraalVM native image builder ● Analyses the Spring Boot application at build time ○ Computes the most optimal native image configuration ○ Challenge is doing that with static analysis ● Also perform some build time transformation for: ○ Optimized footprint ○ Compatibility 28
  • 29. We have just released 0.8.0 ● GraalVM 20.2 baseline ● Use Spring Boot 2.4.0 latest milestone ● Significant footprint improvements ● Wider range of supported technology ● New experimental functional mode ● Spring Boot lightweight container integration ○ Maven ○ Gradle 29
  • 30. Patch updates until Spring Boot 2.4.0 ● 0.8.1 (September 2020) ○ Upgrade to Spring Boot 2.4.0-M3 ● 0.8.2 (October 2020) ○ Upgrade to Spring Boot 2.4.0-RC1 ● 0.8.3 (November 2020) ○ Upgrade to Spring Boot 2.4.0 ○ GraalVM 20.3 baseline 30
  • 31. Starters supported in 0.8.x ● Actuator ● Cache ● Data JPA, MongoDB, R2DBC, Redis ● JDBC ● Logging (Logback) ● Thymeleaf ● Validation ● Web (Spring MVC with Tomcat) ● Webflux (Netty) ● Wavefront ● Spring Cloud Function 31
  • 32. Timeline GraalVM fixes and improvements Incubating support in spring-graalvm-native Spring Boot support We are here 32
  • 33. Comparing Spring Boot 2.3 LoggingSystem ... 33 Map<String, String> systems = new LinkedHashMap<>(); systems.put("ch.qos.logback.core.Appender", "org.springframework.boot.logging.logback.LogbackLoggingSystem"); systems.put("org.apache.logging.log4j.core.impl.Log4jContextFactory", "org.springframework.boot.logging.log4j2.Log4J2LoggingSystem"); systems.put("java.util.logging.LogManager", "org.springframework.boot.logging.java.JavaLoggingSystem"); SYSTEMS = Collections.unmodifiableMap(systems);
  • 34. … with Spring Boot 2.4 one 34 ClassLoader classLoader = LoggingSystem.class.getClassLoader(); if (ClassUtils.isPresent("ch.qos.logback.core.Appender", classLoader)) { return LogbackLoggingSystem::new; } if (ClassUtils.isPresent("org.apache.logging.log4j.core.impl.Log4jContextFactory", classLoader)) { return Log4J2LoggingSystem::new; } if (ClassUtils.isPresent("java.util.logging.LogManager", classLoader)) { return JavaLoggingSystem::new; } throw new IllegalStateException("No suitable logging system located");
  • 35. New flags available in Spring Framework 5.3 # -3.6M RSS -Dspring.xml.ignore=true # -0.5M RSS -Dspring.spel.ignore=true 35
  • 36. A new Tomcat artifact optimized for native apps <!-- -3.5M RSS --> <dependency> <groupId>org.apache.tomcat.experimental</groupId> <artifactId>tomcat-embed-programmatic</artifactId> <version>9.0.38</version> </dependency> 36
  • 38. start.spring.io or an existing project 38
  • 39. Make sure to use Spring Boot 2.4 latest milestone 39 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.0-M2</version> <relativePath/> <!-- lookup parent from repository --> </parent>
  • 40. Update configuration to avoid using proxies 40 @SpringBootApplication(proxyBeanMethods = false) public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
  • 42. Add the spring-graalvm-native dependency 42 <dependency> <groupId>org.springframework.experimental</groupId> <artifactId>spring-graalvm-native</artifactId> <version>0.8.0</version> </dependency>
  • 43. Build the native application 43 > mvn spring-boot:build-image Successfully built image 'docker.io/library/demo:0.0.1-SNAPSHOT' Total time: 60 s ● No need for a GraalVM native local install ● Build happens in a container ● And produces a container
  • 44. Run the native application 44 > docker run -p 8080:8080 docker.io/library/demo:0.0.1-SNAPSHOT . ____ _ __ _ _ / / ___'_ __ _ _(_)_ __ __ _ ( ( )___ | '_ | '_| | '_ / _` | / ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |___, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: Started application in 0.05 seconds (JVM running for 0.009)
  • 45. You can also build a native executable without using containers 45
  • 46. Configure Maven plugin in a native profile 46 <plugin> <groupId>org.graalvm.nativeimage</groupId> <artifactId>native-image-maven-plugin</artifactId> <version>20.2.0</version> <configuration> <mainClass>com.example.demo.DemoApplication</mainClass> </configuration> <executions> <execution> <goals> <goal>native-image</goal> </goals> <phase>package</phase> </execution> </executions> </plugin>
  • 47. Build the native application 47 > mvn -Pnative clean package Total time: 60 s ● Need for a GraalVM native local install ● Build happens directly on your host (Linux, Mac and Windows are supported) ● Produces a native executable ● No cross compilation
  • 48. Run the native application 48 > target/com.example.demo.demoapplication . ____ _ __ _ _ / / ___'_ __ _ _(_)_ __ __ _ ( ( )___ | '_ | '_| | '_ / _` | / ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |___, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: Started application in 0.05 seconds (JVM running for 0.009)
  • 50. How fast is your PetClinic? 50 Sample On the JDK native-executable petclinic-jdbc Build: 9s Memory(RSS): 417M Startup time: 2.6s Build: 194s +2050% Memory(RSS): 101M -75% Startup time: 0.158s -94%
  • 51. Ongoing work on footprint Key metrics: build time, size of resultant image, and runtime memory footprint 51 Sample SpringOne 2019 SpringOne 2020 commandlinerunner Build: 90s Exec. size: 48M Memory(RSS): 29M Build: 50s -45% Exec. size: 22M -55% Memory(RSS): 24M -17% webflux-netty Build: 193s Exec. size: 81M Memory(RSS): 95M Build: 79s -60% Exec. size: 43M -47% Memory(RSS): 47M -50% webmvc-tomcat Build: 203s Exec size: 105M Memory(RSS): 70M Build: 67s -67% Exec. size: 42M -60% Memory(RSS): 51M -27%
  • 52. You can specify additional native configuration 52
  • 53. For additional native configuration (eg. resources) ● Create a META-INF/native-image/resource-config.json file ● Wildcard patterns can be used ● Similar config for reflection and proxies ● See GraalVM documentation for more details { "resources": [ { "pattern": "myresource.*" } ], "bundles": [ { "name": "your.pkg.Bundle" } ] } 53
  • 54. Tracing agent collected configuration ● An agent can assist in generating these files, available with GraalVM java -Dorg.graalvm.nativeimage.imagecode=agent -agentlib:native-image-agent=config-output-dir=META-INF/native-image Demo ● Agent has improved greatly during 2020, thanks to the GraalVM team ● Run application with agent attached to produce .json files ○ Exercise all code paths (manually or via tests) - producing (merging) many of these collected configurations ● Access filter file supported to avoid including unnecessary infrastructure 5 4
  • 55. Our CI checks Java 8/11 x GraalVM 20.2/20.3 55
  • 57. Project structure and extensibility ● Core static analysis engine for Spring Applications ○ static: behaviour driven by separate ‘hints’ ○ dynamic: extensible with Spring portfolio project awareness via plugins ● @NativeImageHint ○ Same information as JSON, but more modular, more type safe ○ hints attached to a trigger - an auto configuration active or a classpath presence check ○ application analysis determines if triggers are active => activates those hints 57
  • 58. Hint with auto-configuration trigger @NativeImageHint(trigger = R2dbcAutoConfiguration.class, proxyInfos = { @ProxyInfo(types={Serializable.class, InterfaceFoo.class}) }, typeInfos= { @TypeInfo(types = EmbeddedDatabase.class, access = AccessBits.LOAD_AND_CONSTRUCT) } ) public class R2dbcHints implements NativeImageConfiguration { } 58
  • 59. Opportunity for the community to contribute 59
  • 61. spring-graalvm-native 0.9.0 (December 2020) ● First release with beta support ○ Spring Boot 2.4.0 and GraalVM 20.3 baseline ○ Subset of starters supported ○ Breaking change will happen (with upgrade paths) ● Wider support ○ Spring Security ○ Spring Batch ● Development-oriented container image 61
  • 62. More starters supported in upcoming 0.9.x releases 62
  • 63. Hidden gem in Spring Framework since 5.0: functional bean registration 63
  • 64. Comparing annotation and functional bean definition @Configuration public class SampleConfiguration { @Bean public Foo foo() { return new Foo(); } @Bean public Bar bar(Foo foo) { return new Bar(foo); } } 64 public class SampleInitializer implements ApplicationContextInitializer<GenericApplicationContext> { @Override public void initialize(GenericApplicationContext ctx) { ctx.registerBean(Foo.class, () -> new Foo()); ctx.registerBean(Bar.class, () -> new Bar(ctx.getBean(Foo.class))); } }
  • 65. @Configuration to functional configuration 65 Automated transformation from @Configuration to functional configuration
  • 67. Native applications functional configuration 67 Sample webmvc-tomcat webmvc-functional With build time transformation to functional configuration Regular Spring Boot application with Spring MVC, Tomcat and Jackson Build: 67s Exec. size: 42M Memory(RSS): 51M Startup time: 0.06s Build: 60s -10% Exec. size: 37M -12% Memory(RSS): 26M -49% Startup time: 0.02s -66%
  • 68. Experimentations on more build time transformations ● @Configuration to functional configuration transformation with spring-init ● Infer proxyBeanMethods = false when possible ● Automatically set optimization flags when relevant 68
  • 69. Spring Boot 3, based on Spring Framework 6, is expected to provide first-class support for native application deployment, as well as an optimized footprint on the JVM. 69
  • 70. Takeaways ● Spring Boot native applications are great to build lightweight containers ● Try it now with spring-graalvm-native 0.8 ● Contribute support for your favorite starter ● Beta support in December with spring-graalvm-native 0.9 ● Wider support and smaller footprint during 0.9.x releases ● Upcoming first-class native support in Spring Boot 3 / Framework 6 70