什么是服务发现?【举例给您细说】

1,072 阅读6分钟

这是一篇译作,原文搬自《What is Service Discovery? [Explained With Examples]》

原作者译者
Bibin Wilson乡野村夫·鲅气威武

image.png

如果您希望知道什么是服务发现以及它是如何工作的,本教程适合于您。我将通过实际示例为您解释服务发现、它的模式,及所用到工具。

什么是服务发现?

服务发现是一种在网络上自动识别和访问设备及服务的方法。这是分布式系统和微服务架构中常见的模式。因为这种环境中的服务器可能是生命如烟花般灿烂(当然也即短暂),依赖静态IP地址连接到这些系统并不可靠,可能会导致系统故障和错误。

服务发现到底是什么?

让我们通过一个现实世界的例子来了解服务发现。

假设您有一套部署在多台服务器上的应用程序和一个由六台服务器组成的数据库集群。应用程序需要连接到数据库才能存储和检索数据。

为了进行这种连接,应用程序需要知道数据库集群的网络位置(IP地址和端口号)。 一种方法是在应用程序属性中对IP地址和端口号进行硬编码。然而,这种方法有几个缺点:

  1. 不可扩展: 如果数据库集群是完全自动化的,数据库服务器的IP地址可能会在修补或故障转移场景中更改。或者可能向集群添加更多服务器来进行集群扩展。在这种情况下,您需要更新应用程序集群中每台服务器上的应用程序属性。
  2. 容易出错: 如果您输入错误的IP地址或端口号,应用程序将无法连接到数据库。
  3. 僵而不灵: 如果您需要添加或删除具有不同IP地址的数据库节点,则需要更新应用程序代码。
  4. 您可能会为服务器使用DNS节点。但是,如果IP发生变化,您需要手动更新DNS中的IP地址。

因此,应用程序需要一种高效的机制,以便随时访问健康的数据库服务器。

这时,您可以使用服务发现机制。服务发现系统是一种工具,允许服务器/服务注册自己,以及发现其他服务。

在我们的示例中,数据库集群节点将在服务发现系统(服务注册表)中注册,应用程序服务器将使用服务发现系统(服务注册表)来查找数据库服务器的IP地址。

现在让我们看看什么是服务注册表。服务发现的关键组成部分。

服务注册表(Service Registry)

它是一个中心化服务注册表,负责维护可用服务的有关信息。在大多数情况下,它是一个存储“键-值”的数据库。下图显示了名为consul的服务发现工具的服务注册器仪表板。

image.png

下面是它在我们的示例中的工作原理:

  1. 当数据库服务器醒来时,它注册为服务注册表的可用服务。它提供了应用程序的IP地址、端口号和运行状况检查URL(例如:在3306端口上运行的MySQL应用程序)。它通过在数据库节点上运行的代码库或服务发现代理来进行。
  2. 应用程序服务器需要连接到数据库,因此它使用服务发现库/代理通过API/DNS调用来连接到服务注册表,并查询可用的数据库服务器IP。
  3. 由于数据库服务器已经注册了自己,应用程序服务器将能够从服务注册表中检索IP和端口信息,并在其配置中使用它来检索和存储数据。

以下GIF显示了一个在consul服务注册表中进行自我注册的节点/服务的示例。

服务注册表现实世界示例。

如果一个已注册的服务器失效,会发生什么?

因为它对所有与其关联的节点都有一个运行状况检查,因此,如果数据库服务器发生故障,服务注册表将能对其识别。然后,服务注册表将该节点标记为不健康。在应用程序服务器中运行的代理持续监控服务注册表中的变化,从而识别节点故障。因此,应用程序服务器从其配置中剔除了不健康的数据库IP地址。所有这些变化都在几秒钟内发生。

如果注册了新服务器,会发生什么?

工作流程是一样的。新的数据库服务器会自行注册。应用程序服务器通过服务注册表识别它,并将其添加到自己的配置中。

服务发现类型

共有两种类型的服务发现模式,我们来看一下。

1.客户端服务发现模式

在客户端发现模式中,客户端(比如一个程序)负责与服务注册表交互以获取的服务详细信息。

例如,客户端查询服务注册表以获取有关可用后端服务的信息。

在这个模型中,客户端必须在应用程序框架中实现服务发现查询逻辑。例如,如果应用程序服务器想要获取可用的数据库服务器详细信息,应用程序应使用服务发现客户端库实现查询服务来查询服务注册表。

image.png

2.服务器端服务发现模式

在服务器端发现模式中,请求发送到负载均衡器(服务器),负载均衡器连接到服务注册表以获取健康的后端服务器的IP地址。

在这里,服务器组件实现代理或库来查询服务注册表。该模型的一个经典例子是使用服务发现的Nginx负载平衡。在这里,客户端(服务消费者)直接与Nginx负载均衡器会话,负载均衡器查询服务注册表以获取后端服务器列表来调度流量。

下图显示了使用consul的服务侧服务发现。

image.png

如果您知道kubernetes,入口控制器(ingress controller)实现了服务端服务发现。
    

服务发现工具

要实现服务注册表的概念,您需要特定的工具。以下是两个常见的开源服务发现工具\color{green}{开源服务发现工具}

  1. Hashicorp Consul
  2. etcd(主要用于Kubernetes服务发现)

您可以将HTTP REST API、DNS和gRPC协议与这些服务发现工具一起使用。

服务发现实际操作

如果0您想了解服务发现概念,您可以尝试使用consul设置Nginx反向代理配置)

结论

服务发现是开发人员和开发工程师必须知道的概念。大多数分布式系统和微服务架构都实现了服务发现。

一类例子是《Kubernetes》。它严重依赖使用etcd数据存储的服务发现。