HTTPDNS提供 HTTP API 形式的域名解析服务。为了确保您能就近访问最近的服务节点,同时保障高可用性,我们提供了动态的服务调度能力。本文档介绍如何通过调度接口实时获取服务IP地址。
应用场景
HTTPDNS提供了官方SDK为您提供域名解析服务,在SDK中,我们已经实现了自动获取、更新、维护服务IP地址的功能,您只需要通过接口调用即可完成解析。但在一些特定场景,可能您不希望集成SDK,而是自行根据HTTPDNS官方 HTTP API 来实现域名解析。此时,您就需要关注如何获取、更新、维护服务节点IP地址列表,保证域名解析链路能最近调度、高可用。
为此,我们提供了一个同样是 HTTP API 形式的调度接口,在使用HTTPDNS进行解析前,您需要调用该接口来获取服务地址。整体逻辑为:
您需要在应用中内置一份默认的HTTPDNS启动IP地址列表,应用启动后,您任意选择其中1个IP(或域名),向该地址发起请求,调用调度接口;
调度接口会根据请求的来源地址,自动发现距离最近,且健康的HTTPDNS服务节点;
调度接口在响应中返回该服务节点的服务IP地址列表;
从该服务IP地址列表,任意选择其中一个IP地址来调用解析接口,对域名做解析;
若应用重启、或发生网络切换,您可以使用调度接口再次发起调度请求,获取新的服务地址列表。
通过上述逻辑,您就可以获取、更新、维护一份就近调度、高可用的HTTPDNS服务地址列表。
HTTPDNS官方SDK中已实现本能力,此文档主要针对无法使用SDK的场景。
术语介绍
调度服务:即本文档介绍的提供调度接口的服务,它根据请求来源IP,返回服务IP地址列表及其他服务调度信息,您通常只需要关注返回的IP地址列表。
解析服务:即HTTPDNS解析服务接口,用于将域名解析为对应IP地址。请参见解析服务接口文档。
启动IP:调度服务的IP(可能包含域名)入口。用于获得最新的服务IP地址列表。
服务IP:解析服务的IP入口,用于调用域名解析服务。
接入流程
整体接入流程如图示:
提工单或加入钉钉群35248489申请启动IP列表。
说明启动IP应写死在App中,为保证服务可用性,我们会提供多个启动IP供您使用,若在调用调度接口时请求失败,可以更换另一个启动IP进行重试。
使用启动IP调用调度服务获取服务IP列表。
说明调度服务支持HTTP/HTTPS方式访问。如使用HTTPS,则为了实现IP直连HTTPS请求,需要参考下文中验证服务器身份章节来验证服务器身份。
启动IP仅可用于调用调度服务。
使用服务IP调用解析服务。
按需使用启动IP调用调度服务来更新服务IP列表,保持服务IP列表的有效性。
说明建议App冷启动时进行更新
建议切换网络环境时进行更新
建议每8小时至少更新一次
当服务IP列表经过重试发现都无法解析时,立即更新
解析服务返回的服务IP列表需要有更新机制,长期固定使用可能有稳定性隐患。
调度接口具体说明
URL:https://{启动IP}/{account_id}/ss
{account_id}是您HTTPDNS服务的专属ID,您可以在HTTPDNS控制台上获取。
请求方式:GET
可选参数说明一:
可选参数用于支持调度异常的排查,详情请参考如何使用“会话追踪方案”排查解析异常。
名称 | 是否必须 | 描述 |
sid | 可选 | sessionId,[a-zA-Z0-9]{12},在app启动时生成,用于标记一次独立的app生命周期。 |
net | 可选 | 5g|4g|3g|2g|wifi|unknown,用于标记请求发起时刻os层提供的网络情况。 |
bssid | 可选 | WiFi环境的bssid,用于标记不同的WiFi网络。 |
可选参数说明二:
名称 | 是否必须 | 描述 |
n | 可选 | 待加签的随机数,要求是16进制数,字符长度最小为8,最长为16,例如:abcdef2345。 |
t | 可选 | 1970年1月1日以来的秒数(整型正数,固定长度10)。 重要 客户端和服务器时间偏移需小于150秒,您可以根据响应头中的Date进行校准。 |
s | 可选 | 用secret(在HTTPDNS控制台查看)生成的签名, 计算方式:s=md5sum(n-secret-t), 如:n=abcdef2345,secret=123456,t=1632912372, 则对字符串 "abcdef2345-123456-1632912372"对应的ASCII码进行加签,结果为: de7be63a9f19cf11e9d455d7d4f23cb4。 |
使用HTTPS请求时,需要验证服务器身份:
当您使用HTTPS请求调度接口时,我们会提供主机名为203.107.1.1的有效证书(无论使用哪个IP请求),请据此验证服务器身份;这需要您手动忽略证书错误中的主机名错误,并自行编码验证证书所持主机名为203.107.1.1。
调度接口返回结果时,我们会对响应内容做签名,并将签名值放置在响应头的
X-Checksum-HmacMD5
字段中。如果您对安全性有较高要求,可以根据此签名逻辑验证返回结果是否合法。
返回结果签名逻辑:
假设secretKey为:IAmASecret,随机数n为:2EUenAaShVfy,当前时间戳1568802250, 响应内容为:
{"service_ip":["203.107.1.33"],"service_ipv6":["64:ff9b::cb6b:121"]}
;请求url:
http://{启动IP}/{account_id}/ss?n=2EUenAaShVfy&t=1568802250
sign =
hmacMD5("IAmASecret", "2EUenAaShVfy-{"service_ip":["203.107.1.33"],"service_ipv6":["64:ff9b::cb6b:121"]}-1568802250")
=3C74A498A00EEE6C5E7C599B3B882658
则返回结果的响应头中会包含:
X-Checksum-HmacMD5:3C74A498A00EEE6C5E7C599B3B882658
secretKey可在“HTTPDNS控制台>开发配置>鉴权secretkey”查看。
返回示例:
请求成功时,HTTP响应的状态码为200,响应结果用JSON格式表示,示例如下:
{
"service_ip": [
"203.107.1.33"
],
"service_ipv6": [
"64:ff9b::cb6b:121"
]
}
字段 | 说明 |
service_ip | IPv4服务IP列表,一般只需使用此列表中的IP调用解析服务。 |
service_ipv6 | IPv6服务IP列表,特殊场景下可以使用此列表中的v6 IP调用解析服务。 |
请求失败时,HTTP响应的状态码为4xx/5xx,同时也返回具体的错误码,响应结果用JSON格式表示,示例如下:
{
"code": "MissingArgument"
}
状态码说明
错误码 | HTTP状态码 | 描述 |
MissingArgument | 400 | 缺少必要参数 |
TimeOutOfSync | 400 | 时间偏差过大,请根据响应头中的Date进行校准 |
InvalidNonce | 400 | 随机数不合要求 |
InvalidTimestamp | 403 | 时间戳格式不正确 |
AccountNotExists | 403 | 账户不存在或被禁用,或尚未在HTTPDNS控制台添加过域名 |
InternalError | 500 | 服务端内部错误 |