微服务化改造系列之一:总览

1 写在前面

背景

技术圈流行一句话,凡脱离业务谈架构的,都是耍流氓。作为微服务改造系列的第一篇博客,首先介绍一下实施这次技术改造的背景。

第一,我所在公司(简称XR)的后台服务采用的主技术栈是Scala,虽然开发效率很高,但也带来一系列的副作用。1.由于Scala语言强大的表达能力和丰富的函数式特性,很容易写出俗称“意大利面条”式的代码,一个类文件动辄上千行,代码的可读性非常差,导致可维护性也很差。2.编译Scala源码时首先需要将Scala源码转换成Java源码然后再通过JVM进行编译,加上隐式类型的存在进一步拖慢了编译期间的类型推导,Scala的编译速度比Java足足慢了一个数量级,这个差异在代码量少的时候还不明显,但随着代码量的上升,就成了团队的一个nightmare,试想本地全量编译一次需要10+分钟。3.Scala小众语言的标签决定了Scala程序员的稀缺性,晦涩难懂的官方文档拔高了学习曲线,后果就是高昂的招聘成本和漫长的培养时间。以上这些副作用不但抵消了先期开发效率上的优势,而且使得对新需求的响应能力越来越慢,技术负债也越垒越高。

第二,历经2年多的产品迭代,整个后台服务项目越来越庞大,已经成为一个典型意义上的单体应用(也就是Martin Fowler常说的monolithic application):1.各个业务模块犬牙交错,重复代码随处可见,补丁代码越打越多。2.任何一个改动都需要一次全量发布,哪怕是修改一句文案。

第三,与微服务化改造同时进行的是容器化改造,如果不对上述单体应用进行拆分,很多容器化带来的好处就会被削弱,甚至毫无意义,比如提高资源利用率(CPU型应用和内存型应用搭配部署),异构应用的环境隔离能力等。

局限

谷歌前研发总监Tiger曾经说过,一个系统的演化一般会经历三个阶段,首先是under-engineer,然后是over-engineer,最后才是right-engineer。考虑到参与此次微服务改造的人员有限(一人主导,多人配合),同时也是团队第一次尝试做这类系统性的改造,最后我们决定采取一条比较实用的改良式路线:

  1. 最小化对已有应用的侵入性
  2. 偏好主流的微服务框架
  3. 只做必要的微服务治理

第一条定下了此次改造的基调,降低了方案无法落地的风险,确保了项目的整体可行性。第二条让我们站在巨人的肩膀上,不重复造轮子,聚焦在问题本身,而不是工具。第三条缩减项目范围,避免过度工程,以战养兵,不打无用之仗。

2 微服务简介

3个关键词

有关微服务的定义,最权威的版本莫属微服务之父Martin Fowler在microservices一文中所述:

In short, the microservice architectural style is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. -- James Lewis and Martin Fowler

注意其中有3个关键词,small,independently deployable和automated deployment。small对应的就是微服务的微,很多初次接触微服务的同学对微的理解往往会停留在实现层面,以为代码少就是微,但实际上,这里的微更多的是体现在逻辑层面。微服务的一个重要设计原则是share as little as possible,什么意思呢?就是说每个微服务应该设计成边界清晰不重叠,数据独享不共享,也就是我们常说的高内聚、低耦合。保证了small,才能做到independently deployable。而实现automated deployment的关键是DevOps文化,可参见Fowler另一篇谈DevOps的文章。

需要提醒的是,随着业务复杂度的上升,一个微服务可能需要拆分为更多更细粒度的微服务,比方说,一开始只是一个简单的订单服务,后面逐步拆分出清算,支付,结算,对账等其他服务。

康威定律

与单体应用拆分为微服务的过程类似,随着公司规模的不断扩大,一个组织势必会分化出多个更小的组织。根据康威定律,组织结构决定系统结构,因此,从这个层面来说,微服务也是一种必然。

康威定律(Conway’s Law):“Any organization that design a system (defined broadly) will produce a design whose structure is a copy of the organization’s communication structure. - Melvin Conway, 1968

取舍

从本质上来看,相对单体应用,微服务是以牺牲强一致性、提高部署复杂性为代价,换取更彻底的分布式特性,比如异构性和强隔离性。对应CAP理论,就是用Consistency换Partition。异构性比较容易理解,通过定义统一的API规范(一般采用REST风格),每个微服务团队可以根据各自的能力矩阵选用最适合的技术栈,而不是所有人必须使用相同的技术栈。强隔离性指的是,对于一个典型的单体应用,隔离性最高只能体现到模块级别,由于共享同一个代码仓库,模块的边界往往比较模糊,需要人为定义很多规范来保证良好的隔离性,但无论如何强调,稍一疏忽,就会产生“越界”行为,时间愈长,维护隔离性的成本愈高。而到了微服务阶段,自带应用级别的隔离性,“越界”的成本大大提升,无需任何规范,架构本身就保证了隔离性。

另一方面,由于采用了分布式架构,微服务无法再简单的通过数据库事务来保证强一致性,而是通过消息中间件或者某种事务补偿机制来保证最终一致性,比如微信朋友圈的点赞,淘宝订单的物流状态。其次,在微服务阶段,随着应用数量的激增,一次发布往往涉及多个应用,加上异构性带来的部署方式的多样性,对团队的运维水平尤其是自动化水平提出了更高的要求,运维和开发的边界进一步模糊。

领域知识

除了组织架构和技术取舍,领域知识是另一个非常重要的决策因素。对于不熟悉的业务领域,很难第一次就把各个微服务的边界和接口定义正确,一旦开始开发,重构成本就会非常可观。反过来说,当对领域知识有了一定的积累,再重构一个单体应用就会容易的多。

小结

综上所述,虽然微服务看上去很美,但在决定采用微服务架构之前,不仅要仔细考量团队的技术水平(包括知识结构,理论深度,经验积累和技术氛围),还应综合考虑项目的时间范围,领域知识的熟悉程度,以及所在组织的规模架构。除非这些前提条件都满足,否则单体应用是更适合的选择,就像Fowler建议的那样。

3 微服务化总览

上图是XR微服务化第一阶段的整体架构图。可以看到,一些支撑微服务的必要组件都已包含其中:

  • 服务注册中心:所有服务注册到Consul集群,集成Nginx实现负载均衡,使用Hystrix实现简单的服务降级和熔断机制
  • CI/CD:利用Jenkins Pipeline实现不停机发布
  • 日志平台:扩展ELK加上Redis缓存
  • 配置中心:使用自研的Matrix系统,最小化对已有应用的侵入性,保证异构系统的兼容性
  • 授权中心:基于Spring Security OAuth,同时支持SSO
  • 消息中心:选用RabbitMQ作为消息中间件
  • 监控平台:利用Consul API获取服务状态,通过Zookeeper触发告警

在微服务化系列的后续文章中,我会针对服务注册、配置中心和授权中心分别展开介绍实施过程中的一些细节和经验。敬请期待。

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容