6.3.1 服务发现概述

简单来说,服务发现就是服务或者应用之间互相定位的过程。不过,服务发现并非新概念,传统的单位应用架构时代也会用到,只不过单体应用的动态性不强,更新和重新发布的频度较低,通常以月甚至年计,基本上不会进行自动伸缩,因此服务发现的概念无须显性强调。在传统的单体应用网络位置发生变化时,由IT运维人员手动更新一下相关的配置文件基本上就能解决问题。但在微服务应用场景中,应用被拆分成众多的小服务,它们按需创建且变动频繁,配置信息基本无法事先写入配置文件中并及时跟踪和反映动态变化,因此服务发现的重要性便随之凸显。

服务发现机制的基本实现,一般是事先部署好一个网络位置较为稳定的服务注册中心(也称为服务总线),服务提供者(服务端)向注册中心注册自己的位置信息,并在变动后及时予以更新,相应地,服务消费者则周期性地从注册中心获取服务提供者的最新位置信息从而“发现”要访问的目标服务资源。复杂的服务发现机制还能够让服务提供者提供其描述信息、状态信息及资源使用信息等,以供消费者事先更为复杂的服务选择逻辑。

实践中,根据服务发现过程的实现方式,服务发现还可分为两种类型:客户端发现和服务端发现。

  • 客户端发现:由客户端到服务注册中心发现其依赖到的服务的相关信息,因此,它需要内置特定的服务发现程序和发现逻辑。
  • 服务端发现:这种方式需要额外用一个称为中央路由器活服务均衡器的组件;服务消费者将请求发往中央路由器或者负载均衡器,由它们负责查询服务注册中心获取服务提供者的位置信息,并将服务消费者的请求转发给服务提供者。

由此可见,服务注册中心是服务发现得以落地的核心组件。事实上,DNS可以算是最为原始的服务发现系统之一,不过在服务动态性很强的场景中,DNS记录的传播速度可能会跟不上服务的变更速度,因此它并适用于微服务环境。另外,传统实践中,常见的服务注册中心是Zookeeper和etcd等分布式键值存储系统,不过,它们只能提供基本的数据存储功能,距离实现完整的服务发现机制还有大量的二次开发任务需要完成。另外,它们更注重数据的一致性,这与有着更高的服务可用性的微服务发现场景中的需求不太相符。

Netflix的Eureka是目前较为流行的服务发现系统之一,它是专门开发用来实现服务发现的系统,以可用性目的为先,可以在多种故障期间保持服务发现和服务注册功能可用,其设计原则遵从”存在少量的错误数据,总比完全不可用要好“。另一个同级别的实现是Consul,它是由HashiCorp供鞥提供的商业产品,不过该公司还提供了一个开源基础版本。它于服务发现的基础功能之外还提供了多数据中心的部署能力等一众出色的特性。

尽管传统的DNS系统不适合于微服务环境中的服务发现,但SkyDNS项目(后来称kubedns)却是一个有趣的实现,它结合了古老的DNS技术和时髦的Go语言、Raft算法,并构建于etcd存储系统之上,为Kubernetes系统实现了一种服务发现机制。Service资源为Kubernetes提供了一个较为稳定的抽象层,这有点类似于服务端发现的方式,于是也就不存在DNS服务的时间窗口的问题。

Kubernetes自1.3版本开始,其用于服务发现的DNS更新为了KubeDNS,而类似的另一个基于较新的DNS的服务发现项目是由CNCF(Cloud Native Computing Foundation)孵化的CoreDNS,它基于Go语言开发,通过串接一组实现DNS功能的插件链进行工作。自Kubernetes1.11版本起,CoreDNS取代kubeDNS称为默认的DNS附件。不过,Kubernetes依然支持使用环境变量进行服务发现。

results matching ""

    No results matching ""