微服务化架构实践感悟

从去年初开始接触微服务架构的一些理念,然后到今年开始实施系统第四个大版本的架构升级决定采用这套架构理念。

最近关于微服务架构的讨论还是多起来,因为国外一些著名互联网公司(如:Amazon、Netflix 等)从实践中摸索出了一套新的大型系统架构方法论,并取得了成功,树立了很好的示范,然后这套方法论渐渐就被一些技术理论派

人士命名为微服务架构(Microservices)。

在微服务架构(Microservices)这个命名被正式提出来之前,我们做系统也有一套著名的思想理论,叫做面向服务架构(SOA)。

去年初我就写过一篇文章 [《面向服务与微服务架构》]({% post_url 2014-04-26-面向服务与微服务架构 %}) 来阐述面向服务和微服务架构的关系,当时并没有给出明确定义,只是有个模糊认知,而在近一年的实践过程中两者的关系越发清晰起来,

我们就从定义两者的关系这里开始吧。

微服务(Microservices)与 面向服务(SOA)架构

You should instead think of microservices as a specific approach for SOA

in the same way that XP or Scrum are specific approaches for Agile software development.

上面这段引用自 《Building Microservices》 一书,

通过过去一年的实践认知,我对这个定义是认同的,面向服务架构(SOA)的概念已有十多年,它提出了一种架构设计思想,

但没有给出标准参考实现,而早期企业软件业界自己摸索了一套实践方式 —— 企业服务总线(ESB)。

但历史证明 ESB 的实现方案甚至在传统企业软件行业也未取得成功,Martin Fowler 说正是因为 ESB 当年搞砸了很多项目,

投入几百万美金,产出几乎为 0,因此 SOA 这个概念也蒙上了不详的标签,所以当微服务架构出现时,

其拥护者开始拒绝使用包裹着失败阴影的 SOA 这个标签,而直接称其为微服务架构(Microservices Architecture Style),

让人以为是一套全新的架构思想,我也因此困惑了一段时间,但事实上它的本质依然是 SOA 的一种实现。

正如上面引文所说,就像早年流行的 XP(极限编程)和近年流行的 Scrum(好像没有标准的中文说法)实际都是敏捷软件开发思想

的具体实践方法而已。

为什么选择微服务架构

首先,当然是该套架构方法有著名的成功经验才导致我去了解与学习它。

微服务架构中的 “微” 体现了其核心要素,即服务的微型化,就是每个服务微小到只需专注做好一件事。

这件事紧密围绕业务领域,形成高度内聚的自治性。

以前我做过的一些大型应用系统,采用模块化的分层式架构,所有的业务逻辑代码最终会打进一个代码库中统一部署。

这种应用架构的问题是,全部开发人员会共享一个代码库,不同模块的边界模糊,实现高内聚、松耦合极其困难。

如果你接手过这类应用的遗留系统,尝试去做重构改进时,肯定碰到过这类场景,改了一个地方好几个其他模块也需要同步改动,

模块的边界轻易被穿透,这种应用的架构有一个很形象的名字叫 “洋葱架构”,洋葱的特点就是一层又一层的粘连,

重构这样的系统就像切洋葱一样让人忍不住飙泪。

微服务架构强调 “微”,但之前有些采用了 SOA 服务化架构思想的系统会搞出很多胖服务来,一点也不微,这依然带来耦合。

这一点只能依赖系统架构师的服务化建模能力了,但微服务架构强调每个服务一个进程,

使用进程为边界来隔离代码库至少让同一应用系统不同层次的开发人员享有自己完全自治的领地,每个微服务都有一个掌控者。

从某种程度上让不小心做错事,例如:跨出服务边界的代码耦合依赖,变得没那么容易。

去年对我们应用系统的代码行数做了个统计,有超过 40 万行。

一个 20 人的团队维护一个 40 万行共享代码库的单一应用,在里面修改 bug 和添加功能都将十分困难。

有一篇文章 《程序员的成长和代码行数的关系》 里提到大部分普通程序员成长生涯的瓶颈在 2 万行代码左右,

超过这个代码行数的应用系统维护起来将倍感吃力,所以我们系统这两年的高速发展膨胀,已让团队维护起来倍感吃力了。

所以我们想要把一个大系统拆分成许多不同的微服务,每个微服务的规模大小控制在一个普通程序员的舒适维护区能力范围内。

微服务架构实施

把 1 个应用进程部署到 1 台主机,部署复杂度是 1 x 1 = 1,我们有 200 台主机,那么部署复杂度是 1 x 200 = 200。

把 1 个应用进程拆分成了 50 个微服务进程,则部署复杂度变成了 50 x 200 = 10000。

部署变得复杂和麻烦多了,同时监控的进程数也大幅增加,监控的复杂度也上升了很多。

所以实施微服务架构是有很高成本的,只有系统的规模到了一定程度才适合,这也是为什么微服务架构实践诞生于大型互联网公司。

微服务推崇一切自动化的文化,这也是因为其运维复杂度的乘数级飙升,

从开发之后的构建、测试、部署都需要一个高度自动化的环境来支撑才能有效降低边际成本。

《Building Microservices》

一书对实施微服务架构有系统性的描述和很多业界案例的简单引用描述,这里不展开讲实施细节,那样就太长了。

我们这里简单总结下实施的要点:

  1. 自动化文化与环境:自动构建、自动测试、自动部署。
  2. 围绕业务能力建模服务,松耦合、高内聚、暴露接口而隐藏实现细节。
  3. 服务协作模型:中心化(乐队模型:中心指挥)和去中心化(舞蹈模型:群舞自组织),各自场景不同。
  4. 服务交互方式:RPC/REST/WS 技术很多但考虑统一。
  5. 服务部署的独立性、失败隔离性、可监控性。
  6. 服务流控:降级、限流
  7. 服务恢复:多考虑故障发生如何快速恢复而非如何避免发生故障。
  8. 服务发布:灰度。
  9. 服务部署:一服务一主机模型,需要虚拟化(Hypervisor)、容器化(LXC, Docker)等技术支持,实现硬件资源隔离。
  10. 服务配置:中心化配置服务支持
  11. 康威定律:任何设计系统的组织,最终产生的设计等同于组织之内、之间的沟通结构。系统架构的设计符合组织沟通结构取得的收益最大。
  12. 伯斯塔尔法则:服务健壮性原则 —— 发送时要保守,接收时要开放。

自进化的微服务架构

早期人们把软件开发和建筑学作类比,Architect 这个词来就源于建筑学,但软件产品和建筑物的性质完全不同。

建筑物本身一旦建成则几无变化了,唯有老化后被替代了。

软件系统会在其生命周期中不断变化,唯一不变的就是变化,拥抱变化,需用进化的观点看待架构演进。

与此类似的是城市,城市的演进发展总是渐进式的,我们不会在一座旧城旁建一座新城,然后把旧城的居民迁到新城然后再把旧城废弃了。

但经常我们会用这样的方法重写一个新系统并替换掉旧系统,付出高昂的成本。

而微服务架构思路是不鼓励这种方式的,系统的演进是通过局部的新增、改进或替换微服务来实现的。

而微服务本身的变化周期是不同步的,从整体上就形成了一种渐进式的、符合自然进化的系统演进道路。

所以 Architect(架构师)更像是城市规划师而非建筑师,对软件系统进行类似城市划分区域的规划。

从常识上我们知道把学校和住宅放在一个区域内是合理的,但如果再放一个垃圾处理厂则不合理。

学校和住宅就是提供两种不同能力的服务,垃圾处理厂是另一种服务,但现实中软件系统的规划其实不像城市规划那么有常识性,

这是架构师能力和经验发挥作用的地方,前期规划的不合理会在后期带来维护成本的放大。

每个历史悠久的城市都有各自不同的味道,城市中的人、时间、技术进步共同决定了今天城市的面貌。

微服务架构的妙处就在于它符合城市历史演进规律,随着人员变化、时间、技术改进而引发自然渐进式的进化。

微服务架构与架构师

架构师的一个角色是技术决策者,技术决策涉及很多权衡取舍(trade-off),而微服务架构给了架构师更多权衡取舍的空间。

每个微服务实现层面的技术决策更多由服务负责人决定,服务的分拆伴随着决策权和责任的分拆,这也减轻了整体应用负责人的责任负担。

架构师解放出来从整体和全局上将更加关注服务之间是如何交互,并确保能正确的监控系统全局的健康性。

分拆了服务实现的技术决策权,那何时又该适当的介入以避免服务实现不当危及整体系统的安全?

就像教孩子骑车,你无法代替它们去骑,你小心的看着他们骑的歪歪扭扭,担心他们摔倒。

事实上,孩子骑车摔倒的次数比你担心的要少,但如果每次快摔倒时都去扶住,那么他们也许永远学不会骑车。

当孩子骑车失控时冲向了繁忙的马路或要冲下路边的深沟,那时才有必要介入去稳住他们。

架构师工作在抽象和具体两个层面:

  • 架构是一项技术工作,技术工作要服务于组织的战略目标。
  • 大量的工程实践在每日的工作中不断变化,而渐渐稳定的实践方式被抽象提炼为一系列原则。
  • 原则的普及带来整体效率的提升和边际成本的下降,以更有效的支持组织战略目标的快速达成。
  • 另外也要确保这些原则不是让开发人员的生活变得更凄惨而是更美好。
  • 跟踪新技术发展确保能在合适的时候做出正确的取舍折衷。
  • 让开发人员理解某项技术决策的影响和制约以便最有效的执行,甚至在特定情形下深入到代码的实现层面。

文章开头说了,这是我们实施系统的第四个大版本,而之前每一个大版本升级都是一次旧城倒新城的整体搬迁。

而微服务架构天然的自然进化属性是否预示着这应该是最后一个大版本升级了?

微服务架构述说着没有永恒的架构,只有进化的架构,但微服务架构不是银弹,也没有银弹。

时间: 2024-10-08 16:25:01

微服务化架构实践感悟的相关文章

从 Spring Cloud 开始,聊聊微服务架构实践之路

[编者的话]随着公司业务量的飞速发展,平台面临的挑战已经远远大于业务,需求量不断增加,技术人员数量增加,面临的复杂度也大大增加.在这个背景下,平台的技术架构也完成了从传统的单体应用到微服务化的演进. 系统架构的演进过程 单一应用架构(第一代架构) 这是平台最开始的情况,当时流量小,为了节约成本,并将所有应用都打包放到一个应用里面,采用的架构为 .NET SQL Server: 表示层:位于最外层(最上层),最接近用户.用于显示数据和接收用户输入的数 据,为用户提供一种交互式操作的界面,平台所使用

基于 Docker 的微服务架构实践

本文来自作者 未闻 在 GitChat 分享的{基于 Docker 的微服务架构实践} 前言 基于 Docker 的容器技术是在2015年的时候开始接触的,两年多的时间,作为一名 Docker 的 DevOps,也见证了 Docker 的技术体系的快速发展.本文主要是结合在公司搭建的微服务架构的实践过程,做一个简单的总结.希望给在创业初期探索如何布局服务架构体系的 DevOps,或者想初步了解企业级架构的同学们一些参考. Microservice 和 Docker 对于创业公司的技术布局,很多声

微服务架构实践 - 你只懂docker与spring boot就够了吗?

微服务架构实践 - 你只懂docker与spring boot就够了吗? 作者 浮云发发 已关注 2017.02.27 02:50* 字数 2613 阅读 2583评论 6喜欢 35赞赏 2 微服务并不是单独存在的,为了更好地实现微服务架构,需要整合许多组件混搭使用,方能打通任督二脉,天下无敌.网上很多大拿讲了微服务治理的内容,也有人单方面讲微服务的,比如spring boot与docker,本文着重于组件选型的较量,也积累了我们团队多次PK的精华:这些组件包括spring boot.sprin

基于OpenResty和Node.js的微服务架构实践

什么是微服务? 传统的单体服务架构是单独服务包,共享代码与数据,开发成本较高,可维护性.伸缩性较差,技术转型.跨语言配合相对困难.而微服务架构强调一个服务负责一项业务,服务可以单独部署,独立进行技术选型和开发,服务间松耦合,服务依赖的数据也独立维护管理.虽然微服务存在部署复杂.运维难度较大.分布式事务控制难.容错要求高等缺点,但总体而言,微服务的优点远大于其复杂性. 微服务架构需要注意哪些问题? 微服务架构,首先考虑客户端与服务端之间的通信问题.有两种解决办法,一是客户端与多个服务端直接进行通信

微服务架构实践

目录 业务背景 微服务概念 微服务技术选型 微服务架构设计 微服务架构设计落地 微服务架构设计过程中积累的心得 总结 一.业务背景 1.1 产品现状 1.各产品系统独立开发,代码复用率低,系统之间互相调用,耦合严重,系统解耦独立部署困难. 2.传统的单体架构,规模越来越大也越来越笨重:当新功能的开发.功能的重构变得不再敏捷可控:测试者的回归测试边界难以琢磨:系统的上线部署也变的艰难 3.高并发访问下无法提供可靠性服务 4.持续集成.持续部署.持续交付等工程效率化工具严重缺失 5.监控系统.日志分

千万级调用量微服务架构实践

微服务架构在大型电商中的运用电商是促销拉动式的场景,也是价格战驱动的场景.618和双11都是典型的促销活动.其实都是在抢用户.扩市场占有率.在这样的场景之下,对秒杀.抢购是很热衷的玩法. 促销式的拉动对系统的挑战是什么呢? 可以从上图里看到:对高可用性的要求是非常高的,需要99.99%的高可用性.快速迭代对对系统容性的要求很高,从几万单变成几十万单.百万单,架构上不能影响快速迭代,所以有空中加油或者是高速公路换轮胎的说法. 另外,为了应对瞬间的海量访问(尤其是秒杀场景),系统需要高可伸缩(快速扩

云平台的微服务架构实践

本文是在云平台构建过程中的一些经验总结,主要说明了PaaS层的微服务架构设计和落地. 目标 降低系统的复杂度,减少系统的不确定性. 方法 量化,标准化,自动化. 架构设计 标准化业务层次 梳理业务体系和服务能力,将PaaS平台分层. 聚合领域服务能力的应用服务层 提供基本数据访问能力的领域服务层 标准化治理方式 统一使用标准化的微服务治理组件,规范微服务工程模板和领域模型. a, 治理组件 Registry: Eureka(服务发现)和Spring Cloud Config(统一配置): UAA

聊聊微服务架构实践之路的4大挑战,3月31日见真章!

当容器化的兴起,为应用开发部署带来变革,也为应用设计架构和运维部署带来变化: 当持续交付.DevOps.微服务,成为企业在软件成果对抗当中胜出的有力武器,微服务架构已经随处可见: 但随之而至的是微服务框架.微服务监控.微服务配置.微服务治理等一系列挑战, 从架构到发布,挑战重重,该如何应对容器化微服务架构的各种技术难题? 2018年3月31日,数人云联合ServiceComb社区,开启Building Microservice 系列活动 第2期 北京站 带你了解最新的微服务开源框架, 解析微服务

第一章 微服务架构实践

等写完所有的代码后,会在这里给出整个项目的一个总览图. 技术介绍: 服务注册和服务发现:consul 配置管理:consul 集群容错:hystrix 计数监控:metrics 服务路由: 负载均衡: 服务通信:retrofit.okhttp ......