1.单机房内部架构:
假设有一个单机房架构服务于某互联网社交应用Friendy.并为用户提供Web端和移动客户端两种使用途径.各角色的功能如下.
1).DNS服务器负责将用户访问的Friendy的域名映射为公网IP地址(或称为整个机房的入口IP地址).然后用户请求就可以通过IP协议进入机房.
2).LVS提供对外的公网IP地址作为机房的入口.同时作为四层负载均衡器将用户请求分发到Nginx集群.
3).Nginx作为七层负载均衡器.根据HTTP(S)请求的协议头或URL路径规则将用户请求转发到对应的业务HTTP服务器.
4).业务服务器的HTTP服务器真正处理用户请求.根据不同的HTTP URL向RPC服务发送业务逻辑处理请求.
5).业务服务层的RPC服务执行核心业务逻辑.如果业务逻辑涉及读/写数据.那么它会进一步访问数据层.如果业务逻辑涉及与其它RPC服务的交互.那么它也会调用其他RPC服务.
6).存储层是所有存储系统的集合.包括分布式缓存 关系型数据库 NoSql数据库等.分布式缓存提供数据缓存.用于应对高并发的读请求访问.关系型数据库作为持久化存储保存用户数据.常见的关系型数据库包括MySql SqlLite SqlServer等.NoSql数据库是一个大类.被应用于关系型数据库无法发挥作用的场景.
7).服务发现负责保存每个服务的动态访问地址列表.以便其他服务可以快速查找到某服务的访问地址.其功能与DNS相似.
8).消息中间件作为常用的研发中间件.用于请求异步执行 服务间解耦 请求削峰填谷.

DNS:
客户端启动时要做的第一件事就是通过互联网与机房建立连接.然后用户才可以在客户端与后台服务器进行网络通信.目前在计算机中应用比较广泛的网络通信协议是TCP/IP.它的通信基础是IP地址.因为IP地址有如下两个功能.
标识设备:
接入网络的设备必须有一个独立无二的IP地址.这样才能唯一标识一个网络目标.
网络寻址:
将数据包从一个网络设备发送到另一个网络设备.需要携带目标网络设备的IP地址.通过TCP/IP中的IP路由寻址功能.数据包最终可以到达目标网络设备.
DNS意义:
DNS是互联网中的核心服务.它维护域名与对应IP地址的映射关系.并提供将域名翻译为IP地址的域名解析功能.DNS在互联网中有非常广泛的应用.为用户和互联网公司带来了很多遍历.
1.可以创建简单 便于用户记忆的域名并注册到DNS服务器.用户仅需要输入域名就能访问对应的网站.
2.通过维护域名与多个IP的映射关系.DNS可以将针对同一个域名的不同用户解析到不同的IP地址.从而缓解单一后台服务器的资源压力.
3.互联网公司因架构升级 网络改造等需要变更机房公网IP地址时.仅需要DNS服务器中重新配置最新的IP地址.而不会对用户造成任何干扰.
4.基于DNS可以实现灵活的负载均衡策略.比如DNS服务器可以将对IP地址进行监测.如果发现机房某公网IP地址对应的服务器宕机.那么DNS服务器可以将这个IP地址及时摘除.防止用户无法访问后台.
域名结构:
如图所示.域名采用了层次化的树形结构来命名.树的顶端节点为根.根的下一层称为顶级域名.指的是域名的后缀部分.如常见的.com .net等通用域名或者.cn .us等国家域.顶级的域名下一层是二级域名.指的是域名的倒数第二部分.一般表示域名注册人或主体所使用的网络名称.如google.com apple.com.二级域名的下一层是三级域名.指的是域名的倒数第三部分.表示二级域名的子域名.实际上.域名可能还包括四级域名或者五级域名等.它们的含义根据上文类推.每一级域名控制下一级域名的分配.

域名服务器:
1.根域名服务器(根DNS服务器):
根域名服务器是全球互联网的中枢神经.它负责互联网顶级域名的解析.即它掌握这全部顶级域名的名称与IP的映射关系.目前全球仅有13台IPv4根域名服务器.其中主根域名服务器部署在美国.其余12台辅根域名服务器有9台部署在美国 2台部署在欧洲 1台部署在日本.根域名服务器由美国政府授权的互联网名称与数字地址分配机构统一管理.
2.顶级域名服务器(顶级DNS服务器):
顶级域名服务器负责管理在每个顶级域名下注册的二级域名解析工作.即它可以根据二级域名寻找到二级域名服务器的IP地址.顶级域名服务器就相当于一个朝代的封疆大吏.
3.权威域名服务器(权威DNS服务器):
权威域名服务器负责对特定的域名进行解析.它管理顶级域名下的二级域名 三级域名 四级域名等服务器.从名字中的权威可以看出.权威域名服务器最终决定了一个域名到底应该被解析成哪个IP地址.它是DNS最核心的部分.
每个域名对应的权威域名服务器都可能不同.每个权威域名服务器仅可以解析它负责的域名.比如负责google.com域名的权威域名服务器无法解析apple.com.大型互联网公司一般会自建权威域名服务器.而中小型企业一般会将域名托管给知名的权威域名服务商.
4.本地域名服务器(本地DNS服务器):
本地域名服务器不属于域名层次服务器中的任何一层.但是它对DNS非常重要.相当于域名解析的缓存.任何一台主机在进行网络地址配置时.都会配置一台域名服务器作为本地域名服务器.它是主机在进行域名查询时首先要查询的域名服务器.本地域名服务器一般由网络运营商提供.它作为主机访问网络时域名解析的总代理.会将域名解析结果缓存到本地.以便加速主机后面的域名解析过程.
域名解析过程:
域名解析一般采用递归查询的方式执行.一个完整的域名解析过程如图.

1.当客户端访问某个域名时.会现在设备的本地缓存查找是否有此域名对应的IP地址.本地缓存包括浏览器缓存和计算机系统Hosts文件DNS缓存.
2.如果本地缓存中没有对应的IP地址,则客户端向本地域名服务器发起域名解析请求.如果本地域名服务器保存了域名对应的IP地址.则可以直接返回.否则.本地域名服务器作为客户端的全权代理.递归的完成域名解析.
3.本地域名服务器先向根域名服务器发起域名解析请求.根域名服务器收到请求后.会根据所要查询的域名的后缀将所对应的顶级域名服务器(如.com)地址返回给本地域名服务器.
4.本地域名服务器根据返回结果向所对应的顶级域名服务器发起查询请求.顶级域名服务器会先查看自己的缓存中是否有此域名的解析记录.如果有.则将IP地址解析结果返回给本地域名服务器.本地域名服务器再将其返还给客户端.域名解析完成.而如果顶级域名服务器的缓存中没有解析记录.则将域名对应的权威域名服务器地址返回给本地域名服务器.
5.本地域名服务器继续向权威域名服务器发起域名解析请求.权威域名服务器最终将与域名关联的IP地址返回给本地域名服务器.本地域名服务器再将返回给客户端.域名解析完成.
一旦本地域名服务器获得域名解析记录.就会在本地进行记录缓存.以便下次客户端在向它查询同一个域名时可以直接获得的结果.而不用再进行询问了.域名解析会包含如下数据.
生存周期(TTL):表示这条记录在本地域名服务器中被缓存的时长.
协议类型(Class):一般表示为IN.表示因特网.
记录类型(Type):A表示IPv4地址.AAAA表示IPv6地址.
记录数据(Rdata):与域名关联的地址信息.
HTTP DNS:
DNS问题:
域名解析需要进行递归查询.这势必会带来更高的访问延迟.在理想的情况下.DNS解析只需要几毫秒或者几十毫秒就完成了.实际中经常有1s以上的情况出现.
由于本地域名服务器是分地区 分运营商的.不同运营商实现的DNS解析策略不同.而且.由于权威域名服务器获取的是本地域名服务器的IP地址.而非客户端的IP地址.所以在定位客户端地理位置时不一定准确.最终域名解析得到的IP地址对于客户端而言可能不是距离最近 最优的访问节点.更有甚者.某些运营商为了节约资源.会直接将域名解析请求转发到其他运营商本地域名服务器(即域名转发).这样做的后果就是用户得到了与其他网络运营商不相符的IP地址.用户访问网络请求变慢.
更重要的是DNS劫持问题.DNS劫持是一种互联网攻击方式.通过干预域名服务器把域名解析到错误的IP地址上.以达到用户无法访问目标网站或恶意网站的目的.很多知名的互联网公司备受DNS劫持的困扰.运营商可能基于本地域名服务器做DNS劫持.黑客可能篡改计算机的Hosts文件做DNS做劫持.
HTTP DNS的原理:
HTTP DNS是基于HTTP.具有DNS解析能力的网络服务.HTTP DNS的原理非常简单.
1).客户端指定HTTP DNS服务器的IP地址(如5.5.5.5).使用HTTP调用域名解析接口/d.并传入待解析的域名和客户端的IP地址.HTTP DNS服务器负责向权威DNS服务器发起域名解析请求.并将最优IP地址返回.
2).客户端获取到域名IP地址后.直接向此IP地址发送业务协议请求.如果客户端需要访问业务请求go.friendy.com/feed.则在HTTP header中指定Host字段为此IP地址即可.
需要注意的是.HTTP DNS服务器不通过域名提供服务(否则又需要解析域名).只通过一个固定的IP地址提供服务.实际上.HTTP DNS服务商会采用如BGP(边界网关协议)等手段让这个IP地址在全国各地都能做到就近访问.以腾讯云HTTP DNS产品为实例.它接入了BGP Anycast网络架构.与全国最主要的17个运营商建立了BGP互联.确保各个运营商用户都能快速访问到HTTP DNS服务器.同时.腾讯云在多个数据中心部署了多个HTTP DNS服务节点.任意节点发生故障均可无缝切换到备用节点.保证了HTTP DNS服务的高可用.
HTTP DNS只是将域名解析协议由DNS协议换成了HTTP.原理并不复杂.但是相较于DNS.有如下好处.
1.降低域名解析延迟:
通过直接访问HTTP DNS服务器.缩短了域名解析链路.不在需要递归查询.
2.防止域名劫持:
将域名解析请求直接通过IP地址发送值HTTP DNS服务器.绕过运营商本地DNS服务器.避免了域名劫持问题.
3.调度精准性更高:
HTTP DNS服务器获取的真实客户端的IP地址.而不是本地DNS服务器的IP地址.即能够基于精确的客户端位置 运营商信息.将域名解析到更精准的 距离更加的IP地址.让客户端就近接入后台服务节点.
4.快速生效:
当与域名关联的IP地址发生变更时.HTTP DNS服务不受传统DNS技术多级缓存的影响.域名更新能够更快的覆盖到全量客户端.
HTTP DNS实践:
虽然HTTP DNS有诸多优势.但是并不能认为它可以完全替代DNS.鉴于域名解析的重要性.客户端网络SDK在实现接入机房的逻辑时应该设计足够强大的容灾策略.尽力保证域名解析的重要性.
1.客户端使用HTTP DNS尝试解析域名.
2.如果HTTP DNS服务器返回空数据或者网络错误.那么客户端继续向本地DNS服务器发起域名解析请求.即降级到使用DNS技术.
3.如果DNS解析也遭遇失败.那么客户端将直接使用预留的域名兜底IP地址作为域名解析结果.可以通过客户端约定写死或服务端下发配置的方式为业务核心域名设置对应的兜底IP地址.访问兜底IP地址意味着可能增加用户请求延迟.但是至少能保证用户不会被域名解析挡在门外.
策略:
1.安全策略:
HTTP DNS是基于HTTP的.为了保证数据安全.可以进一步使用HTTPS.
2.IP地址选取策略:
HTTP DNS服务可以将最优IP地址按照顺序多个下发.客户端默认选择第一个IP地址优先校验连通性.如果连通性不佳.则在选取下一个IP地址.
3.批量拉取策略:
在客户端应用冷启动或网络切换(如将Wi-Fi切换到蜂窝网络)时.客户端自动批量拉取域名和IP地址列表的映射数据并缓存.以便在后续请求中使用.预期提升精准调度能力和域名解析性能.
语雀地址www.yuque.com/itbosunmian...?
《Go.》 密码:xbkk 欢迎大家访问.提意见.