微服务架构已经成为中小型企业必备的项目支撑能力,尤其互联网BATJ企业在04年已经非常成熟,在大规模的核心业务实战中总结了很多大规模服务调度与大数据集的处理方案。微服务架构中涉及到很多模块,本文以微服务架构的服务注册与发现产品来讲讲,如何基于DNS做服务发现。
微服务体系中,服务注册与服务发现是两个最核心的模块。业务服务调用订单服务时,需要通过服务发现模块找到订单服务的IP和端口列表,而订单服务的实例在启动时需要把提供服务的IP和端口注册到服务注册中心。一个典型的结构如下图:
目前,流行的注册中心比较多,常见的有zookeeper、ectd、consul、eureka等。服务注册通常有三种:自注册、第三方注册、注册中心主动同步。
在真正发起服务调用前,调用方需要从注册中心拿到相应服务可用的IP和端口列表,即服务发现。服务发现从对应用的侵入性上可以分为两大类:
DNS协议是目前最为通用的协议之一,几乎所有操作系统都会有DNS客户端实现。所以,其天然具有跨语言特性。这也是快速接入微服务体系最快的一个方式。要基于DNS做服务发现,首先注册中心的数据应该可以通过DNS的数据格式暴露出来。让任何系统的DNS 客户端都可以通过DNS协议获取服务列表。
备注:仅仅是服务发现系统提供DNS协议接入
基于DNS的服务发现方式,大致可以归结两类:
独立DNS Server模式的基本架构如下图:
如上图所示,这种架构中,需要独立的DNS服务器。DNS服务器从注册中心获取所有已注册的服务及对应的IP端口列表。调用方Service A 通过DNS查询某个服务下的IP列表,然后发起调用。
这种类型的服务发现方式优缺点分别如下:
DNS Filter模式我们定义为把DNS服务器集成到服务调用方机器或容器里,如下图所示:
这种模式中,首先要保证ServiceA的DNS查询都被拦截到本机的DNS服务器上(127.0.0.1:53),在获取到服务的IP列表后发起调用。由于这种方式把DNS服务器前置到实际调用的机器上,所以它解决了独立DNS服务器模式的单点问题,完全P2P的模式。但由于需要在应用机器上安装DNS服务器,其维护和升级成本较前者高一些。
阿里巴巴早在2014年就开始了基于DNS做服务发现的尝试了,现在已经形成了较为成熟的模式。阿里内部以VIPServer作为注册中心,并开发了DNS Filter,部署在应用容器内。目前已经有超过100w+个机器或容器上安装了DNS Filter,支持了几乎所有REST服务发现。
VIPServer是阿里中间件软负载团队自研的服务注册中心,VIPServer同时支持三种模式的服务注册,并且均有相当规模的应用。除此之外,VIPServer具备如下特性:
出于性能的考虑,我们采用了第二种DNS Filter的服务发现模式。为此,我们单独开发了DNS-F客户端,DNS-F客户端跟应用部署在同一个主机或容器内。其工作原理如下图所示: