カスタム名前解決
標準の名前解決、カスタム名前リゾルバーインターフェース、および実装方法について説明します。
カスタム名前解決
概要
名前解決は、基本的にサービスディスカバリに関するものです。 gRPCリクエストを送信する場合、クライアントはサービス名のIPアドレスを決定する必要があります。名前解決は、多くの場合、DNSと同じものと考えられています。しかし実際には、DNSは通常、拡張機能によって拡張されるか、完全に置き換えられて名前解決が有効になります。
gRPCクライアントでリクエストを行う場合、デフォルトではDNS名前解決が使用されます。ただし、他のさまざまな名前解決メカニズムを使用できます。
リゾルバー | 例 | 注記 |
---|---|---|
DNS | grpc.io:50051 | デフォルトでは、DNSが想定されます。 |
DNS | dns:///grpc.dokyumento.jp:50051 | 追加のスラッシュは、権限を提供するために使用されます。 |
Unixドメインソケット | uds:///run/containerd/containerd.sock | |
xDS | xds:///wallet.grpcwallet.io | |
IPv4 | ipv4:198.51.100.123:50051 | 一部の言語でのみサポートされています。 |
注
上記の3つのスラッシュ(///
)は、https://grpc.dokyumento.jp
などのHTTPの2つのスラッシュに慣れている場合は、なじみがないかもしれません。これらの*ターゲット文字列*は、RFC-3986 URIの形式に従います。最初の2つのスラッシュの後、3番目のスラッシュの前(3番目のスラッシュがある場合)にある文字列は、*権限*です。権限文字列は、すべてのリソースのURIを含むサーバーを識別します。従来のHTTPリクエストの場合、URIに対する権限は、リクエストが送信されるサーバーです。それ以外の場合は、権限は名前解決サーバーのIDになり、リソース自体は他のサーバーに存在します。一部の名前リゾルバーは、権限を必要としません。この場合、権限文字列は空のままになり、結果として3つのスラッシュが連続します。いくつかの言語は、ユーザーが独自の名前リゾルバーを定義できるようにするインターフェースをサポートしているため、任意の名前を解決する方法を定義できます。登録されると、*スキーム* my-resolver
を持つ名前リゾルバーは、ターゲット文字列がmy-resolver:
で始まる場合に選択されます。たとえば、my-resolver:///my-service
へのリクエストは、my-resolver
名前リゾルバー実装を使用するようになります。
カスタム名前リゾルバー
サービスディスカバリのためにDNSを拡張または置き換えたい場合はいつでも、カスタム名前リゾルバーの使用を検討できます。たとえば、このインターフェースは、過去にApache Zookeeperを使用してサービス名を検索するために使用されていました。また、ヘッドレスサービスリソースに基づくサービス検索のために、Kubernetes APIサーバーと直接インターフェースするためにも使用されています。
標準のDNSではなくカスタム名前リゾルバーを使用することが特に役立つ理由の1つは、このインターフェースが*リアクティブ*であることです。標準のDNSでは、クライアントは接続の開始時に特定のサービスのアドレスを検索し、接続の存続期間中、そのアドレスへの接続を維持します。ただし、カスタム名前リゾルバーはウォッチベースにすることができます。つまり、時間の経過とともにネームサーバーから更新を受信できるため、バックエンドの障害とバックエンドのスケールアップとスケールダウンにインテリジェントに応答できます。
さらに、カスタム名前リゾルバーは、クライアント接続に*サービス設定*を提供する場合があります。サービス設定は、特定のサービスへのトラフィックのルーティング方法と負荷分散方法を指定する任意の設定を定義するJSONオブジェクトです。最も基本的なレベルでは、これは、特定のサービスがラウンドロビンロードバランシングポリシーとピックファーストを使用する必要があるなど、といったことを指定するために使用できます。ただし、カスタム名前リゾルバーが任意のサービス設定と *カスタムロードバランシングポリシー*と組み合わせて使用される場合、xDSなどの非常に複雑なトラフィック管理システムを構築できます。
ターゲット文字列のライフサイクル
カスタム名前リゾルバーの正確なインターフェースは言語によって異なりますが、一般的な構造は同じです。クライアントは、プロセスの開始近くにあるプロセスグローバルレジストリに*名前リゾルバープロバイダー*の実装を登録します。名前リゾルバープロバイダーは、カスタム名前リゾルバーを対象としたターゲット文字列を使用して、gRPCライブラリによって呼び出されます。そのターゲット文字列を指定すると、名前リゾルバープロバイダーは名前リゾルバーのインスタンスを返します。これは、ターゲット文字列に従ってリクエストを指示するためにクライアント接続と対話します。
sequenceDiagram
Client ->> gRPC: Request to my-resolver:///my-service
gRPC ->> NameResolverProvider: requests NameResolver
NameResolverProvider -->> gRPC: returns NameResolver
gRPC ->> NameResolver: delegates resolution
NameResolver -->> gRPC: addresses
言語サポート
言語 | 例 |
---|---|
Java | 例 |
Go | 例 |
C++ | サポートされていません |
Python | サポートされていません |