Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Java 23の概要とJava Web Frameworkの現状 / Java 23 and ...

Java 23の概要とJava Web Frameworkの現状 / Java 23 and Java web framework

2024年11月27日に福岡で開催された「JJUG CCC 2024 Fall報告会」での登壇資料です。
https://lycorptech-jp.connpass.com/event/334214/

Naoki Kishida

November 27, 2024
Tweet

More Decks by Naoki Kishida

Other Decks in Programming

Transcript

  1. Java 23 overview / Current status of Java web frameworks

    2024-11-27 JJUG CCC 2024 Fall 報告会 LINEヤフー きしだ なおき #javaq
  2. 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)
  3. 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); } }
  4. 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); } } }
  5. Simple sample code • when omit the class definition, java.base

    and java.util.IO will be imported automatically
  6. primitive types in pattern(preview) • primitive types are available in

    patten matching such as instanceof or switch • range check • like if expression
  7. Generational ZGC • Generational ZGC standardized in Java 22 is

    deault • non-generational algorithm will be removed
  8. 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(""" <html><head><title>Hello</title></head> <body><h1>Hello</h1>%s</body></html> """.formatted(message)); } catch (IOException ex) { throw new UncheckedIOException(ex); } }); } }
  9. Web開発に必要な処理 • HTTP処理 • ルーティング • リクエスト • レスポンス •

    Webアプリケーション処理 • セッション • 認証/認可 • リソース • サーバー管理 • 実行 • 設定 • モニタリング • 開発管理 • ビルド • デプロイ • テスト
  10. Dockerとマイクロサービス • サーバーの多コア化 • 数十コアをいかすために多数のVMを使うと無駄 • プロセスIDなどサーバーリソースだけ仮想化したコンテナの出現 • サーバープロセスの柔軟な運用が可能に •

    機能ごとにサーバーをわけて、負荷の高い機能に多くのサーバーリソースを振分け • マイクロサービス • JVM、サーブレットやSpring DIの起動速度が問題に • サーブレットに依存せずコンパイル時DI解決のQuarkusやMicronaut • 障害時の柔軟性も大切に • 障害が起きる前提の運用
  11. Java EEの凋落 • 1つのアプリケーションサーバーに多数のアプリケーションをデ プロイするJava EEのモデルはクラウドに合わなかった • 2013年にリリースされたJava EE 7はクラウドを考慮したもの

    とは言い難かった • その後もJava EE 8の開発は進まず • Java EEアプリケーションサーバーの高度な機能がKubernetes で代替される • Java EEの強みが失われていく
  12. Java EEガーディアンズとJakarta EE • Java EE 8を進めないオラクルへの不満から2016年にJava EE ガーディアンズが立ち上がる •

    2017年、Java EE 8のリリースとともにEclipse財団へ移管 • Javaの名前が使えなくなるため、Jakarta EEに
  13. MicroProfileのAPI • Telemetry • サーバー状態の取得・提供 • OpenAPI • API仕様記述 •

    RestClient • API呼び出し • Config • 設定 • Fault Tolerance • 耐障害性機能 • タイムアウト/リトライ/サーキットブレイカー • JWT Authentication • JSON Web Tokenによる認証 • Health • アプリケーションの稼働確認
  14. Jakarta EE 10 • 2022年にリリース • Java EE 7から9年 •

    Java EE 8は小変更 • Jakarta EE 9はパッケージ変更 • Core Profileの導入 • サーブレット非依存 Updated Not Updated New