分布式-服务治理(上)

服务注册与发现

微服务架构的核心机制

在微服务架构下,一个分布式系统通常由多个微服务组成。当用户发起一个请求时,可能需要多个服务协同工作,以此相互配合来维持系统的正常运行。然而,随着业务需求的不断变化,微服务的节点数量可能会动态调整,这就带来了一系列的挑战。

试想一下,一个微服务可能存在多个节点,在需要的时候我们会临时增加或减少该微服务的节点数量。传统的做法是将这些节点的配置信息写死在微服务的配置代码中。当我们动态调整微服务时,就需要手动地去更新配置信息,并且重新启动服务,这样一来就增加了维护成本。

为了解决上述问题,我们需要一个统一管理的平台,让微服务间自动地完成协调治理。当有新增的节点时,能够自动识别并增加到自己的配置;当有挂掉的节点时,微服务能够自动识别并将其从可用列表中删除。服务注册与发现机制就是为此而设计的,微服务的可用列表统一由注册中心维护。通过注册中心,微服务可以动态地获取可用的服务列表。当服务配置更新时,注册中心会将变更推送给相关调用的微服务,无需手动更新,从而降低了维护成本,实现了服务的优雅上下线。

一个完善的服务注册与发现中心应具备以下功能:

  1. 服务的注册与服务查询(最基本)

  2. 服务状态变更通知、服务健康检查、不可用服务剔除

  3. 服务权重配置

服务注册与发现基本流程

服务注册与发现

服务注册

当启动一个服务时,该服务会向注册中心发送自己的服务信息(地址、端口、服务名称等),注册中心将这些信息保存起来,这就是服务注册。

流程步骤

  1. 服务启动:微服务启动时,初始化并配置服务信息。
  2. 注册请求:微服务向注册中心发送注册请求,包含服务名称、IP地址、端口号等信息。
  3. 注册中心处理:注册中心接收到注册请求后,将服务信息存储在服务注册表中。

服务发现

一个服务要调用另外一个服务的节点,于是向注册中心请求所需服务的可用节点信息,这就是服务发现。当服务获取到调用服务的可用节点信息后,通常会将该信息缓存到本地,方便下次使用,同时也能够保证当注册中心挂掉时,不影响当前服务正常调用被调用的服务。

流程步骤

  1. 服务调用请求:调用方服务向注册中心发送服务发现请求,请求所需服务的可用节点信息。
  2. 注册中心响应:注册中心返回可用的服务节点列表,包含服务名称、IP地址、端口号等信息。
  3. 本地缓存:调用方服务将获取到的服务节点信息缓存到本地,方便下次使用。

健康检测

为了保证服务的可用性,注册中心还会通过“心跳机制”来检测服务是否可用。如果服务不可用,注册中心会主动剔除该服务并通知相关服务,更新服务地址信息。

流程步骤

  1. 心跳检测:注册中心定期向微服务发送心跳检测包,微服务在规定时间内响应心跳包。
  2. 服务状态更新:如果注册中心在一定时间内未收到微服务的响应,则认为该服务不可用,并将其从可用列表中剔除。
  3. 状态变更通知:注册中心将服务状态变更通知推送给相关调用的微服务,调用方更新被调用服务地址信息。

总结:服务注册与发现机制通过服务注册、服务发现和健康检测三个核心流程,实现了微服务架构中的动态服务管理和优雅上下线。通过服务注册,微服务向注册中心注册自己的信息;通过服务发现,调用方服务获取被调用服务的可用节点信息;通过健康检测,注册中心确保服务的可用性,并在服务状态变更时通知相关调用方。

配置管理

在微服务架构中,随着业务规模的扩展,服务器节点数量不断增加,导致程序配置的复杂性和管理难度显著提升。传统的配置管理方式逐渐暴露出以下问题:

  1. 配置文件碎片化:随着服务数量的增加,配置文件数量急剧增长,导致配置管理的复杂性增加,难以进行统一管理。
  2. 配置更新效率低下:传统方式下,配置修改后通常需要重启服务器才能生效,这不仅增加了运维成本,还可能导致服务中断。
  3. 配置安全性不足:配置信息通常硬编码在代码库中,容易暴露敏感信息,且难以进行权限控制和审计。

为了应对这些挑战,配置中心(Configuration Center)应运而生。配置中心通过集中化管理微服务的配置信息,提供了一系列高级功能,以提升配置管理的效率和安全性。

配置中心的核心功能

一个完善的配置中心应具备以下核心功能:

  1. 权限控制:配置的修改和发布应设置严格的权限控制机制,确保只有授权人员才能进行相关操作,从而保障配置的安全性和合规性。
  2. 日志记录与审计:配置中心应详细记录所有配置操作的日志,包括修改、发布、回滚等操作,以便于后续的问题排查和审计。
  3. 配置推送机制
    • 推送模式:配置中心主动将配置变更推送给应用服务器,要求服务器与配置中心保持长连接。虽然实现复杂度较高,但能够实现配置的实时更新,适用于对实时性要求较高的场景。
    • 拉取模式:应用服务器主动从配置中心获取最新的配置信息。这种方式实现简单,但实时性较差,适用于对配置更新频率要求不高的场景。
  4. 灰度发布:配置中心应支持配置的灰度发布功能,即只将配置变更推送给部分服务器,以便在不影响整体服务的情况下进行配置验证和测试。
  5. 版本管理与回滚:配置中心应记录所有发布的配置版本,并支持一键回滚到指定版本。这不仅有助于快速恢复配置,还能提供配置变更的历史记录,便于问题追溯和分析。

常见配置中心

在微服务架构中,选择合适的配置中心对于提升系统的可维护性和扩展性至关重要。目前市场上存在多种配置中心解决方案,包括Apollo、Nacos、Kubernetes ConfigMap、Disconf和Spring Cloud Config等。

功能 Apollo Nacos Spring Cloud Config
UI配置界面 无(通过Git操作)
配置实时生效 支持(HTTP长轮询1s内) 支持(HTTP长轮询1s内) 不支持(重启生效,或手动refresh)
版本控制 支持 支持 支持(Git实现)
权限控制 支持 支持 支持(Git实现)
灰度发布 支持 支持 不支持
告警通知 支持 支持 不支持
监听查询 支持 支持 支持
多语言 主流语言,Open API 主流语言,Open API 仅支持Spring应用
多环境 支持 支持 不支持

Apollo和Nacos都是国内公司开源的知名项目,Apollo是携程开源的,Nacos则是阿里开源的。Apollo的配置中心功能更加齐全,而Nacos在一些细微的功能上则略显简单,比如说在Nacos1.1.0版本才支持的灰度发布,但是Nacos可以作为服务注册中心。Spring Cloud Config作为Spring生态组件,可以方便与Spring Cloud体系无缝衔接,但整体的设计比较简单。