原文:gRPC Name Resolution
翻译整理: 陈进涛 译文链接:【译】gRPC名称解析。 转载请保留原文出处和译文译者和出处。
概览
gRPC支持将DNS作为默认名称系统。 在各种部署中使用了许多其他类型的名称系统。 我们支持足够通用的API,以支持各种名称系统和名称的相应语法。 各种语言的gRPC客户端库将提供一种插件机制,以便可以插入用于不同名称系统的解析器。
详细设计
名称语法
用于 gRPC 通道构造的完全限定的自包含名称系统使用 RFC 3986中定义的URI 语法.
URI scheme指示要使用的解析程序插件。 如果未指定scheme前缀或scheme未知,则默认使用dns scheme。URI路径指示要解析的名称。
大多数gRPC实现都支持以下URI schemes:
dns:[//authority/]host[:port]
– DNS (默认)host
是要通过DNS解析的主机。port
是每个地址要返回的端口。 如果未指定,则使用443(但对于不安全的通道,某些实现默认为80)。authority
指示要使用的DNS服务器,尽管只有某些实现才支持。 (在C-core中,默认的DNS解析器不支持此功能,但是基于c-ares的解析器支持以“ IP:port”的形式指定此名称。)
unix:path
,unix://absolute_path
–Unix域套接字(只是在Unix系统)path
指示所需套接字的位置.- 在第一种形式中,路径可以是相对的或绝对的。 在第二种形式中,路径必须是绝对(即,实际上将有三个斜线,两个斜线在路径之前,另一个斜线开始绝对路径)。
unix-abstract:abstract_path
– 抽象名称空间中的Unix域套接字(只是在Unix系统)abstract_path
指示抽象名称空间中的名称.- 该名称与文件系统路径名没有关系.
- 没有权限限制将应用于套接字-任何进程/用户都可以访问套接字
- 抽象套接字的基础实现使用空字节(’\ 0’)作为第一个字符。实现将会前置这个null。不要在abstract_path中包含null。
abstract_path
不能包含null字节.- TODO(https://github.com/grpc/grpc/issues/24638): Unix允许抽象套接字名称包含空字节,但是gRPC C核心实现不支持此功能。
gRPC C核心实现支持以下scheme,但其他语言可能不支持以下scheme:
ipv4:address[:port][,address[:port],...]
– IPv4 地址- 能够指定多个以逗号分割的地址,地址形式为
address[:port]
:address
使用的IPv4地址.port
使用的端口.如果没有指定, 使用443.
- 能够指定多个以逗号分割的地址,地址形式为
ipv6:address[:port][,address[:port],...]
– IPv6 地址- 能够指定多个以逗号分割的地址,地址形式为
address[:port]
:address
是使用的IPv6地址. 为了和port
一起使用,address
必须 用方括号括起来 ([
and]
). 例如:ipv6:[2607:f8b0:400e:c00::ef]:443
或者ipv6:[::]:1234
port
使用的端口.如果没有指定, 使用443.
- 能够指定多个以逗号分割的地址,地址形式为
在未来, 额外的 schemes 例如 etcd
能够被添加.
解析插件
gRPC客户端库将使用指定的scheme来选择正确的解析器插件,并将完整的名称字符串传递给它。
解析器应该能够连接到认证机构(authority)并获得一个解析,认证机构将结构返回给gRPC客户端库。返回的内容包括:
- 解析地址列表(IP地址和端口)。每个地址可以具有一组任意属性 (key/value 对) 与它关联,可以用来将信息从解析器传递到负载平衡策略。
- 服务配置信息:service config.
插件API允许解析器连续监视端点并根据需要返回更新的解析结果。
备注:
1.C-core是grpc共享C 核心库 src/core.
2.c-ares是一个用于异步DNS请求(包括名称解析)的C库。
-------------本文结束,感谢您的阅读-------------