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

云原生(Cloud Native)的高阶实践是分布式服务化架构。一个良好的服务化架构,需要良好的服务发现、服务治理、服务编排等核心能力。本文为读者解析网易云的服务治理策略及其典型实践。

网易云微服务架构

在优化了版本控制策略,研发并集成了自动化构建和发布工具,实现“项目工程化”之后,网易云开始了分布式服务化架构的探索,希望解决支撑海量用户及产品高速迭代需求下的软件研发成本高、测试部署维护代价大、扩展性差等问题。

业务模块的独立,自然而然形成了基于 Docker 容器的微服务架构。网易云简化的微服务架构如图 1 所示,包括服务注册与发现、分布式配置管理、负载均衡、服务网关、断路器等模块。

图 1 微服务架构

一个产品通常由多个应用组成,容器只是提供一个应用服务的能力,需要把多个应用组合编排起来才能提供服务。在服务编排上,网易云选择开源的 Kubernetes 。Kubernetes 是自动化编排容器应用的开源平台,这些操作不仅包括部署、调度和节点集群间扩展,还包括服务发现和配置服务等架构支持的基础能力。Kubernetes 对应用层面的关注、对微服务、云原生的支持及其生态,正是网易云所需要的。

网易云服务治理策略

在微服务架构下,随着业务逐渐复杂,服务数量越来越多,引入的问题也越来越复杂。如何在业务发展的同时保障服务的 SLA 和最大化利用机器资源,是摆在网易云面前一个很大的挑战。我们需要一个统一的服务治理机制对所有服务进行统一管控,保障服务正常运行。

服务治理范围覆盖了服务的整个生命周期,从服务建模开始,到开发、测试、审批、发布、运行时管理,以及最后的下线。我们通常说的服务治理主要是指服务运行时的治理,一个好的服务治理框架要遵循“在线治理,实时生效”原则,只有这样才能真正保障服务整体质量。下面介绍服务治理策略在服务运行时的应用。

  1. 服务越来越多,配置项越来越多,利用统一注册中心解决服务发现和配置管理问题。
  2. 服务之间存在多级依赖,靠人工已经无法理清,还要避免潜在的循环依赖问题,我们需要依赖管理机制,支持导出依赖关系图。
  3. 服务的性能数据和健康状态数据是服务治理的重要依据,比如访问量、响应时间、并发数等,因此需要有监控、健康检查和统计服务。
  4. 当一个服务的访问量越来越大,需要对服务进行扩容,然后在客户端进行流量引导和优先级调度。
  5. 面对突发流量,已经无法通过扩容解决问题时,要启用流量控制,甚至服务降级。
  6. 随着业务持续发展,要提前进行容量规划,结合服务监控数据,以确认当前系统容量能否支撑更高水位的压力。
  7. 等越来越多的微服务上线之后,从安全角度看,我们需要实施明确的权限控制策略和服务上下线流程。
  8. 通过一系列的服务治理策略,最终通过数据证明系统对外承诺的 SLA。

网易云典型服务治理实践

弹性扩缩容

基于负载均衡的应用弹性伸缩方案,只要将应用系统设计成无状态,在需要伸缩的时候修改负载均衡代理配置,就可以方便地水平扩容应用系统,提高系统承载能力。

在云原生应用架构里,我们其实有更多的选择。对于无状态服务,配合云平台提供的 AutoScaling 能力,能够快速弹性扩容,实施 DevOps。在这里,弹性扩缩容是一种重要的服务治理手段。网易云选择基于 Kubernetes 的 AutoScaling 机制实现弹性伸缩。

网易云采用 Kubernetes 实现应用管理,而 Kubernetes 的 Horizontal Pod Autoscaler (HPA)组件专门设计用于应用弹性扩容的控制器,它通过定期轮询 Pod 的状态(CPU、内存、磁盘、网络,或者自定义的应用指标),当 Pod 的状态连续达到提前设置的阈值时,就会触发副本控制器,修改其应用副本数量,使得 Pod 的负载重新回归到正常范围之内。如图 2 所示。

图 2 基于 Kubernetes 的弹性扩缩容

例如促销活动服务的应用层是一个无状态应用,当前有两个副本,我们把弹性扩容的 CPU 使用率阈值设置为 50%。但是促销当天涌入的流量远远超过预期,使得两个副本的 CPU 使用率分别达到了 80%以上,HPA 控制器监控到这种变化,于是通知副本控制器将促销活动服务的副本数量升到 4 个。当流量峰值过后,4 个副本的 CPU 使用率慢慢降到 10% 以下,HPA 控制器计算得出两个副本即可满足负载要求,于是通知副本控制器将应用副本数量变为 2。

HPA控制器的副本伸缩算法可以参考Kubernetes文档

熔断机制

微服务架构中,各服务通过服务发现的方式互相依赖,虽然从单个服务看来能获得非常好的隔离性,不会因为某个进程或者服务宕掉对其他服务造成直接影响,但是从业务角度来看,单个服务实例故障还是可能造成业务访问出现问题,轻则影响服务调用方出现延迟和负载上升,重则造成业务整体异常。

比如,一个简单的电商场景,用户通过网站下单购买一件商品,首先将调用订单服务生成一个订单,调用支付网关完成支付,最后调用库存服务将库存量减去。在这一系列服务调用过程中,任何一个子服务因为网络故障或者服务本身异常等情况出现,都会导致用户购物车服务线程阻塞,不仅影响到用户这次购物行为失败,如果此时有大量用户同时访问,还会造成后续请求的失败。这是微服务调用中很容易出现的级联失败。针对这个问题,网易云引入了服务治理中的熔断机制,或者叫断路器模式,断路器在系统架构中的应用如图2所示。

图3 断路器在系统架构中的应用

断路器是一个开关,本意是指电路系统上的一种保护线路电流过载的一种装置,当线路中电流太大或者发生短路时,断路器开关打开,电路切断,防止引起更加严重的后果。引申到微服务治理策略中,断路器的作用就是避免故障或者异常在微服务调用链中蔓延。它的工作机制如图4 所示。

图4 服务治理中的熔断机制

服务调用方在尝试调用远端服务时,同时提供一个 fallback 方法,就是当远端服务出现故障时,调用 fallback 方法,快速返回结果,避免级联效应,使故障隔离。同时,断路器应该需要提供一个阈值开关,当远端服务的调用连续失败次数超过某个阈值时,服务调用方直接调用 fallback 方法,不再请求远端服务。等远端服务恢复后,再恢复正常调用流程。

在一些场景下,网易云借助 Netflix OSS 的 Hystrix 实现断路器。Hystrix 是 Netflix 开源的库,主要提供分布式服务间交互的延时容忍与容错机制,隔离了服务间的访问入口,防止整个链路上某服务调用不通导致系统雪崩,提供 fallback(降级)机制以便增强系统弹性。另外,还提供了服务治理与监控功能。

Hystrix 主要提供以下几个功能。

  • 为服务提供保护,控制延迟和故障。
  • 避免复杂系统的级联故障。
  • 快速失败与高效恢复。
  • 实时监控、报警与操作控制。

代码示例如下。

@Component
public class ShoppingService {
@HystrixCommand(fallbackMethod = "payFail")
public Object pay(Map parameters) {
//远程调用支付服务
return;
}
public Object payFail(Map parameters) {
//支付失败,订单状态改为未支付
return;
}
}

购物服务调用 ShoppingService 的 pay()方法实现支付,支付成功则订单状态置为待发货,若支付过程中支付网关服务出现异常,导致 pay()方法调用失败,ShoppingService 的断路器会调用 payFail()方法实现失败处理,将订单状态改为未支付状态,后续用户可以通过界面选择订单继续支付。如果支付网关服务较长时间无法恢复,当 pay()连续失败次数超过阈值,熔断机制开启,断路器打开,每次对 ShoppingService 的 pay()方法的调用退化为对payFail()方法的调用,直至支付网关服务恢复正常。熔断机制在服务治理中的作用主要体现在对故障的隔离上,避免调用出现链式雪崩。

服务降级

服务降级也是服务治理策略中重要的一环。当业务出现流量峰值,或者系统中某个组成部分出现故障,保证系统整体功能仍然可用,我们可能需要停掉一些不太重要的周边系统,从而保证核心服务的 SLA。比如电商系统在进行大促时,往往会弃车保帅,优先选择停止“猜你喜欢”、“评论”等不那么重要的系统,保障购物车、支付系统可用。在微服务架构里,每个服务无论是服务提供方还是服务调用方,都应该围绕 SLA 制定不同的降级策略。按降级粒度粗细我们可以制定接口降级、功能降级、服务降级。

  • 接口降级:对于非核心接口,设置为直接返回空或异常,可以在高峰期有效减少接口逻辑对资源(CPU、内存、网络 I/O、磁盘 I/O 等)的占用和消耗。
  • 功能降级:对于非核心功能,可以设置该功能直接执行本地逻辑,不做跨服务、跨网络访问。也可以设置降级开关,一键关闭指定功能,保全系统稳定运行。
  • 服务降级:对于非核心服务,可以通过服务治理框架根据错误率或者响应时间自动触发降级策略。

其中,功能降级和服务降级可以通过熔断机制和断路器实现。

本文节选自网易云基础服务架构团队所著《云原生应用架构实践》,有改动。

原文地址:https://www.cnblogs.com/163yun/p/8868432.html

时间: 2024-10-07 22:47:46

网易云原生架构实践之服务治理的相关文章

网易云通讯架构实战

链接:https://pan.baidu.com/s/1Uv3nd_rD-IJfv8sP_CmKCw 提取码:3ea0 复制这段内容后打开百度网盘手机App,操作更方便哦 原文地址:https://www.cnblogs.com/xuexichengxu/p/10498869.html

面试都在问的微服务、RPC、服务治理...一文帮你彻底搞懂!

单体式应用程序 与微服务相对的另一个概念是传统的「单体式应用程序」( Monolithic application ),单体式应用内部包含了所有需要的服务.而且各个服务功能模块有很强的耦合性,也就是相互依赖彼此,很难拆分和扩容. 说在做的各位都写过单体程序,大家都没意见吧?给大家举个栗子,刚开始写代码你写的helloworld程序就是单体程序,一个程序包含所有功能,虽然helloworld功能很简单. 单体应用程序的优点 开发简洁,功能都在单个程序内部,便于软件设计和开发规划. 容易部署,程序单

网易云易盾朱浩齐:视听行业步入强监管和智能时代

2018年,文娱视听行业首先感受到一股监管寒潮,一大批知名泛娱乐产品遭到监管约谈.内容安全成为行业不得不重视的Top问题,视听系统的构建绕不开内容安全,视听行业的从业者也需要越来越关注内容安全.LiveVideoStack邮件采访了国内内容安全领先厂商网易云易盾CTO朱浩齐,分享内容安全的技术现状与未来挑战. LiveVideoStack:请简单介绍自己和负责的工作?和业界其他厂商相比,有什么特别的故事? 朱浩齐:网易云安全(易盾)是网易云旗下的一站式安全服务,脱胎于网易安全部门.我们在过去20

第三章 服务治理:Spring Cloud Eureka

Spring Cloud Eureka是Spring Cloud Netflix 微服务套件中的一部分,它基于Netflix Eureka做了二次封装,主要负责完成微服务架构中的服务治理功能.Spring Cloud 通过为Eureka增加了Spring Boot风格的自动化配置,我们只需通过引入依赖和注解配置就能让Spring Boot构建的微服务应用轻松的与Eureka服务治理体系进行整合. 服务治理: 服务治理可以说是微服务架构中最为核心和基础的模块,主要用来实现各个微服务实例的自动化注册

网易云轻舟微服务在大型快递企业上的应用

"如果不在今年考虑数字化,那么就得在明年:如果不在年初规划好IT建设,那么年底的双十一就可能顶不住,"这已经是业界尤其是电商相关产业的共识.2019年,上云和数字化热潮仍在继续,与电商紧密结合的快递行业已然走在了众多传统产业的前面. 专注"大件快递"市场的德邦快递自2017年启动数字孪生中心以来,每年在数据化方面投入超5亿元.注重信息化建设,以及与网易云等互联网技术公司合作,帮助德邦快递实现了精细化管理,让大件快递跑得更快,实现了规模增长. 应对双十一,云计算让&q

一、服务治理:Spring Cloud Eureka

核心内容: 构建服务注册中心 服务注册于服务发现 Eureka的基础架构 Eureka的服务治理机制 Eureka的配置 服务治理:主要是用来实现各个微服务实例的自动化注册与发现 服务注册:在服务治理框架中,通常会构建一个注册中心,每个服务单元向注册中心登记自己的提供的服务,将主机与端口号.版本号.通信协议等一些信息告诉给注册中心,注册中心按服务名分类组织服务清单. eg: 另外,服务注册中心还需要以心跳的方式去监测清单中的服务是否可用,若不可用需要从服务清单中踢出 服务发现:由于在服务治理框架

《Spring Cloud》学习(一) 服务治理!

原文:http://www.cnblogs.com/crazycheng/p/10826283.html前言:之前网上学习过Spring Cloud,对于工作上需要是足够了,总归对于一些方面一知半解,最近难得有些闲暇时间,有幸读了崔永超先生的<Spring Cloud 微服务实战>,一方面记录下自己的学习历程和读后感,一方面分享下自己对Spring Cloud微服务的一些见解,写下此文. 注意:本文着重于描述Spring Cloud运行的机制和原理部分,不会涉及到过多的代码,不会演示如何搭建注

Spring Cloud(二):服务治理——Spring Cloud Eureka

服务治理是微服务架构中最为核心和基础的模块,主要作用是实现各个微服务实例的自动化注册和发现.Spring Cloud Eureka是Spring Cloud Netflix微服务套件中的一部分,基于Netflix EureKa做了二次封装,主要负责微服务架构中的服务治理功能. Eureka的服务发现包含两大组件,服务端发现组件(Eureka Server)和客户端发现组件(Eureka Client).服务端发现组件也被称为服务注册中心,主要提供了服务的注册功能,客户端发现组件主要用于处理服务的

架构设计:系统间通信(17)——服务治理与Dubbo 中篇(分析)

(接上文) 2-5.设计模式:代理模式和JAVA对代理模式的支持 2-5-1.典型的代理模式 下面这个类图说明了"代理模式"的典型设计设计结构: 典型的代理模式可用一句话进行概括:外部系统/外部模块要调用某个具体业务的实现A,不能直接进行实调用,而要通过一个代理对象进行间接的调用.典型的dialing模式中有四个角色: Subject:业务接口定义.这个业务接口定义相关实现类的行为.事件等特性. RealSubject:您可以看业务定义的真实实现.设计的原则是:无论何种情况下它并不知道