概要
gRPCはHTTP/2プロトコルをベースとしたRPCです。
なのでコネクションが永続化され、その中で複数のストリームがリクエスト・レスポンスを取り扱うため負荷分散に注意する必要があります。
今回はEnvoyというgRPCに向いたproxyを使うことでそれを実現します。
環境
- envoy 1.7.0
成果物
今回のソースはこちらにあります。
続きを読む以前はGraceful shutdownをするために以下のようなライブラリを使用していました。
しかしながらGo 1.8 からGraceful Shutdown機能が標準で提供されるようになりました。
今回はその導入方法を紹介します。
ECS + awsvpc + Consul でService Discoveryができるようにします。
最終的にConsulにDNS問い合わせすることでECSのコンテナのIPを知ることができるようにします。
結論を先にいうと以下のようになります。
[ { "name": "consul-agent", "image": "consul:1.1.0", "memoryReservation": 128, "network_mode": "awsvpc", "environment": [ { "name": "CONSUL_LOCAL_CONFIG", "value": "{\"service\":{\"name\":\"api\",\"tags\":[\"development\"]}}" }, { "name": "CONSUL_BIND_INTERFACE", "value": "eth0" } ], "command": [ "agent", "-retry-join", "consul-1a-01.example.io", "-retry-join", "consul-1c-01.example.io", "-retry-join", "consul-1d-01.example.io" ], "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-region": "ap-northeast-1", "awslogs-group": "dev-consul" } } }, { // APIコンテナ } ]続きを読む
以前Consulの基本的な使い方を紹介しました。
このConsulに登録する各ノードに対しサービス設定をすることで、各マイクロサービスに所属しているコンテナ群のIPを取得できるようします。
それによってgRPCでの負荷分散としてのClient-side LBが、動的なコンテナに対しても可能になります。