传统的 DNS(Domain Name System)使开发者常面临着域名劫持、调度不精准的问题。html
HTTPDNS 使用 HTTP 协议替换经常使用的 UDP 协议,完成客户端和递归 DNS 之间的域名解析过程,使得 HTTPDNS 服务器自身能够充当递归 DNS ,这样域名解析请求直接发送到阿里云的 HTTPDNS 服务器,能够绕过Local DNS运营商 ,避免因为 Local DNS 形成的域名劫持和调度不精准问题。产品原理以下图所示:缓存
图1 架构原理图安全
虽然,HTTPDNS 在域名劫持和调度上,相对传统 DNS 已经有了质的飞跃,可是还存在以下不足:
(1)【权威 DNS 存在不足】传统权威 DNS 的功能很是有限,且不一样供应商提供的能力良莠不齐,有优化空间;
(2)【没法优化结果】HTTPDNS 充当递归DNS的功能时,没法改变权威 DNS 解析的结果;
(3)【缺少管理】客户域名解析缺少集中管理,大型客户的域名解析每每分布在多个 DNS 供应商。服务器
而 SDNS 不只能够帮助开发者进一步优化调度质量,并且能够结合函数计算等能力,扩展 HTTPDNS 的服务边界,提供了用户自定义的处理逻辑,让业务更加方便灵活。网络
SDNS(Software-Defined Name System,简称SDNS)即软件定义解析,是在 HTTPDNS 的基础上,创造性的引入了自定义解析功能。其主要特性有:
(1)支持客户端自定义参数输入;
(2)HTTPDNS 服务器端结合自定义函数处理能力,支持客户实现复杂的自定义解析功能;
(3)返回自定义解析结果给客户端。架构
SDNS 在功能上完成了三个方面的飞跃:dom
(1)自定义能力分布式
(2)服务扩展能力函数
(3)系统调度能力性能
基于跟函数计算进行业务的整合,SDNS 能够实现多种能力。
SDNS 能够在解析的过程当中,在指定的阶段执行由客户编写的函数计算(FC)的函数逻辑,并提供如下能力:
(1)获取客户IP所在的所在地域及运营商信息;
(2)修改域名解析结果及 TTL 时间;
(3)添加自定义的数据输出,与解析结果一块儿返回。
SDNS 能够将运行时上下文输入给函数计算(FC)的函数,容许客户定义逻辑来处理这些数据。并将处理后的结果合并回SDNS 解析流程中。
SDNS 的系统架构以下:
图2 架构原理图
阿里云 SDNS 实现自定义解析的核心是引入函数计算服务。
图3 自定义解析功能原理图
HTTPDNS 经过为如下5个阶段之间提供 Hook 点,并经过引入函数计算在这些 Hook 点实现自定义函数功能。
阶段名 | 说明 |
---|---|
HTTPDNS_LOCATE_IP | 在地址库中定位该IP所在地域及运营商 |
HTTPDNS_CHECK_CACHE | 以域名和定位结果信息做为 key,搜索缓存中的解析结果,若是有有效解析结果则跳转至 HTTPDNS_WRITE_RESPONSE 阶段;若是没有进入 HTTPDNS_RESOLVE 阶段 |
HTTPDNS_RESOLVE | 实际执行递归解析逻辑 |
HTTPDNS_WRITE_CACHE | 将解析结果写入缓存 |
HTTPDNS_WRITE_RESPONSE | 将解析结果写入响应中并返回给调用端 |
Demo Hook 函数实现了两个功能:
(1)为返回结果增长一个 IP;
(2)为返回结果增长了“extra”字段。
'use strict'; exports.handler = function (event, context, callback) { // 解析传入的入参 /* event = { "domainName": "www.aliyun.com.", // 注意后缀有个点 "clientIp": "42.120.75.128", "location": { "continent": "asia", "country": "china", "isp": "bgp", // <cmcc|unicom|chinanet|bgp|unknown> "city": "zhejiang" }, "ips": ["140.205.135.3"], "ttl": 60 } */ event = JSON.parse(event.toString()); // callback 第一个参数是exception,第二个参数是出参,会被自动JSON化 callback(null, { ips: event.ips.concat(['188.177.166.155']), ttl: event.ttl * 2, extra: "some-thing-send-to-user" }); };
详细使用说明:https://help.aliyun.com/document_detail/121293.html
基于 SDNS ,能够缩短 OTT 时间,当遭遇到网络攻击后,及时调整 OTT 时间,将业务及时切换到阿里云高防,既保障了业务安全,又优化了自身成本。
案例:
客户服务遭到 DDOS 攻击,出现服务延迟甚至不可用。客户可使用 SDNS 服务,在遭到攻击时,经过调整 OTT 生效时间,快速地将服务切换至高防 IP 完成清洗,保障服务的可用性。
以直播为例,北京地区准备开展一次大型直播,服务器面临巨大流量压力会致使拥塞和延时追赶。接入 SDNS 后,非直播流量调度到其它服务地区,避免流量陡增形成的问题,直播结束后再切回。定向调度能有效缓解流量压力,保障和提高直播的体验。
传统 DNS 不对请求来源进行区分,从随机服务 IP 池中选择其中一个返回给访问者。这种调度方式,会对最终用户的体验,形成不良影响。
智能调度能够根据解析请求的 IP 地址所归属的地域、运营商返回就近的服务器 IP。另外,对于分布式服务(典型的如 CDN 服务),还能够下降最终用户访问服务器的延迟。
通常 DNS 会分地域调度,在CDN 场景下,根据地域自动填充调度路径;非 CDN 场景则需用户手动填写。SDNS 在 CDN 场景下提供 OTT 能力,能够在多个 CDN 之间互相切换,从而实现对调度结果的优化。
案例:
过去解析 aliyun.com ,必定会返回 aliyun.com 的 CDN 厂商A的解析结果。如今基于智能调度,客户可以规划路径,能够返回n次厂商A,m次厂商B。结合信息扩展字段 extras,还能够告知本次选择的上下文,方便客户端作 CDN 厂商性能跟踪。
图4 智能调度示意图
当 DNS 请求的 IP 地址归属特定 IP 地址段时,返回对应的服务器 IP。
【场景五】自定义参数解析
基于自定义参数输入进行调度,如根据用户帐号调度(好比不一样用户的上下文信息存储于不一样的服务器中,采用默认的 HTTPDNS 调度策略不合适)。
图6 自定义参数调度示意图
同时,基于自定义参数,还能够实现业务的A/B Test 和新服务发布的灰度。
基于 SDNS,能够前置检查域名解析结果的性能和可用性,并在结果返回前优化,若是返回 IP 质量不佳则能够切换至优质的 IP。
SDNS 是 HTTPDNS 在开放性上的一次跃迁,打破了原有的封闭服务模式,赋能企业研发团队。基于 SDNS,研发团队能够进一步提升调度精准度,提高业务覆盖面,助力打造更强大、更智能的调度体系,为最终用户提供极致的体验。
原文连接 本文为云栖社区原创内容,未经容许不得转载。