The document discusses the development of Spring Boot native applications using GraalVM, focusing on their benefits such as instant startup and reduced memory consumption. It outlines the compilation process and configuration requirements for creating native executables and provides an overview of the timeline and updates for Spring-GraalVM-Native integration. Key goals include improving resource efficiency and enabling serverless capabilities for Spring Boot applications.
The Path TowardsSpring
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
Thefollowing 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
7
Scale to zero
Youonly 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
Key differences betweenJVM 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
Our goal isto support compilation of existing or
new Spring Boot applications to native
executables. Unchanged.
18
19.
“We are excitedabout 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 Bootcontainer image support
2
0
> mvn spring-boot:build-image
or
> gradle bootBuildImage
spring-graalvm-native
● Incubating SpringBoot 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 justreleased 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 untilSpring 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 in0.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
Add the spring-graalvm-nativedependency
42
<dependency>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-graalvm-native</artifactId>
<version>0.8.0</version>
</dependency>
43.
Build the nativeapplication
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
Build the nativeapplication
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
For additional nativeconfiguration (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 collectedconfiguration
● 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
Project structure andextensibility
● 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-configurationtrigger
@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
spring-graalvm-native 0.9.0 (December2020)
● 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
Hidden gem inSpring Framework since 5.0:
functional bean registration
63
64.
Comparing annotation andfunctional 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 functionalconfiguration
65
Automated
transformation
from @Configuration
to functional
configuration
Native applications functionalconfiguration
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 morebuild 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 Bootnative 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