Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
SpringBoot 3.0 のNative Imageを試してみた
Search
Kazuhiro Seo
January 29, 2023
Programming
480
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
SpringBoot 3.0 のNative Imageを試してみた
Kazuhiro Seo
January 29, 2023
Transcript
35 slides
SpringBoot 3.0 の Native Image を試してみた
自己紹介 妹尾 一弘 サーバーサイドエンジニア 最近Web 開発から遠のいている LT 駆動学習 Java Do
スタッフ
Spring Boot 3.0 リリース 🎉
Native Image のサポートがGA
Native Image 単独で実行可能となるようにビルドされたイメージ 起動時間が高速 メモリ使用量が削減できる コンテナイメージを縮小できる 完全に互換ではない
やってみた
サンプルコード 簡単なCRUD を行うREST API DynamoDB にアクセス
Bean @Data public class Item { private String id; private
String name; private String code; }
Controller @RestController @RequestMapping("/items") public class ItemController { @Autowired private ItemService
service; @GetMapping("/") public Iterable<Item> index() { return service.list(); }
Service @Service public class ItemService { @Autowired private ItemRepository repository;
public void create(Item item) { repository.save(item); }
Repository public interface ItemRepository { Item save(Item item); Iterable<Item> findAll();
Optional<Item> findById(String id); void deleteById(String id); }
ビルド
Gradle plugins plugins { id 'java' id 'org.springframework.boot' version '3.0.1'
id 'io.spring.dependency-management' version '1.1.0' id 'org.graalvm.buildtools.native' version '0.9.18' }
bootBuildImage タスク Spring Boot Plugin のタスク Cloud Native Buildpacks を利用してビルド
ソースコードからビルド構成を検知 Native BuildTools プラグインがある時Native Build
bootBuildImage ./gradlew bootBuildImage --imageName spring-boot-3:latest docker push ...
潤沢なメモリが必要 自分のローカルマシンだとOOME 今回はAWS CodeBuild を利用してビルド 15 GB メモリ、8 vCPU のインスタンス
問題なく動いたか?
問題 - CASE 1 - DB アクセスにサードパーティライブラリを利用 spring-data-dynamodb dependencies {
implementation 'com.github.derjust:spring-data-dynamodb:5.1.0' }
Bean 生成エラー( 実行時エラー)
原因 - CASE 1 - AWS SDK for Java は
v2 以降からNativeImage に対応 該当ライブラリはv1 にしか対応していなかった
対策 - CASE 1 - 公式のdynamodb-enhanced を利用 dependencies { implementation
'software.amazon.awssdk:dynamodb' implementation 'software.amazon.awssdk:dynamodb-enhanced' }
対策 - CASE 1 - Bean とDynamoDB Table のマッピングを生成 @Bean
DynamoDbTable<Item> itemTable(DynamoDbEnhancedClient client) { return client.table("Items", TableSchema.fromBean(Item.class)); }
対策 - CASE 1 - Repository を独自実装 @Component public class
ItemRepositoryImpl implements ItemRepository { @Autowired private DynamoDbTable<Item> table; @Override public Item save(Item item) { table.putItem(item); return item; }
問題 - CASE 2 - Bean 生成エラー( 実行時エラー)
原因 - CASE 2 - dynamodb-enhanced も一部非対応
対策 - CASE 2 - StaticTableSchema を利用 private TableSchema<Item> getStaticTableSchema()
{ return StaticTableSchema.builder(Item.class) .newItemSupplier(Item::new) .addAttribute(String.class, a -> a.name("id").setter(Item::se .addAttribute(String.class, a -> a.name("name").setter(Item:: .addAttribute(String.class, a -> a.name("code").setter(Item:: .build(); }
成功!
性能比較
イメージサイズ plane: 17-jdk-alpine 上にbootJar を配備 220MB ⇒ 43MB に改善
メモリ使用量
起動速度 - bootJar - 起動時間: 14.354s
起動速度 - native - 起動時間: 0.596s
まとめ SpringBoot の起動時間は高速になる メモリ使用量は今回は参考程度 あまり負荷もかけていない イメージサイズの節約も嬉しい
課題 ライブラリがNative 対応してるか調査コストが高い 実行時エラーになるので確認に時間がかかる いい調査方法をご存知の方は教えて下さい
ありがとうございました
More Decks by Kazuhiro Seo
See All by Kazuhiro Seo
PostgreSQL 18で考えるUUID主キー
kazuhiro1982
0
590
GitHub ActionsとAWSをOIDC認証で連携する
kazuhiro1982
1
260
Gradleとちょっと仲良くなろう
kazuhiro1982
0
140
JavaとWebAssembly
kazuhiro1982
0
180
セッションデータの管理にSpring Sessionを利用する
kazuhiro1982
0
3.8k
AWSのLake Formation Governed Tablesを触ってみた
kazuhiro1982
0
470
VS CodeとRemote Containerで開発環境もコード管理しよう
kazuhiro1982
1
790
SpringBootをコンテナで動かしてみる
kazuhiro1982
0
450
Serverless FrameworkでWebサイトの更新を検知して通知する
kazuhiro1982
0
550
Other Decks in Programming
See All in Programming
Growing PicoRuby's Ecosystem on ESP32
yuuu
2
100
Vapor Mode でアクセシビリティは 壊れないか検証した話
fuqda
1
340
React Native에 현대적인 빌드 도구 더하기: Rollipop 구현기
leegeunhyeok
0
180
SODA - FACT BOOK(EN)
sodainc
1
230
SODA - FACT BOOK(JP)
sodainc
1
40k
ActionController meets Protocol Buffers
sorah
1
800
우리의 Nitro Modules는 당신의 Turbo Modules보다 아름답다
l2hyunwoo
0
260
3回つくってわかった、 定期実行ジョブ基盤の本質情報
takai
4
3.8k
Spec-Driven Development - Why Vaadin Is the Perfect Fit
simas
PRO
0
240
AI時代のシニアエンジニアとは
yosuke_furukawa
PRO
15
11k
선언형 햅틱 라이브러리 진동을 소개합니다
l2hyunwoo
1
310
エージェントを使い続けるためのメタワーク / Meta-work for keeping using the agent
rkaga
6
2.3k
Featured
See All Featured
The Mindset for Success: Future Career Progression
greggifford
PRO
0
560
YesSQL, Process and Tooling at Scale
rocio
174
15k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.3k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
330
Unsuck your backbone
ammeep
672
58k
エンジニアに許された特別な時間の終わり
watany
109
250k
Typedesign – Prime Four
hannesfritz
42
3.2k
Building Flexible Design Systems
yeseniaperezcruz
330
41k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
330
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
300
Art, The Web, and Tiny UX
lynnandtonic
304
22k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k