1700478941
域名:www.xxx.sh.cn
1700478942
1700478943
IP地址:69.224.162.154
1700478944
1700478945
解析者:上海DNS服务器
1700478946
1700478947
请输入域名(输入N退出):www.xxx.com.cn
1700478948
1700478949
–-DNS服务器解析结果–-
1700478950
1700478951
域名:www.xxx.com.cn
1700478952
1700478953
IP地址:51.28.66.140
1700478954
1700478955
解析者:中国顶级DNS服务器
1700478956
1700478957
请输入域名(输入N退出):www.xxx.com
1700478958
1700478959
–-DNS服务器解析结果–-
1700478960
1700478961
域名:www.xxx.com
1700478962
1700478963
IP地址:73.247.80.117
1700478964
1700478965
解析者:全球顶级DNS服务器
1700478966
1700478967
请输入域名(输入N退出):n
1700478968
1700478969
请注意看运行结果,以”.sh.cn”结尾的域名确实由上海DNS服务器解析了,以”.cn”结尾的域名由中国顶级DNS服务器解析了,其他域名都由全球顶级DNS服务器解析。这个模拟过程看起来很完整,它完全就是责任链模式的一个具体应用,把一个请求放置到链中的首节点,然后由链中的某个节点进行解析并将结果反馈给调用者。但是,我可以负责任地告诉你:这个解析过程是有缺陷的,什么缺陷?后面会说明。
1700478970
1700478971
1700478972
1700478973
1700478974
设计模式之禅 32.3.2 触发链模式实现DNS解析过程
1700478975
1700478976
上面说到使用责任链模式模拟DNS解析过程是有缺陷的,究竟有什么缺陷?大家是不是觉得这个解析过程很完美了,没什么问题了?那说明你对DNS协议了解得还不太深入。我们来做一个实验,在DOS窗口下输入nslookup命令,然后输入多个域名,注意观察返回值有哪些数据是相同的。可以看出,解析者都相同,都是由同一个DNS服务器解析的,准确地说都是由本机配置的DNS服务器做的解析。这与我们上面的模拟过程是不相同的,看看我们模拟的过程,对请求者来说,”.sh.cn”是由区域DNS解析的,”.com”却是由全球顶级DNS解析的,与真实的过程不相同,这是怎么回事呢?
1700478977
1700478978
肯定地说,采用责任链模式模拟DNS解析过程是不完美的,或者说是有缺陷的,怎么来修复这个缺陷呢?我们先来看看真实的DNS解析过程,如图32-9所示。
1700478979
1700478980
1700478981
1700478982
1700478983
图32-9 真实的DNS解析示意图
1700478984
1700478985
解析一个域名的完整路径如图32-9中的标号①~⑥所示,首先由请求者发送一个请求,然后由上海DNS服务器尝试解析,若不能解析再通过路径②转发给中国顶级DNS进行解析,解析后的结果通过路径⑤返回给上海DNS服务器,然后由上海DNS服务器通过路径⑥返回给请求者。同样,若中国顶级DNS不能解析,则通过路径③转由全球顶级DNS进行解析,通过路径④把结果返回给中国顶级DNS,然后再通过路径⑤返回给上海DNS。注意看标号⑥,不管一个域名最终由谁解析,最终反馈到请求者的还是第一个节点,也就是说首节点负责对请求者应答,其他节点都不与请求者交互,而只与自己的左右节点交互。实际上我们的DNS服务器确实是如此处理的,例如本机请求查询一个www.abcdefg.com的域名,上海DNS服务器解析不到这个域名,于是提交到中国顶级DNS服务器,如果中国顶级DNS服务器有该域名的记录,则找到该记录,反馈到上海DNS服务器,上海DNS服务器做两件事务处理:一是响应请求者,二是存储该记录,以备其他请求者再次查询,这类似于数据缓存。
1700478986
1700478987
整个场景我们已经清晰,想想看,我们把请求者看成是被观察者,它的行为或属性变更通知了观察者——上海DNS,上海DNS又作为被观察者出现了自己不能处理的行为(行为改变),通知了中国顶级DNS,依次类推,这是不是一个非常标准的触发链?而且还必须是同步的触发,异步触发已经在该场景中失去了意义(读者可以想想为什么)。
1700478988
1700478989
分析了这么多,我们用触发链来模拟DNS的解析过程,如图32-10所示。
1700478990
[
上一页 ]
[ :1.700478941e+09 ]
[
下一页 ]