Slide 1

Slide 1 text

Java 23 overview / Current status of Java web frameworks 2024-11-27 JJUG CCC 2024 Fall 報告会 LINEヤフー きしだ なおき #javaq

Slide 2

Slide 2 text

2 Java 23の概要 ● 2024-9-17 Released ● 非LTS(next LTS will be Java 25) ● 12 JEPs(3 new JEPs)

Slide 3

Slide 3 text

3 今回のJJUG CCC 2024 Fall ● 10/27(日) ベルサール新宿グランド ● 53セッション、588人参加だったらしい

Slide 4

Slide 4 text

JEP ● 455: Primitive Types in Patterns, instanceof, and switch (Preview) ● 466: Class-File API (Second Preview) ● 467: Markdown Documentation Comments ● 469: Vector API (Eighth Incubator) ● 473: Stream Gatherers (Second Preview) ● 471: Deprecate the Memory-Access Methods in sun.misc.Unsafe for Removal ● 474: ZGC: Generational Mode by Default ● 476: Module Import Declarations (Preview) ● 477: Implicitly Declared Classes and Instance Main Methods (Third Preview) ● 480: Structured Concurrency (Third Preview) ● 481: Scoped Values (Third Preview) ● 482: Flexible Constructor Bodies (Second Preview)

Slide 5

Slide 5 text

Module Import(preview) ● import module java.base will cover almost all import module java.base; public class Main { public static void main(Stiring[] args) { var data = List.of(“apple”, “grape”); data.forEach(IO::println); } }

Slide 6

Slide 6 text

java.util.IO(preview) ● since println is defined in IO class, System.out is not required import module java.base; public class Main { public static void main(Stiring[] args) { var data = List.of(“apple”, “grape”); for (var str : data) { println(str); } } }

Slide 7

Slide 7 text

Simple sample code ● when omit the class definition, java.base and java.util.IO will be imported automatically

Slide 8

Slide 8 text

primitive types in pattern(preview) ● primitive types are available in patten matching such as instanceof or switch ● range check ● like if expression

Slide 9

Slide 9 text

Markdown documentation comment ● Javadoc comment can be written with Markdown ● starting ///

Slide 10

Slide 10 text

Generational ZGC ● Generational ZGC standardized in Java 22 is deault ● non-generational algorithm will be removed

Slide 11

Slide 11 text

Webフレームワークの現状 2024-11-27 JJUG CCC 2024 Fall 報告会 LINEヤフー きしだ なおき #javaq

Slide 12

Slide 12 text

Webの処理 ● 簡単なWebサーバー ● フレームワークはこのよ うなWebサーバーからア プリケーション固有部分 を分離拡張できるように する仕組み void main() throws Exception{ var server = new ServerSocket(8080); for (;;) { var soc = server.accept(); Thread.ofVirtual().start(() -> { try (soc; var isr = new InputStreamReader(soc.getInputStream()); var bur = new BufferedReader(isr); var w = new PrintWriter(soc.getOutputStream())) { // ヘッダーの解析 var line = bur.readLine(); if (line == null) return; // exit thread println("Connect from %s for %s".formatted(soc.getInetAddress(), line)); while (!bur.readLine().isEmpty()) {} // urlによって処理の振り分け var url = line.split(" ")[1]; var message = switch(url) { case "/hello" -> "Hello!!!"; case "/date" -> LocalDate.now(); default -> "It works!"; }; // ヘッダー出力 w.println(""" HTTP/1.1 200 OK content-type: text/html """); w.println(); // コンテンツ出力 w.println(""" Hello

Hello

%s """.formatted(message)); } catch (IOException ex) { throw new UncheckedIOException(ex); } }); } }

Slide 13

Slide 13 text

Web開発に必要な処理 ● HTTP処理 ● ルーティング ● リクエスト ● レスポンス ● Webアプリケーション処理 ● セッション ● 認証/認可 ● リソース ● サーバー管理 ● 実行 ● 設定 ● モニタリング ● 開発管理 ● ビルド ● デプロイ ● テスト

Slide 14

Slide 14 text

Webフレームワークの変化 ● サーブレットコンテナ ● 埋め込みサーバー ● Docker ● サーバレス

Slide 15

Slide 15 text

サーブレットコンテナ ● サーブレットコンテナと呼ばれるWebサーバーにアプリケーショ ンを配備する ● コンピュータが高価だったため、ひとつのWebサーバーで複数の アプリケーションを動かす ● フレームワークはサーブレットのラッパ ● 開発や運用が面倒

Slide 16

Slide 16 text

埋め込みサーバー ● クラウドの隆盛 ● 供給側:スレッド性能の頭打ちによる多サーバー化 ● 需要側:4Gとスマホでトラフィックの増大 ● ひとつのWebアプリを多数のサーバーでスケールアウト ● サーブレットコンテナが不適合 ● 開発が面倒になるだけ ● Spring Bootでのサーバー埋め込み ● フレームワークのフルスタック化

Slide 17

Slide 17 text

Dockerとマイクロサービス ● サーバーの多コア化 ● 数十コアをいかすために多数のVMを使うと無駄 ● プロセスIDなどサーバーリソースだけ仮想化したコンテナの出現 ● サーバープロセスの柔軟な運用が可能に ● 機能ごとにサーバーをわけて、負荷の高い機能に多くのサーバーリソースを振分け ● マイクロサービス ● JVM、サーブレットやSpring DIの起動速度が問題に ● サーブレットに依存せずコンパイル時DI解決のQuarkusやMicronaut ● 障害時の柔軟性も大切に ● 障害が起きる前提の運用

Slide 18

Slide 18 text

サーバレスとネイティブイメージ ● 機能ごとにサーバーをわけるマイクロサービスをつきつめると リクエストハンドラひとつが切り分けられる ● サーバレス ● クラウド対応CGI ● JVMの起動時間だけではなくJIT最適化の時間も問題に ● 1リクエスト処理するとJITの前にプロセスが終わる ● GraalVMでのネイティブコンパイル ● Project Leydenで標準化

Slide 19

Slide 19 text

Java標準は? ● Java EEの凋落 ● Java EEからJakarta EEへ ● MicroProfile

Slide 20

Slide 20 text

Java EEの凋落 ● 1つのアプリケーションサーバーに多数のアプリケーションをデ プロイするJava EEのモデルはクラウドに合わなかった ● 2013年にリリースされたJava EE 7はクラウドを考慮したもの とは言い難かった ● その後もJava EE 8の開発は進まず ● Java EEアプリケーションサーバーの高度な機能がKubernetes で代替される ● Java EEの強みが失われていく

Slide 21

Slide 21 text

Java EEガーディアンズとJakarta EE ● Java EE 8を進めないオラクルへの不満から2016年にJava EE ガーディアンズが立ち上がる ● 2017年、Java EE 8のリリースとともにEclipse財団へ移管 ● Javaの名前が使えなくなるため、Jakarta EEに

Slide 22

Slide 22 text

MicroProfile ● Java EEのクラウド対応、特にマイクロサービス対応に期待でき ない状況でも強い要求があり、Java EEガーディアンズにも参加 しているメンバーにより2016年にMicroProfileが策定される ● 監視や耐障害性が中心

Slide 23

Slide 23 text

MicroProfileのAPI ● Telemetry ● サーバー状態の取得・提供 ● OpenAPI ● API仕様記述 ● RestClient ● API呼び出し ● Config ● 設定 ● Fault Tolerance ● 耐障害性機能 ● タイムアウト/リトライ/サーキットブレイカー ● JWT Authentication ● JSON Web Tokenによる認証 ● Health ● アプリケーションの稼働確認

Slide 24

Slide 24 text

Jakarta EE 10 ● 2022年にリリース ● Java EE 7から9年 ● Java EE 8は小変更 ● Jakarta EE 9はパッケージ変更 ● Core Profileの導入 ● サーブレット非依存 Updated Not Updated New

Slide 25

Slide 25 text

まとめ ● プログラムとしてWebフレームワークがどういう位置付けか知る とコントロールしやすくなる ● 変化の経緯を知っておくと機能の意味がわかりやすい ● フレームワークの機能からアプリケーションに必要な要素を知る