服务发现机制与服务注册中心

作者:禅与计算机程序设计艺术

1.简介

服务发现机制(Service Discovery)和服务注册中心(Service Registry)是微服务架构的一项重要组成部分,通过集中管理服务信息及提供服务目录,使得各个微服务之间能够互相发现、调用,实现跨服务通讯。 本文首先简要介绍了服务发现机制及其基本概念,然后详细阐述了服务发现的两种实现方式——静态配置和动态监听。接着主要介绍了服务注册中心的功能及角色,并提出了几个关键问题,包括服务注册、注销、订阅、反馈等,最后阐述了服务注册中心存在的一些挑战及应对措施。希望通过本文的介绍,读者可以更好地理解服务发现机制和服务注册中心在微服务架构中的作用,并且掌握在实际开发中应该如何选择合适的服务发现和服务注册中心方案,做到服务治理和服务发现的高可用。

2.基本概念术语说明

2.1 服务发现机制

服务发现机制是分布式系统中用于查找网络服务位置的技术。它允许分布式客户端应用根据服务名或其他定位信息找到特定的网络服务端点。

2.1.1 服务发现模式

  • Client/Server模式 在Client/Server模式下,服务发现机制依赖于一个注册服务器或者中心节点,这个节点保存了一份完整的服务列表,当客户端需要请求某个服务时,就向该节点发送请求,获取服务列表,然后从其中选择相应的服务进行调用。这种模式的优点是简单易用,缺点是中心节点宕机后,可能会导致整个系统不可用。
  • DNS模式 在DNS模式下,服务发现机制利用DNS协议解析域名,获得服务地址。DNS域名解析通常由本地域名服务器完成,通过服务发现机制,可以将服务地址记录到本地DNS服务器中,以便客户端应用直接解析。这种模式的优点是中心化程度低,服务提供方可以自主选择服务的IP地址;缺点是解析速度慢、依赖于DNS服务器。
  • API模式 API模式采用发布/订阅模型,客户端应用向服务注册中心订阅感兴趣的服务,注册中心接收到订阅后,会通知所有已注册的客户端应用,然后客户端应用就可以主动连接到服务提供方进行服务调用。这种模式的优点是无需依赖DNS解析,使用起来方便快捷,缺点是没有中心化控制,需要自己实现通知机制。

    2.2 服务注册中心

    服务注册中心(Service Registry),又称服务目录,是分布式系统中的一个独立组件,用于存储和管理服务信息,并提供基于区域、环境、组织甚至业务线的服务查找能力。服务注册中心是微服务架构中的基础设施层,所有的微服务都应该注册到服务注册中心上,并在启动的时候向中心注册自己的服务信息。

    2.3 CAP原理

    CAP原理(Consistency、Availability、Partition Tolerance)是指分布式计算系统中的一个理论,它指的是在分布式系统遇到分区故障时,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)必须同时满足才能保证系统的强壮性。

    C:一致性

    一致性指的是数据更新成功后,多个进程或线程在同一时间读取到的数据都是相同的。通常情况下,一致性需要在系统设计之初就考虑进去。为了保持数据一致性,系统往往采用强一致性的方式,但是这种方式牺牲了性能,因此也被弱一致性取代。

    A:可用性

    可用性表示系统持续提供服务的时间占比。系统出现故障时,只影响一小部分用户,不会造成严重影响。可用性通常要求系统具备冗余容错能力,即保证系统在某些特殊情况下仍然正常工作。

    P:分区容错性

    分区容错性(Partition Tolerance)描述了分布式系统在遇到分区失败时的行为。分区容错性包括两个方面,第一是在同一时间内,系统仍然能对外提供足够的服务;第二是在分区之间通信异常时,系统仍然能够继续运行。为了实现分区容错性,一般需要复制数据到不同的机器上,但这种方式也引入了额外的复杂度。

3.静态配置和动态监听

3.1 静态配置

静态配置就是在配置文件里写死服务地址,如下图所示: 这种方法比较简单粗暴,对于简单的场景来说,可以工作得很好,但是对于微服务数量多、配置繁琐、修改不灵活等问题就不太适用了。

3.2 动态监听

动态监听就是在启动时,自动扫描指定的注册表,把服务地址动态添加到本地路由表,如下图所示: 这种方法更加灵活,可以在运行过程中随时对服务进行新增、删除、修改而不需要重启系统。

4.服务注册中心

服务注册中心负责服务的注册、订阅与查询。服务的注册过程包括服务提供方把自己提供的服务信息写入服务注册中心,并将服务提供方标识符作为key,服务实例的元数据(如ip地址、端口号、服务名称等)作为value进行存储。

服务的订阅过程包括客户端应用订阅指定服务,注册中心返回服务列表,客户端应用可以选择其中一个服务进行调用。

服务的查询过程则包括客户端应用通过服务名称进行服务查询,注册中心返回对应服务的元数据,客户端应用再通过这些元数据进行服务调用。

服务注册中心除了管理服务的生命周期之外,还应该具备良好的扩展性、健壮性和高可用性,让服务发现变得更加的方便、迅速和可靠。

下面我们结合实例来看一下服务注册中心的功能。

4.1 服务注册

当一个新服务上线时,首先要把自己的元数据通过服务注册接口上报给服务注册中心。服务注册接口通常支持HTTP或者gRPC等协议,接受客户端的注册请求。服务注册中心收到注册请求后,先检查该客户端是否已经注册过其他服务,如果注册过,则会先清除之前的服务信息,然后再存储新的服务信息。

比如,客户端A注册了服务foo,请求参数如下:

{
    "serviceName": "foo",
    "host": "localhost",
    "port": 8080
}

服务注册中心收到请求后,会检查客户端A是否已经注册过其他服务,如果注册过,则清除之前的服务信息。然后将客户端A注册的foo服务的信息写入服务注册中心的存储空间,foo服务的元数据包括serviceName、host、port等信息。

4.2 服务注销

当一个服务下线时,首先要向服务注册中心注销自己提供的服务。客户端需要主动发起注销请求,请求的参数包括serviceName。服务注册中心收到请求后,删除存储该服务的元数据。

4.3 服务订阅

客户端通过服务订阅接口订阅服务。服务订阅接口支持HTTP或者gRPC等协议,接受客户端的订阅请求。客户端发起订阅请求时,会将所需订阅的服务名称传入,如:

["foo"]

服务注册中心收到订阅请求后,将返回该服务的所有实例的元数据,如:

[
  {
    "id": "[email protected]:8080",
    "serviceName": "foo",
    "host": "127.0.0.1",
    "port": 8080
  }
]

客户端A收到服务订阅响应后,就可以选择其中一个服务进行调用。

4.4 服务反馈

客户端可以通过服务反馈接口向服务注册中心反馈服务的可用状态。服务注册中心收到客户端反馈的服务可用状态后,可以更新对应的元数据的可用状态。

5.服务注册中心存在的一些挑战及应对措施

5.1 数据一致性

在服务注册中心存储服务元数据时,需要考虑数据一致性的问题。服务注册中心通常采用了分布式事务处理的技术,保证服务元数据的强一致性。但是,由于网络原因、硬件故障、软件错误等因素导致的不稳定情况依然不能完全避免,所以仍然有可能出现服务注册中心的不同节点间的数据不一致情况。

为了解决数据一致性问题,需要在设计服务注册中心时,对服务元数据有明确的约束条件,例如使用消息队列或者数据库事务等手段来确保数据的强一致性。另外,服务注册中心也可以引入缓存层来减少对数据库的访问频率,从而提升系统的整体性能。

5.2 可用性

由于服务注册中心是一个独立的组件,它的可用性直接决定了微服务架构的整体可用性。因此,服务注册中心必须保证高可用,否则将导致微服务架构的瘫痪。

对于服务注册中心来说,一般需要采取以下手段来保证高可用:

  1. 服务注册中心集群部署。部署多个服务注册中心节点,每个节点的容量和流量大小不尽相同,保证服务注册中心的高可用。
  2. 使用消息队列或者MySQL数据库集群来存储服务元数据。这些集群有专门的运维团队进行维护,保证它们的高可用。
  3. 服务注册中心与客户端之间的网络传输采用异步非阻塞的方式。采用异步非阻塞的网络传输方式,可以有效防止客户端卡顿或者网络拥堵引起的服务发现超时,保证服务注册中心的高可用。
  4. 在服务注册中心实现服务健康检测机制。当服务发生故障时,注册中心会及时更新相应的服务信息,使得其他服务可以快速识别故障并重新调配资源。
  5. 提供服务注册中心的监控功能,方便管理员了解系统的运行状况,预测并规避异常,提升系统的可靠性。

以上几种手段可以有效提升服务注册中心的可用性。

5.3 分布式一致性算法

在实现服务注册中心时,需要考虑服务元数据的分布式一致性问题。最常用的分布式一致性算法有Paxos算法和Raft算法。

Paxos算法是一个用于解决分布式系统协调一致性问题的解决方案,它是一种基于消息传递的共识算法。Paxos算法主要用来解决多个节点之间如何就一个值或日志执行决策的问题。在实际工程应用中,可以将Paxos算法分为两类,分别为单一决策类和多值决策类。

单一决策类可以用于服务注册中心的选举场景,例如主节点的选举。这种场景下的典型问题就是分布式锁。多值决策类的场景包括基于Raft算法的分布式日志复制、共享租约等。

两种分布式一致性算法各有利弊。Paxos算法具有较强的正确性,能在不牺牲效率的前提下保证数据的强一致性。但是,实现Paxos算法较复杂,需要考虑很多细节,尤其是在可拓展性和安全性上。

Raft算法相对比较简单,而且实现起来也比较容易。它是一种非常经典的分布式一致性算法,在很多开源框架和软件中都有它的身影。但是,Raft算法不是一种像Paxos一样的原子提交协议,因此其可用性和一致性无法与Paxos媲美。因此,在实际工程应用中,需要结合实际需求,选择合适的分布式一致性算法。

猜你喜欢

转载自blog.csdn.net/universsky2015/article/details/133502524