网易云原生架构实践之服务治理

网易云微服务架构

在优化版本控制策略并成功研发和集成自动化构建与发布工具,实现“项目工程化”后,网易云开始探索分布式服务化架构。此举旨在应对海量用户需求及产品快速迭代下的软件研发高成本、测试部署维护复杂性和扩展性不足等问题。

随着业务模块逐步独立,网易云自然过渡到基于 Docker 容器的微服务架构。其简化后的微服务架构包括多个关键模块,如服务注册与发现、分布式配置管理、负载均衡、服务网关以及断路器等(参见图 1)。

一个产品通常由多个应用组成,而容器只是为单个应用提供服务的能力。要实现完整的服务,需要将这些应用进行组合和编排。在服务编排方面,网易云选择了开源平台 Kubernetes。

Kubernetes 是一个专注于容器应用自动化编排的开源平台,不仅可以处理部署、调度、跨节点集群的扩展,还提供服务发现和配置管理等基础架构能力。Kubernetes 对应用层的深度支持、对微服务与云原生架构的良好兼容性以及其丰富的生态系统,正是满足网易云需求的关键所在。

网易云服务治理策略

在微服务架构下,随着业务的日益复杂和服务数量的不断增加,问题也随之变得更加棘手。如何在业务发展过程中,既保障服务的 SLA,又最大化地利用机器资源,成为网易云面临的一大挑战。这需要引入统一的服务治理机制,对所有服务进行集中管理,确保服务的稳定运行。

服务治理涵盖了服务的整个生命周期,包括从服务建模、开发、测试、审批、发布、运行时管理到最终的下线阶段。然而,服务治理的核心在于运行时治理。一个优秀的服务治理框架应遵循“在线治理,实时生效”的原则,以确保服务质量的整体提升。以下是服务治理策略在运行时的具体应用:

  1. 服务发现和配置管理
    随着服务数量和配置项的增加,利用统一的注册中心解决服务发现与配置管理问题,成为必要手段。
  2. 依赖关系管理
    服务之间往往存在多级依赖,手动处理已难以胜任,且需要避免潜在的循环依赖问题。为此,引入依赖管理机制,并支持导出依赖关系图,以便直观展示服务之间的关联。
  3. 监控与健康检查
    服务的性能数据和健康状态(如访问量、响应时间、并发数等)是服务治理的重要依据,因此需要部署完善的监控、健康检查和统计工具,为决策提供支持。
  4. 动态扩容与流量调度
    当某个服务访问量激增时,需要对其进行动态扩容,并在客户端实施流量引导和优先级调度。
  5. 流量控制与服务降级
    在突发流量超出扩容能力的情况下,应启用流量控制策略,必要时执行服务降级以保护系统整体稳定性。
  6. 容量规划
    随着业务的持续增长,应结合监控数据提前进行容量规划,确保系统具备足够的容量应对更高的流量压力。
  7. 安全与流程管理
    随着微服务数量的增加,从安全角度出发,需要制定清晰的权限控制策略,并规范服务的上下线流程。

通过这些全面的服务治理策略,能够有效保障系统的稳定性和性能,并通过数据验证对外承诺的 SLA 达成情况。

网易云典型服务治理实践

弹性扩缩容

基于负载均衡的弹性伸缩方案,只需将应用系统设计为无状态,在需要扩展或缩减时,通过修改负载均衡代理的配置即可轻松实现水平扩容,从而提升系统的承载能力。

在云原生应用架构中,我们拥有更多选择。对于无状态服务,结合云平台提供的 AutoScaling 功能,可以快速实现弹性扩容,同时支持 DevOps 流程。因此,弹性伸缩也成为服务治理中的关键手段之一。网易云选择通过 Kubernetes 的 AutoScaling 机制来实现这一功能。

网易云利用 Kubernetes 进行应用管理,其中 Horizontal Pod Autoscaler(HPA)组件专为应用弹性扩容设计。HPA 通过定期轮询 Pod 的运行状态(如 CPU、内存、磁盘、网络,或自定义的应用指标),当 Pod 的某项状态持续达到预设的阈值时,HPA 会触发副本控制器调整应用副本数量,使 Pod 的负载恢复到正常范围。如图 2 所示,这一机制能够高效保障系统的平稳运行和资源的合理分配。

例如,促销活动服务的应用层是一个无状态应用,初始部署了两个副本,弹性扩容的 CPU 使用率阈值设置为 50%。在促销当天,访问流量远超预期,导致两个副本的 CPU 使用率均超过 80%。HPA 控制器检测到这一变化后,向副本控制器发出指令,将促销活动服务的副本数量扩展至 4 个,以应对突增的流量。

随着流量高峰逐渐退去,4 个副本的 CPU 使用率逐步降至 10% 以下。此时,HPA 控制器计算后发现,仅需两个副本即可满足当前负载需求,于是再次通知副本控制器,将应用副本数量缩减回 2 个。

熔断机制

在微服务架构中,各服务通过服务发现实现相互依赖。尽管从单个服务的角度看,这种架构提供了良好的隔离性,避免某个进程或服务宕机直接影响其他服务,但从业务整体来看,单个服务实例的故障仍可能导致业务访问出现问题。轻则引起调用方服务延迟和负载增加,重则可能导致业务整体异常。

以一个简单的电商场景为例:用户通过网站下单购买商品时,系统会先调用订单服务生成订单,然后通过支付网关完成支付,最后调用库存服务扣减库存。在这一系列服务调用中,如果任何一个子服务因网络故障或服务异常发生问题,都会导致用户购物车服务线程阻塞。不仅会造成该用户此次购物失败,如果此时访问量较大,还可能引发后续请求的失败,从而形成级联故障。

为了解决这一问题,网易云在服务治理中引入了熔断机制(或称断路器模式)。断路器的设计可以有效防止单个服务故障引发全局性影响,其在系统架构中的应用如图 2 所示。

断路器是一种开关装置,最初用于电路系统中,用来保护线路免受过载或短路的影响。当线路中的电流过大或发生短路时,断路器会自动切断电路,从而防止更严重的后果发生。将这一概念引入到微服务治理中,断路器的作用在于防止故障或异常在微服务调用链中扩散。

在微服务治理策略中,断路器通过监控服务的调用状态,当检测到服务异常或负载过高时,会触发保护机制,切断对问题服务的调用,从而减少对整体系统的影响。其具体工作原理如图 4 所示。

在服务调用过程中,为了防止级联效应,调用方通常会提供一个 fallback 方法,作为远端服务出现故障时的备选方案。当远端服务不可用时,调用方可以立即执行 fallback 方法并快速返回结果,从而实现故障隔离。此外,断路器还设置了一个 阈值开关:当远端服务的调用连续失败次数超过预设阈值时,调用方直接执行 fallback 方法,而不再尝试请求远端服务。只有当远端服务恢复正常后,系统才会恢复原有的调用流程。

在某些场景下,网易云使用 Netflix OSS 的 Hystrix 来实现断路器功能。Hystrix 是 Netflix 开源的一个库,专注于分布式服务间交互的延迟容忍和容错管理。它通过隔离服务访问入口,防止因单个服务故障导致整个链路瘫痪,并提供 fallback(降级)机制以提升系统弹性。此外,Hystrix 还具备服务治理和实时监控功能。

Hystrix 的主要功能包括:

  1. 服务保护:通过控制延迟和故障,保护服务的稳定性。
  2. 防止级联故障:避免复杂系统中因某个服务失败引发的连锁反应。
  3. 快速失败与高效恢复:在检测到故障时迅速响应,并在服务恢复后快速恢复调用流程。
  4. 实时监控和操作:提供实时数据监控、报警和操作控制能力,便于系统管理和优化。
    @Component 
    public class ShoppingService { 
    @HystrixCommand(fallbackMethod = "payFail") 
    public Object pay(Map<string object=""> parameters) { 
    // 远程调用支付服务 
    return; 
    } 
    public Object payFail(Map<string object=""> parameters) {  
    // 支付失败,订单状态改为未支付 
    return; 
    } 
    }</string>,></string>,>

在购物服务中,调用 ShoppingService payFail() 方法进行故障处理,将订单状态置为“未支付”,允许用户稍后通过界面重新尝试支付。

如果支付网关服务长时间无法恢复,当 pay() 方法的调用。

熔断机制在服务治理中的核心作用是实现故障隔离,防止因服务调用失败引发的链式雪崩,从而保障系统整体的稳定性。

服务降级

服务降级是服务治理中不可或缺的一项策略。当系统面临流量高峰或某些组件出现故障时,为了确保整体功能的可用性,可能需要停用一些次要的周边系统,以优先保障核心服务的 SLA。例如,在电商系统的大促活动中,通常会采取“弃车保帅”的策略,优先停用“猜你喜欢”或“评论”等次要功能,确保购物车和支付系统能够正常运行。在微服务架构中,无论是服务的提供方还是调用方,都应围绕 SLA 制定针对性的降级策略。根据粒度的不同,降级策略可分为接口降级、功能降级和服务降级。

  • 接口降级:针对非核心接口,可直接返回空数据或异常信息,从而在高峰期减少接口逻辑对系统资源(如 CPU、内存、网络 I/O、磁盘 I/O 等)的占用,提升系统的抗压能力。
  • 功能降级:对于非核心功能,可将其调整为执行本地逻辑,避免跨服务或跨网络调用。此外,还可以设计降级开关,通过一键操作关闭特定功能,确保系统的稳定性。
9