| # gRPC Name Resolution |
| |
| ## Overview |
| |
| gRPC supports DNS as the default name-system. A number of alternative |
| name-systems are used in various deployments. We support an API that is |
| general enough to support a range of name-systems and the corresponding |
| syntax for names. The gRPC client library in various languages will |
| provide a plugin mechanism so resolvers for different name-systems can |
| be plugged in. |
| |
| ## Detailed Design |
| |
| ### Name Syntax |
| |
| A fully qualified, self contained name used for gRPC channel construction |
| uses the syntax: |
| |
| ``` |
| scheme://authority/endpoint_name |
| ``` |
| |
| Here, `scheme` indicates the name-system to be used. Currently, we |
| support the following schemes: |
| |
| - `dns` |
| |
| - `ipv4` (IPv4 address) |
| |
| - `ipv6` (IPv6 address) |
| |
| - `unix` (path to unix domain socket -- unix systems only) |
| |
| In the future, additional schemes such as `etcd` could be added. |
| |
| The `authority` indicates some scheme-specific bootstrap information, e.g., |
| for DNS, the authority may include the IP[:port] of the DNS server to |
| use. Often, a DNS name may be used as the authority, since the ability to |
| resolve DNS names is already built into all gRPC client libraries. |
| |
| Finally, the `endpoint_name` indicates a concrete name to be looked up |
| in a given name-system identified by the scheme and the authority. The |
| syntax of the endpoint name is dictated by the scheme in use. |
| |
| ### Resolver Plugins |
| |
| The gRPC client library will use the specified scheme to pick the right |
| resolver plugin and pass it the fully qualified name string. |
| |
| Resolvers should be able to contact the authority and get a resolution |
| that they return back to the gRPC client library. The returned contents |
| include: |
| |
| - A list of resolved addresses, each of which has three attributes: |
| - The address itself, including both IP address and port. |
| - A boolean indicating whether the address is a backend address (i.e., |
| the address to use to contact the server directly) or a balancer |
| address (for cases where [external load balancing](load-balancing.md) |
| is in use). |
| - The name of the balancer, if the address is a balancer address. |
| This will be used to perform peer authorization. |
| - A [service config](service_config.md). |
| |
| The plugin API allows the resolvers to continuously watch an endpoint |
| and return updated resolutions as needed. |