《云计算与虚拟化技术丛书 Service Mesh实战》—1Service Mesh简介
第1章
Service Mesh简介
在正式介绍Linkerd之前,我们将通过一章的内容了解一下Service Mesh的基本概念:它是如何产生的?能帮助解决微服务架构中什么样的问题?业界已经提供哪些Service Mesh产品?基于本章的介绍,有助于读者理解后续章节内容。
1.1 微服务架构面临的一些挑战
近年来,微服务架构随着云计算技术的快速发展成为许多IT公司开发人员非常追捧和认可的一种架构设计,最主要的原因是微服务架构解决或避免了传统单体架构所面临的一些问题,例如下面这些。
单体应用代码库庞大,不易于理解和修改,尤其是对新人显得更加明显。
持续部署困难,由于单体应用各组件间依赖性强,只要其中任何一个组件发生更改,将重新部署整个应用,而频繁的部署将增加服务宕机的风险,因此频繁地进行部署几乎不可能。
扩展应用困难,单体应用只能从一个维度进行扩展,即很容易通过增加实例副本提供处理能力。另一方面,单体应用各个组件对资源的使用情况需求不同,一些是CPU密集型,另一些是内存密集型,但是不能独立地扩展单个组件。
阻碍快速开发,随着公司业务的发展,单体服务框架变得更加庞大,更多的部门将会参与系统的开发,但是各个部门又不能独立开发、维护相应的模块,即使其中一个部门完成相应的更新,仍然不能上线,因此需要花费更多时间在部门间协调和统一。还有,需要增加新的功能时,单体应用最初的设计限制开发人员灵活选择开发语言、工具等,导致新功能上线慢。
迫使开发人员长期专注于一种技术栈,由于单体应用本身设计的原因,后期引入新的技术栈需要遵循最开始的设计,因此存在非常大的局限性、挑战性,否则可能需要重写整个框架。
随着业务的发展,传统单体应用的问题越来越严重,解决和避免这些问题非常必要,而微服务架构正好可以很好地解决或避免部分问题,因此,开发人员也非常乐于拥抱微服务框架,逐渐将传统的单体应用拆分成几十或者几百,甚至更多的微服务,如图1-1所示。还有,云计算技术的快速发展比如容器技术使得开发和落地微服务更加便捷,也使得微服务框架成为业界非常热门的开发框架。
图1-1 单体应用和微服务
我们暂且不管拆分过程的复杂性及长期性,而重点考虑拆分后由多个微服务构建的复杂系统,系统中各个微服务之间彼此通过网络进行通信,很好地解决了上述问题。但是,微服务是一枚万能银弹吗?拆分成微服务后就万事大吉了吗?很显然,这是不可能的。可以这么说,微服务架构一方面收之桑榆,另一方面又失之东隅,优点与缺点、得与失总是伴随而生。其中最大的挑战便是如何以标准化的方式管理微服务以及如何保证复杂网络环境中微服务间的可靠通信,确保整个系统的最大可用性,提供尽可能高的SLA。其实业界已有很多关于如何在产线运行微服务的经验分享,各家可能大同小异,相差不会太大。下面我们看Uber公司以什么样的方式管理运行在产线上处理成千上万请求的微服务,关于Uber的微服务管理经验,Susan J. Fowler在他的著作《Microservices in Production》中有详细的描述,我们将其总结为七点原则。
稳定性(Stability):
稳定的部署周期
稳定的部署流程
稳定的引入和下架应用流程
可靠性(Reliability):
部署过程可靠
尽可能规划、减缓及保护依赖关系的失败
可靠的服务路由和发现机制
扩展性(Scalability):
尽可能地量化系统各种运行时的指标
确定系统资源瓶颈和需求
精心规划系统的容量计划
可扩展的流量处理
依赖组件扩展管理
可扩展的后端数据存储
容错及灾难预防(Fault Tolerance and Catastrophe Preparedness):
清楚地确定和规划系统潜在灾难和故障场景
避免系统单点故障
完善的故障检测及修复流程
通过尽可能多、全面的代码测试、负载测试及混沌测试(Chaos Testing)确保服务具有极强的弹性能力
谨慎管理系统流量,以备故障发生
快速有效地处理线上故障及宕机事件
性能(Performance):
针对可用性定义合适的SLA
服务能快速有效地处理各种任务
充分利用系统资源
监控(Monitoring):
快速准确地记录和跟踪系统运行状态
设计良好的仪表盘有助于理解系统运行状态及更加准确地反映服务的健康状态
配备有效的、完善的、可操作的运维手册处理各种线上报警
实施和维护可执行的oncall轮换机制
文档(Documentation)
维护完整、有效的文档系统,不断积累和更新知识库
根据人员、部门组织文档系统,易于查询及理解
从上面内容可知,在管理产线环境运行成百上千的微服务时,主要利用两种手段,其一是完善的、执行力高的流程,其二是技术手段。两者之中,可能某些方面完善的流程胜于技术手段,为系统服务的高可用性保驾护航,提供坚强的后台支持。关于流程建设,这里不作介绍,因为每个公司对流程的制定千差万别,而技术可能更具有普适性,那么在通过技术手段确保微服务的高可用性时,又有哪些技术手段可以提高微服务的可用性呢?由于拆分后的单体应用变成成百上千的分布在不同计算节点,构成一个庞大的分布式系统,它们之间通过网络进行数据通信。说到实现分布式系统的高可用性时,不得不说L Peter Deutsch在Sun Microsystems工作时提出的关于分布式系统的谬误(https://en.wikipedia.org/wiki/Fallacies_of_distributed_computing):
网络是可靠的
网络零延迟
网络带宽是无限的
网络是安全的
网络拓扑一成不变
系统只有一个管理员
传输代价为零
网络是同质的
因此,在构建分布式系统时,最好尽可能地避免这些对分布式系统的错误认识。虽然清楚地认识这些谬误对构建分布式系统非常重要,但是,诸多原因使得构建一个高可用、弹性的分布式系统仍然非常困难,比如:网络不可靠、不可避免的系统依赖组件失败、用户行为的不可预知等。当然,这并不意味着构建高可用、弹性的分布式系统是不可能的。事实上,业界多年的技术积累及经验总结,已经提出很多有助于提高系统可用性和弹性的通用型技术指南,那就是模式。可以说,模式在软件工程中无处不在。以下是一些在构建分布式软件或者普通软件时的常用模式。
超时(Timeout):超时使得如果访问下游服务缓慢或失败时,上游服务应快速失败而不是无限或者长时间等待,以此避免级联故障,隔离故障范围。
重试(Retry):重试有效地解决访问服务时发生的间隙性故障,有助于减少服务恢复时间。
熔断(Circuit Breaker):熔断机制避免将请求继续发送给已经失败或者不健康的下游服务处理,而是等待它们恢复,避免级联故障。
健壮性测试(Resiliency Testing):健壮性测试通过人为的方式向系统注入各种可能的故障,模拟网络故障、延迟、依赖组件故障等,以此提前获得一些未知错误并制定相应的处理方案。
限速节流(Rate-limiting and Throttling):限速节流限定服务在固定的时间内只处理一定数量的请求,确保系统有足够的能力优雅地处理其他请求,可避免峰值流量导致系统崩溃,与第三方系统集成时可以提供安全保障。
除此以外,还有许多技术可帮助实现分布式系统的高可用性,例如:
动态服务发现
负载均衡
运行时动态路由
安全通信
运行时指标及分布式追踪
最后,强烈推荐大家阅读Susan J. Fowler的著作《Microservices in Production》,其中详细介绍如何在产线运行微服务。
接下来我们来看实现分布式系统的高可用性技术实现是如何演进的。
- 点赞
- 收藏
- 关注作者
评论(0)