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

Quarkus入門 + Updates

Quarkus入門 + Updates

2019 日本 JBoss ユーザ・グループ勉強会のスライドです
https://ossbyredhat.connpass.com/event/153523/
#jjbug #quarkus

Norito Agetsuma

December 11, 2019
Tweet

More Decks by Norito Agetsuma

Other Decks in Technology

Transcript

  1. 7 • アプリケーション コンテナの原則 ◦ のクラスローダ機構は冗長な機能になった • コンテナ単位でスケール ◦ の起動停止が以前より頻繁に行われる

    • コンテナ再起動でファイルシステム初期化 ◦ リッチな 管理コンソールでデータソース設定しても消える Kubernetes普及によって前提が変わった
  2. 8 • ではワーカーノードは で稼働 ◦ インストールの場合 ◦ メモリ ◦ でメモリ

    〜占有すると にデプロイしにくい 小さいjavaプロセスが求められた
  3. 10 • ネイティブイメージは非常にコンパクト ◦ 起動直後のメモリフットプリント 〜 ◦ バイナリサイズは 〜 •

    制約も多く既存ライブラリのネイティブビルドは困難 ◦ で多用されている動的クラスローディング不可 など ◦ ネイティブビルドの制約 https://github.com/oracle/graal/blob/master/substratevm/LIMITATIONS.md#reflection Graal VM native-imageの登場
  4. 12 Quarkusの起動速度 Quarkus + Native (via GraalVM) 0.056 Seconds Quarkus

    + JVM (via OpenJDK) 2.076 Seconds Thorntail 2.5.0 16.3 Seconds JAX-RS/CD/JPAのCRUDアプリケーションサンプルで計測 WildFly18.0.1 9.6 Seconds
  5. 13

  6. 14 • など に含まれる既存 が使える • の定型コードを削減 • でホットスワップ開始 •

    テスト機能 ◦ と ベースのテスト ◦ によるネイティブイメージへテスト デモまとめ - Quarkusで出来ること
  7. 15 • ◦ はちょっと という方におすすめ • 元々は プロジェクトで開発されたライブラリ ◦ 既存の

    ドライバに依存せずに新たに実装 • 現時点では と のみサポート • マッパー系の SQLを書きたい場合
  8. 16 @ApplicationScoped public class EmployeeRepository { @Inject io.vertx.axle.pgclient.PgPool client; public

    CompletionStage<List<Employee>> getAll() { return client .preparedQuery("SELECT id, name FROM employee ORDER BY id ASC") .thenApply(pgRowSet -> { List<Employee> list = new ArrayList<>(pgRowSet.size()); pgRowSet.forEach(row -> list.add( new Employee(row.getLong("id"), row.getString("name")) )); return list; }); } }
  9. @ApplicationScoped public class EmployeeRepository { @Inject io.vertx.axle.pgclient.PgPool client; public CompletionStage<List<Employee>>

    getAll() { return client .preparedQuery("SELECT id, name FROM employee ORDER BY id ASC") .thenApply(pgRowSet -> { List<Employee> list = new ArrayList<>(pgRowSet.size()); pgRowSet.forEach(row -> list.add( new Employee(row.getLong("id"), row.getString("name")) )); return list; }); } } 17 で管理された コネクションプール
  10. @ApplicationScoped public class EmployeeRepository { @Inject io.vertx.axle.pgclient.PgPool client; public CompletionStage<List<Employee>>

    getAll() { return client .preparedQuery("SELECT id, name FROM employee ORDER BY id ASC") .thenApply(pgRowSet -> { List<Employee> list = new ArrayList<>(pgRowSet.size()); pgRowSet.forEach(row -> list.add( new Employee(row.getLong("id"), row.getString("name")) )); return list; }); } } 18 戻り値は 型。 よって 応答待ちのブロックをせずに、 メソッドは直ちに応答する。
  11. @ApplicationScoped public class EmployeeRepository { @Inject io.vertx.axle.pgclient.PgPool client; public CompletionStage<List<Employee>>

    getAll() { return client .preparedQuery("SELECT id, name FROM employee ORDER BY id ASC") .thenApply(pgRowSet -> { List<Employee> list = new ArrayList<>(pgRowSet.size()); pgRowSet.forEach(row -> list.add( new Employee(row.getLong("id"), row.getString("name")) )); return list; }); } } 19 実行したい を書く
  12. @ApplicationScoped public class EmployeeRepository { @Inject io.vertx.axle.pgclient.PgPool client; public CompletionStage<List<Employee>>

    getAll() { return client .preparedQuery("SELECT id, name FROM employee ORDER BY id ASC") .thenApply(pgRowSet -> { List<Employee> list = new ArrayList<>(pgRowSet.size()); pgRowSet.forEach(row -> list.add( new Employee(row.getLong("id"), row.getString("name")) )); return list; }); } } 20 io.vertx.axle.sqlclient.RowSet型から SQL結果行(row)を取ってきて、 Employee型に詰め替える
  13. @Path("/employee") public class EmployeeResource { @Inject EmployeeRepository employee @GET @Path("all")

    @Produces("application/json") public CompletionStage<List<Employee>> getAll() { return employee.getAll(); } ... } 21 JAX-RS2.1(Java EE 8)では、エンドポイント実装の戻り値に CompletionStage型が使える。 getAllはブロックされずに直ちに完了し、 SQL応答後にクライアントにjson応答される。
  14. 23 • 登場に伴い プロジェクトは収束へ • 年 月末で の有償サポート終了 • コミュニティとしても

    の予定 https://thorntail.io/posts/thorntail-community-announcement-on-quarkus/ QuarkusとThorntail
  15. 27 例: JAX-RSのライブラリスタック RESTEasy (JAX-RS実装) Undertow (Servlet実装) XNIO (ノンブロッキングI/Oライブラリ) java.nio.channel

    (JDK付属のノンブロッキングI/O API) Quarkus RESTEasy extension (Vert.xのHandler実装としてRESTEasyをコール) Vert.x / Netty (ノンブロッキングI/Oライブラリ) java.nio.channel (JDK付属のノンブロッキングI/OAPI)
  16. 30 @RestController public class EmployeeController { private EmployeeRepository empRepository; public

    EmployeeController(EmployeeRepository empRepository) { this.empRepository = empRepository; } @GetMapping(value = "/all", produces = "application/json") public Iterable<Employee> getAll() { return empRepository.findAll(); } Spring MVC API on Quarkus
  17. 31 "vert.x-worker-thread-1" #65 prio=5 os_prio=31 tid=0x00007fc0518f7800 nid=0xa307 runnable [0x000070000ae05000] java.lang.Thread.State:

    RUNNABLE at sample.quarkus.crud.spring.EmployeeController.get(EmployeeController.java:23) ... at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:122) at org.jboss.resteasy.core.ResourceMethodInvoker.internalInvokeOnTarget(ResourceMethodInvoker.java:594) at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTargetAfterFilter(ResourceMethodInvoker.java:468) ... at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:238) …. at io.quarkus.resteasy.runtime.standalone.RequestDispatcher.service(RequestDispatcher.java:73) at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler.dispatch(VertxRequestHandler.java:118) at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler.lambda$handle$0(VertxRequestHandler.java:74) at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler$$Lambda$438/147870592.handle(Unknown Source) at io.vertx.core.impl.ContextImpl.lambda$executeBlocking$2(ContextImpl.java:316) at io.vertx.core.impl.ContextImpl$$Lambda$432/1558995732.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ... 見た目Spring / 中身Vert.x+RESTEasy 上で を動かすために で作り込んだレイヤ
  18. 33 開発・検討中の新機能 • 対応のテンプレートエンジン ◦ https://github.com/quarkusio/quarkus/blob/master/docs/src/main/asciidoc/qute.adoc • • 新しい の検討

    ◦ https://github.com/smallrye/smallrye-mutiny • サポート • 一覧はリンク先のロードマップ参照 https://github.com/orgs/quarkusio/projects/5
  19. 36