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

MicroProfile OpenTracing with Helidon

MicroProfile OpenTracing with Helidon

Yasunari Tanaka

February 26, 2020
Tweet

More Decks by Yasunari Tanaka

Other Decks in Programming

Transcript

  1. 1 Yasunari Tanaka / @7richi (http://yasu7ri.hatenablog.com/) ウルシステムズ株式会社 @広島 Software Engineer

    Certified Scrum Master 独自Javaフレームワークのメンテナンスや提案、最近ではAzureを使用したアプリケーション構築がメイン になってきた。社内ではLT駆動など個人のアウトプットを重視した活動を行っている。 また、個人の活動として広島Javaユーザグループなどのいくつかの広島IT系コミュニティで活動を行って います。 自己紹介
  2. 3 MicroProfileとHelidon – MicroProfile について – Helidon について – Helidon

    MP DEMO Helidon MP を使用した分散トレーシング可視化 – OpenTracing について – Jaeger について – MicroProfile OpenTracing  単一サービス Tracing DEMO  複数サービスを跨いだ Tracing DEMO まとめ 本日のアジェンダ
  3. 6 対応しているAPI APIの概要 JAX-RS RESTサービスのためのAPI JSON-P JSON文書をパースし、生成し、クエリを発行するためのAPI JSON-B JSON文書をJavaオブジェクトへバインドするためのAPI CDI

    コンテキストと依存性を注入するためのAPI MicroProfile Config さまざまなソースから構成情報を取得するためのAPI MicroProfile Fault Tolerance サービスの障害を他のサービスへ伝播することを防ぐためのAPI MicroProfile Health マイクロサービスの健全性を診断するためのAPI MicroProfile JWT Authentication JWT(JSON Web Token)認証を行うためのAPI MicroProfile Metrics メトリクスを取得するためのAPI MicroProfile OpenAPI OpenAPIの仕様に基づいたドキュメント生成のためのAPI MicroProfile OpenTracing OpenTracingの仕様に基づいたコンテキスト情報を引き回すための API MicroProfile Rest Client Rest Clientを生成するためのAPI MicroProfileのAPI
  4. 7 対応しているAPI APIの概要 JAX-RS RESTサービスのためのAPI JSON-P JSON文書をパースし、生成し、クエリを発行するためのAPI JSON-B JSON文書をJavaオブジェクトへバインドするためのAPI CDI

    コンテキストと依存性を注入するためのAPI MicroProfile Config さまざまなソースから構成情報を取得するためのAPI MicroProfile Fault Tolerance サービスの障害を他のサービスへ伝播することを防ぐためのAPI MicroProfile Health マイクロサービスの健全性を診断するためのAPI MicroProfile JWT Authentication JWT(JSON Web Token)認証を行うためのAPI MicroProfile Metrics メトリクスを取得するためのAPI MicroProfile OpenAPI OpenAPIの仕様に基づいたドキュメント生成のためのAPI MicroProfile OpenTracing OpenTracingの仕様に基づいたコンテキスト情報を引き回すための API MicroProfile Rest Client Rest Clientを生成するためのAPI MicroProfileのAPI 使用するAPI
  5. 9 アプリケーションサーバを必要としない ‒ Netty上で実行される Cloud Native ‒ Docker, Kubernetes への対応・連携

    2018年にOracle社より公開された、軽量マイクロサービス開発のためのオープンソース Javaライブラリー 群です。 (Latest version:1.4.1) Helidon とは 特徴 2つのプログラミングモデル – Helidon SE  関数型スタイル  インジェクション非対応  GraalVM Native Image – Helidon MP  Java EE/Jakarta EEスタイル (JAX-RS/CDI/など)  MaicroProfile の実装 (Helidon 1.4.1 は MicroProfile 3.2をサポート) https://helidon.io
  6. 10 Helidon SE Helidon SE と MP のコードスタイルの違い WebServer.create( Routing.builder()

    .get("/greet", (req, res) -> res.send("Hello World!")) .build()) .start(); Helidon MP public class GreetService { @GET @Path("/greet") public String getMsg() { return "Hello World!"; } } 関数型スタイルでのプラグラミング 従来型スタイルのプログラミング
  7. 11 Helidon SE Helidon SE と MP のコードスタイルの違い WebServer.create( Routing.builder()

    .get("/greet", (req, res) -> res.send("Hello World!")) .build()) .start(); Helidon MP public class GreetService { @GET @Path("/greet") public String getMsg() { return "Hello World!"; } } 関数型スタイルでのプラグラミング 従来型スタイルのプログラミング 使用するプログラミングスタイル
  8. 13 Mavenを使用し簡単にQuickstart のサンプルアプリケーションを作成出来ます。 Build AND Run サンプルRest API の呼び出し Quickstart

    Helidon MP DEMO mvn archetype:generate -DinteractiveMode=false ¥ -DarchetypeGroupId=io.helidon.archetypes ¥ -DarchetypeArtifactId=helidon-quickstart-mp ¥ -DarchetypeVersion=1.4.1 ¥ -DgroupId=io.helidon.examples ¥ -DartifactId=helidon-quickstart-mp ¥ -Dpackage=io.helidon.examples.quickstart.mp mvn package java -jar target/helidon-quickstart-mp.jar curl -X GET http://localhost:8080/greet {"message":"Hello World!"}
  9. 15 Helidon MPでのサーバーの起動方法 Helidon が提供しているNetty ベースのWebServerを起動させています。 起動時にmicroprofile-config.propertiesに設定されているプロパティとMETA-INF/beans.xmlファ イルの設定によりBeanを検出します。 サンプルアプリの確認内容 public

    final class Main { private Main() { } public static void main(final String[] args) throws IOException { Server server = startServer(); System.out.println("http://localhost:" + server.port() + "/greet"); } static Server startServer() { return Server.create().start(); } }
  10. 17 Java Beanを検出する為にMETA-INF/beans.xmlファイルのbean-discovery-mode属性 へ”annotated”と指定しアプリケーションスコープのJava Beanを検出するように指定しています。 サンプルアプリの確認内容 <?xml version="1.0" encoding="UTF-8"?> <beans

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_2_0.xsd" bean-discovery-mode="annotated"> </beans>
  11. 22 トレーシング情報の伝播 各Spanからのリクエストでは、HeaderへTrace ID, Span ID, Parent Span IDの情報を付与しトレー シングに必要な情報を伝播させていきます。

    分散トレーシングの概念 Span 処理の開始、終了時刻を持つ1つの処理単位を表します。 Trace Spanをネストし処理の因果関係と順序を表現するSpanの集 合です。システムで処理される実行パスを表すことが出来ま す。 Service A Service B Service C Service D Service E Trace ID=xxxA Span ID=yyyA Trace ID=xxxA Span ID=yyyB Parent Span ID=yyyA Trace ID=xxxA Span ID=yyyC Parent Span ID=yyyB Trace ID=xxxA Span ID=yyyD Parent Span ID=yyyC Trace ID=xxxA Span ID=yyyE Parent Span ID=yyyA Span A Span B Span C Span D Span E Trace
  12. 26 Jaegerを動かしてみよう 検証用にAll in OneのDockerイメージが公開されています。 このイメージを利用するとメモリ内のストレージコンポーネントを使用してjaeger-ui、collector、 query、 およびagentを起動できます。 jaeger-ui docker

    run -d --name jaeger ¥ -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 ¥ -p 5775:5775/udp ¥ -p 6831:6831/udp ¥ -p 6832:6832/udp ¥ -p 5778:5778 ¥ -p 16686:16686 ¥ -p 14268:14268 ¥ -p 9411:9411 ¥ jaegertracing/all-in-one:1.16 http://localhost:16686 all-in-one Dockerイメージの守備範囲
  13. 30 概要図 jaeger-agent jaeger-collector memory jaeger-query jaeger-ui Application MicroProfile OpenTracing

    OpenTracing API jaeger-client greet-service (Quickstart Helidon MP) console curl http://localhost:8080/greet Hello World jaegertracing/all-in-one
  14. 31 単一サービスのトレーシング Jaeger Clientの追加 pom.xml に以下の依存関係を追加し Helidonが提供しているJaeger Client の追加を行います。 トレーシング用のサービス名を記述

    Helidon から Jaeger に送信されるトレーシングデータとサービスを紐付ける為 サービス名をMETA-INF/microprofile-config.propertiesへ指定します。 <dependency> <groupId>io.helidon.tracing</groupId> <artifactId>helidon-tracing-jaeger</artifactId> </dependency> tracing.service=greet-service このレイヤー Application MicroProfile OpenTracing OpenTracing API jaeger-client greet-service (Quickstart Helidon MP)
  15. 35 概要図 jaeger-agent jaeger-collector memory jaeger-query jaeger-ui Application MicroProfile OpenTracing

    OpenTracing API jaeger-client greet-service (Quickstart Helidon MP) console curl http://localhost:8081/greet_proxy {"message":"Hello World!"} Application MicroProfile OpenTracing OpenTracing API jaeger-client greet-proxy-service {"message":"Hello World!"} curl http://localhost:8080/greet jaegertracing/all-in-one
  16. 36 MicroProfile Rest Clientを使用してgreet Serviceを呼び出します。 MicroProfile Rest Clientの作成 GreetServiceClient を使用しGreet

    Serviceの呼出を行います。 greet サービスの呼び出し @RegisterRestClient(baseUri=http://localhost:8080) public interface GreetServiceClient { @Path("/greet") @GET JsonObject getGreetMessage(); } @Inject @RestClient SecondServiceClient secondServiceClient; @GET @Produces(MediaType.APPLICATION_JSON) public JsonObject getDefaultMessage() { return secondServiceClient.getGreetMessage(); }
  17. 40 今回はMicroProfile OpenTracingを使用し分散トレーシングを試してみました。 分散システムを採用した場合に分散トレーシングの可視化が出来ている状態であれば、仮にシステムに障 害や遅延が発生しても把握しやすいのではないでしょうか。 このように、MicroProfile には OpenTracing の他にもMicroProfile MetricsやMicroProfile

    Fault Toleranceなどのマイクロサービス向けの仕様が用意されています。 現在のモノシリックなJavaEEを使用したアプリケーションからマイクロサービスへの移行を検討する際に、選 択として検討する事が出来るのではないでしょうか。 まとめ