第240724期 - dicovre
什么是服务发现?(Service Discovery)这是一份技术指南关于了解什么是服务发现以及它的工作原理。本文会通过服务发现的模式、工具来解释什么是服务发现。
什么是Service Discovery?
服务发现是一种自动在网络中识别和访问设备或者服务的一种方法。这是一种在分布式系统和微服务架构下的常规模式。因为服务在这种环境下可能是短暂的,而且依靠静态IP去连接这些系统是不可靠的,并且可能会导致系统调用失败或异常。
Service Discovery的真正含义是什么?
下面举一个例子来理解下服务发现。
如果你有一套应用程序部署在多台服务器上,对应的有一套数据库集群部署在多台服务器。而应用程序需要连接数据库才可以正常使用
为了正常建立连接,程序需要知道数据库集群的IP和端口。最常规的方式就是将对应的IP及端口硬编码到程序中,然而这会有一些缺点:
-
- 不可扩展:如果数据库集群是完全自动化的,IP地址会在故障修复的场景中发生变化,或者会有更多的服务会添加到集群中用来扩展集群,在这种情况下,你将会需要更新应用程序来调整连接地址。
-
- 容易出错:如果你输入错误的IP地址或者端口号,那么应用程序将无法连接到数据库
-
- 不灵活:如果需要删除或者添加不同的IP地址或数据库节点,需要修改程序代码
-
- 你可以在服务器上配置本地DNS,但是如果IP发生变化,你依旧需要调整DNS的IP地址
所以,你需要一种有效的机制让应用程序始终访问健康的数据库服务器。
在这里就要用到服务发现,服务发现系统是一种允许服务器或者服务注册自身和发现其它服务的工具
在前面聊到的例子中,数据库集群节点将注册自己到服务发现系统(服务注册表),应用程序的服务器将使用服务发现系统来查找数据库服务器的ip地址。
服务注册中心
它是一个集中式的服务注册表,里面维护可用服务信息,在大多数情况下,它是一个键值存储数据库,下面是consul的仪表表,它就是一个服务发现工具。
以下是它在我们的示例中的工作原理。
-
- 当数据库服务器启动时,它会将自身注册为服务注册表中的可用服务。它提供应用程序的 IP 地址、端口号和健康检查 URL(例如:在 3306 上运行的 MySQL 应用程序)。它通过在数据库节点上运行的代码库或服务发现代理来发生。
-
- 应用程序服务器需要连接到数据库,因此它使用服务发现库/代理通过 API/DNS 调用连接到服务注册表并查询可用的数据库服务器 IP。
-
- 由于数据库服务器已经自行注册,因此应用程序服务器将能够从服务注册表检索 IP 和端口信息,并在其配置中使用它来检索和存储数据。
下面的 gif 显示了 consul 服务注册表中自注册节点/服务的示例。
如果注册服务器出现故障会发生什么?
如果数据库服务器发生故障,服务注册表会对其进行识别,因为它具有与每个节点关联的运行状况检查。
然后,服务注册表将该节点标记为不健康。在应用程序服务器中运行的代理持续监视服务注册表中的更改,从而识别节点故障。
结果,应用程序服务器从其配置中删除了不健康的数据库 IP。所有这些变化都在几秒钟内发生。
如果注册新服务器会发生什么?
工作流程是相同的。新的数据库服务器自行注册。应用程序服务器通过服务注册表识别它并将其添加到其配置中。
服务发现的类型
客户端服务发现模式
在客户端发现模式中,客户端(例如应用程序)负责与服务注册表交互以获取服务详细信息。
例如,客户端查询服务注册表以获取有关可用后端服务的信息。
在此模型中,客户端必须在应用程序框架中实现服务发现查询逻辑。例如,如果应用程序服务器想要获取可用的数据库服务器详细信息,则应用程序应该使用服务发现客户端库来查询服务注册表来实现查询。
服务器端服务发现模式
在服务器端发现模式中,请求发送到负载均衡器(服务器),负载均衡器连接到服务注册表以获取健康的后端服务器的 IP 地址。
这里服务器组件实现代理或库来查询服务注册表。该模型的一个经典示例是使用服务发现的 Nginx 负载平衡。这里,客户端(服务消费者)直接与 Nginx 负载均衡器通信,负载均衡器查询服务注册表以获取用于路由流量的后端服务器列表。
下图显示了使用 consul 的服务端服务发现。
服务发现工具
要实现服务注册表的概念,您需要特定的工具。以下是两种常见的开源服务发现工具。
- Hashicorp Consul
- etcd
- zookeeper
- nacos
- eurake
您可以将 HTTP REST API、DNS 和 gRPC 协议与这些服务发现工具结合使用。
服务发现实践
如果您想掌握服务发现概念,可以尝试使用 consul 设置 Nginx 反向代理配置。
总结
服务发现是开发人员和 DevOps 工程师必须了解的概念。大多数分布式系统和微服务架构都实现了服务发现。
Kubernetes 就是一类示例。它严重依赖于使用 etcd 数据存储的服务发现。
翻译自:https://devopscube.com/service-discovery-explained/