解耦的艺术_通过中间层映射实现解耦

文章目录

  • Pre
  • 概述
  • 案例: DNS的解耦设计
  • 案例: CDN的解耦设计

解耦的艺术_通过中间层映射实现解耦_第1张图片

Pre

解耦的艺术_通过DPI依赖倒置实现解耦


概述

“计算机中的任何问题,都可以通过加一层来解决”,这句话体现了中间层映射的设计理念。如图所示,当A对B有依赖时,A不要直接依赖B,而是抽象一个中间层,让A依赖中间层,再由中间层映射到B,这样当B改变时,不用修改A,只需调整中间层的映射关系.

所以一种有效的解耦方式是通过引入中间层来进行模块之间的映射。中间层充当一个调度器的角色,它负责在不同模块之间传递请求和数据,从而避免了直接依赖的情况。

解耦的艺术_通过中间层映射实现解耦_第2张图片


案例: DNS的解耦设计

在DNS的设计中,通过中间层的映射机制,我们可以实现解耦。例如,客户端不直接依赖于具体的IP地址,而是依赖于一个中间的命名服务(如DNS),它可以动态地将域名映射到不同的服务器。这种设计使得我们可以更灵活地调整后端服务器而不影响客户端

客户端 -> DNS -> 服务提供商

在域名服务器(Domain Name System, DNS)的设计中,中间层映射表现为Naming解析动态绑定

+--------------------+    +---------------------+
|    客户端 (Client)  |    |      DNS (Name)      |
+--------------------+    +---------------------+
          |                        |
          v                        v
  查询域名 -> 返回服务提供商 -> 客户端访问服务提供商

客户端并不直接通过IP地址来访问Provider#A或Provider#B,而是先询问Naming服务,并依据返回的服务列表,再访问Provider#A或Provider#B。如果某个Provider发生故障,那么可以替换转移到其他的Provider上。出于性能考虑,我们也可以在客户端把Naming的结果缓存起来,并配一个缓存更新机制。

解耦的艺术_通过中间层映射实现解耦_第3张图片

基于ZooKeeper的应用层名字服务在思想上与DNS类似,不同的是,它基于TCP长链接来实现Server Push,可及时刷新服务列表。

Naming解析动态绑定的解耦,体现在使用方把依赖的对象或网络进程抽象为一个名字,名字代表的具体服务提供者,通过Lookup机制返回。这样一来,如果提供者有变化,只需要改变Lookup的结果,无须改变使用方代码


案例: CDN的解耦设计

CDN(内容分发网络)通过进一步抽象域名和具体服务提供商之间的映射,增强了解耦。我们通过CNAME记录将一个域名映射到CDN服务提供商的域名,从而使得客户端不需要关心具体的服务提供商,减少了耦合。

DNS解开了域名和服务器IP之间的耦合,而CNAME解开了域名和CDN提供商之间的耦合。

客户端 -> DNS -> CDN -> 服务提供商

在CDN(内容分发网络)中,CNAME记录的使用也体现了中间层映射的解耦设计。

通过CNAME,域名指向的是一个CDN提供商的子域名,而不是直接指向某个服务器。客户端的访问请求通过DNS解析中介层,到达最近的CDN节点,而不需要关心具体的服务器地址。这种方式让CDN服务在不影响客户端代码的情况下进行切换,达到了“零侵入”的效果。

+--------------------+    +---------------------+    +------------------------+
|    客户端 (Client)  |    |       DNS            |    |   CDN (Proxy)          |
+--------------------+    +---------------------+    +------------------------+
          |                        |                           |
          v                        v                           v
    查询域名 -> 返回CNAME -> 映射到CDN -> 请求转发到服务提供商

举例

比如,运营商公司cdnprovider.com需要给www.xx.org提供CDN服务时,因为CNAME的存在,使得CDN服务完全是零侵入,不需要修改任何一段代码,只需要在域名服务商那里修改www.xx.org的域名解析,这个操作代表www.xx.org同意cdnprovider.com为他们提供CDN服务

解耦的艺术_通过中间层映射实现解耦_第4张图片

  • (1)客户访问www.xx.org,访问本地DNS。
  • (2)本地DNS向DNS服务器发送已收到域名解析请求。
  • (3)DNS服务器返回CNAME指向www.xx.org.cdnprovider.com。
  • (4)本地DNS向CDN服务提供的DNS调度服务器发送域名解析请求。
  • (5)CDN的DNS调度服务器返回离客户最近的CDN节点服务器IP:2.2.2.2。
  • (6)本地DNS返回给客户端IP地址:2.2.2.2。
  • (7)客户端访问IP地址为2.2.2.2的CDN节点。
  • (8)CDN节点返回客户请求数据,如果CDN上没有客户请求的数据,则回源到www.xx.org获取数据。

正是基于Naming解析动态绑定实现了解耦,这种无侵入的CDN才得以实现。同理,除了CDN,恶意流量清洗、灰度发布、性能分析等都可以采用这种方式实现零侵入插拔。

解耦的艺术_通过中间层映射实现解耦_第5张图片

你可能感兴趣的:(【架构思维】,中间层映射,解耦)