Slide 1

Slide 1 text

ENVOY MOBILE に入門できなかったので 完全に理解してみた話 PRESENTED BY @_INDUCTOR_ ENVOY MEETUP TOKYO #2

Slide 2

Slide 2 text

自己紹介  inductor (Twitter: _inductor_, GitHubそのまま)  謎のアンバサダー業のかたわらいろんなことをやっている  まとめ: クバネテスとサービスメッシュでビッグデータをディープラーニングするアイオーティーの仕事  Android は2015年頃に Fragment とかが無い状態のアプリを改修とかしてた淡い記憶を持っている  iOS は XCode 7 で環境設定めんどくせーなーって思いながら Fastlane が出たのを眺めてた記憶を持っている  Envoy はなにもわからない(なにもわからない) 2020/6/20

Slide 3

Slide 3 text

ENVOY MOBILE ってなに 2020/6/20

Slide 4

Slide 4 text

ENVOY MOBILE ってなに 2020/6/20

Slide 5

Slide 5 text

モバイル端末のアプリにもENVOYの機能を提供するやつ 2020/6/20 可観測性 メトリック、ロギング、分散トレーシング APIのグルーピングを提供 プロトコル TLS1.3, gRPC QUICなどのプロトコルにも 端末の制限なしに対応 トラフィックの管理 リトライ処理、サーキットブレイカー xDSの動的ルーティングなどが使える

Slide 6

Slide 6 text

雑な図  Before  After 2020/6/20 端末A (iOS 13) 端末B (Android 9) 端末C (iOS 14) 端末A (iOS 13) 端末B (Android 9) 端末C (iOS 14) Service A Service B Service C API Gateway Service A Service B Service C API Gateway HTTP(OS側のライブラリに依存) Envoyがプロトコルの処理を行う

Slide 7

Slide 7 text

どうやって動くのか 2020/6/20

Slide 8

Slide 8 text

公式のドキュメントを覗いてみる 2020/6/20

Slide 9

Slide 9 text

なんだHELLO WORLDあるじゃん楽勝だな 2020/6/20

Slide 10

Slide 10 text

_人人人人人人人人_ > 公式の手順が < > 動かない <  ̄Y^Y^Y^Y^Y ̄ 2020/6/20

Slide 11

Slide 11 text

入門失敗しました  Windows でやったら環境変数とかごちゃごちゃするのめんどくさい(それはそう)  Bazel で実行対象のファイルがパスにないって言われて怒られる  WSL2 Ubuntu でやったら Headless なので CLI で色々やらないといけなくて大変だった  Bazel でよくわからないエラーが出ててトラシュー方法が謎  Mac は持っていない  あと要求事項になかったけど Python とか要求されたので別途いれた  最近の JDK 周り全然よくわからん(特に Android開発でどうすればいいかわからん) 2020/6/20

Slide 12

Slide 12 text

しょうがないのでソースを読みます 2020/6/20

Slide 13

Slide 13 text

ANDROIDのEXAMPLEを覗いてみる  MainActivity の onCreate イベント時に Envoy のクライアントビルダーを初期化  (この例では)Activity のライフサイクルが生きてる限り所定のサーバーにリクエストを送り続けるループがあって  実行結果を画面に表示する処理が書かれている  とりあえず io.envoyproxy.envoymobile.AndroidStreamClientBuilder のソースを読んでみるとよさそう 2020/6/20

Slide 14

Slide 14 text

ソースを読む  AndroidStreamClientBuilder で AndroidEngineImpl なるものの初期化をしてる  今度はその中で EnvoyEngineImpl インスタンスが生成されていて  Envoy Engine の初期化時に JniLibrary.initEngine() が呼ばれて、その中で Envoy の実態が動く  JniLibrary を使って NDK で組み込んだ Envoy を動かしてるんですねなるほど 2020/6/20

Slide 15

Slide 15 text

ソースを読む  AndroidStreamClientBuilder で AndroidEngineImpl なるものの初期化をしてる  今度はその中で EnvoyEngineImpl インスタンスが生成されていて  Envoy Engine の初期化時に JniLibrary.initEngine() が呼ばれて、その中で Envoy の実態が動く  JniLibrary を使って NDK で組み込んだ Envoy を動かしてるんですねなるほど 2020/6/20

Slide 16

Slide 16 text

JNIとかNDKってなに  Java Native Interface の略  C/C++ で書かれたネイティブコードを Java/Kotlin で読み込めるやつ  Android NDK(ねえどんな気持ち?ではなく、Android Native Development Kit)を使って書いた3Dエンジンの組み込 みとかにも使うやつ(しらんけど)  つまり、Envoy のソースコードが Android版でもそのまま使い回されている!  まあ、そりゃ確かにサイトの宣伝通りではあるな・・・という感想 2020/6/20

Slide 17

Slide 17 text

ANDROIDでENVOYが動く仕組みの図 2020/6/20 JNI コンパイル済みの ネイティブコード HTTP周りの処理を任せる

Slide 18

Slide 18 text

まとめ 2020/6/20

Slide 19

Slide 19 text

_人人人人人人人人人_ > ENVOY をスマホで < > 動かすやつ <  ̄Y^Y^Y^Y^Y^Y^Y^ ̄ 2020/6/20

Slide 20

Slide 20 text

まとめ  Envoy Mobile を使うと Envoy を HTTP クライアントライブラリとしてモバイルアプリに組み込める  NDK と JNI のおかげ  ユーザーの OS や端末への依存を気にすることなく gRPC/QUIC などを使えるようになる  インスタンス生成時に Envoy のコンフィグを読み込ませられるので、通信制御などもできる  すべてが Envoy になる 2020/6/20

Slide 21

Slide 21 text

THANK YOU FOR YOUR ATTENTION 2020/6/20