gRPCのためのEnvoy Proxy
Akka gRPCを使ってgRPCサーバを構築したが、実際の構成に近いようにということでEnvoyを経由してアクセスさせる。
Dockerで動かすべく見てみると現時点での最新Stableはv1.15.0だった。
この辺りを参考に動かそうとしたら設定内容が微妙に古いようなので、Envoyのv3 APIの情報を参考にしながら設定し直す。
v3 API reference — envoy 1.16.0-dev-7f4e35 documentation
最終的にはenvoy.yamlは以下のようになった
static_resources: listeners: - name: listener_0 address: socket_address: { protocol: TCP, address: 0.0.0.0, port_value: 8080 } filter_chains: - filters: - name: envoy.filters.network.http_connection_manager typed_config: "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager stat_prefix: ingress_http codec_type: auto route_config: name: local_route virtual_hosts: - name: local_service domains: - "*" routes: - match: prefix: "/" grpc: {} route: cluster: todo_service http_filters: - name: envoy.filters.http.router typed_config: {} clusters: - name: todo_service connect_timeout: 0.250s type: logical_dns http2_protocol_options: {} lb_policy: round_robin load_assignment: cluster_name: todo_service endpoints: - lb_endpoints: - endpoint: address: socket_address: address: scala-grpc port_value: 9090
関係ないけど、普段yamlはvimで触ることが多いもののインデントがよく崩れるので以下の設定を入れたら快適になった。
autocmd FileType yaml setlocal ts=2 sts=2 sw=2 expandtab
構築したgRPCサーバをsbt-native-packagerでdockerイメージを作り、 scala-grpc
という名前で動かすものの全然うまく動かなくてドハマリした。
エラーハンドリングをしていないせいで処理中に例外が発生すると INTERNAL
というエラーしか吐かれず、何が問題なのか分からなすぎて解決にやたらと時間がかかった。ちゃんとエラーをログに吐かないと辛いことになる。
ハマったエラーは、今回H2を使っているもののdockerイメージを作るタイミングでDDLファイルが同梱されず、テーブルが正常に生成されていないためにDBアクセスすると例外が吐かれている、というものだった。読み込むファイルパスを無理やり変えてマウントしてなんとか動かすことができた。
gRPCの疎通確認は
こちらのブログで紹介されてたEvansを使った。めっちゃ便利。
次こそgrpc-webの実装に入りたい。