《微服务架构设计模式》读书笔记---第十三章:微服务架构的重构策略

对于正在经历单体地狱的团队,有一些策略可以摆脱这种现状。

绞杀者应用程序(Strangler Application),可以逐步将单体架构转换为微服务架构。绞杀者应用程序是一个由微服务组成的新应用程序,通过将新功能作为服务,并逐步从单体应用程序中提取服务来实现。随着时间的推移,当绞杀者应用程序实现越来越多的功能时,它会缩小并最终消灭单体应用程序。

不要做“一步到位,推动重来”式的改造,“一步到位”方式是指,切图从零开始开发一个全新的基于微服务的应用程序(彻底替换遗留的单体应用)。

尽早并且频繁的体现出价值
逐步重构微服务架构的好处是,可以立即获得投资回报。可以先将应用程序中高价值的不分迁移到微服务架构。利用微服务尽早交付的特点,有助于获得业务团队对重构工作的支持。

尽可能少对单体做出修改
应该避免对单体进行大范围的修改。因为这样的修改耗时、昂贵且具有风险。不过既然要重构,就无法避免对单体应用的修改。但是也有一些策略,去规避风险,较少冲沟的工作量。

部署基础设施:这对你来说还为时过早
在重构前期,只进行最小的投资。唯一不可获取的是自动化测试的部署流水线。等到有一定的实际经验,后再进行大规模的投入。

将单体应用重构为微服务架构的若干策略

  1. 将新功能实现为服务
  2. 隔离表现层和后端
  3. 通过将功能提取到服务中来分解单体

将新功能实现为服务
如果发现自己已经陷入了困境,就不要在给自己继续挖坑了。将新功能实现为服务,降低了单体的生长速度,加速了新功能的开发,还能开速展示微服务架构的价值。

  • 把新的服务与单体集成。需要API Gateway(将新功能的请求路由到新服务,其他请求路由到单体应用)和集成胶水代码(使服务与单体应用互相调用)。

  • 何时把新功能实现为服务
    理想情况下,新功能在新服务中实现。但是对于功能太小,或者新功能和单体中代码紧耦合的情况下,还是建议,在单体中实现新功能。

隔离表现层与后端
另一个策略是,表现层和业务逻辑和数据访问层分开。表现层和其他两层通常存在清晰的边界。业务层中的粗粒度的API,是天然的接缝,可以沿着这条接缝,把应用程序进行拆分。
这种策略的好处是:

  1. 可以彼此独立的开发部书和扩展这两个应用。
  2. 业务逻辑层的一组远程API,可以被稍后开发的微服务调用。

提取业务能力到服务中
提取到服务中的功能是对单体应用自上而下的一个“垂直切片”。该切片包含以下内容:

  • 实现API断带你的入站适配器
  • 领域逻辑
  • 出站适配器
  • 单体的数据库模式

再通过需要API Gateway将新功能的请求路由到新服务,其他请求路由到单体应用,和集成胶水代码使服务与单体应用互相调用。

提取一项实现对业务至关重要且不断发展的功能的服务是值得的。入股哦没有太多的好处,那么在提取服务方面投入精力是没有价值的。

在拆分的过程中,可能会遇到一下挑战:

  • 拆解领域模型
  • 重构数据库

拆解领域模型
第一个挑战就是跨越服务边界的对象引用,保留在单体中的类可能会引用已移动到服务的类。
解决方式就是根据DDD聚合进行思考。聚合使用主键而非对象引用作为互相引用。
更大的挑战是提取嵌入在具有其他职责的类中的功能。

重构数据库
拆分领域模型,不仅设计代码更改,业务涉及到数据库中持久化的数据。拆分实体的时候,就需要拆分相应的数据库表并将新表移动到服务中。

可以使用复制数据的方式以避免更为广泛的更改。在过渡期内保留原模式,并在用触发器在原模式和新模式之间同步。

确定提取何种服务,以及何时提取
需要仔细确定提取服务的顺序,以获得最大的收益。
一种策略是,冻结单体架构的开发,并按需提取服务。好处是逼迫你打破单体,弊端是没有规划,不能体现工作的价值。
另一种策略是,根据提取应用程序模块获得的预期收益,对应用程序的模块进行排名。
愿意如下:

  • 加速开发。
  • 解决性能、可扩展或可靠性问题。如果要提取的不分存在性能、可扩展或可靠性问题,那么提取就有价值。
  • 允许提取其他一些服务。模块间存在依赖关系,提取顺序肯能影响提取的难易程度。

设计服务与单体的协作方式

服务很少独立工作,他需要与单体协作。
一个重要的问题是维护服务和单体之间的数据一致性。特别是拆分时,会破坏原有的ACID事务。

设计集成胶水

  1. 集成胶水代码,需要以API的形式,封装实现细节。
  2. 在选择同步交互方式,或者让使用者维护数据副本,以满足服务与单体间的查询需求。
  3. 在更新操作的时候,就需要使用Saga等方式,保证数据的一致性。
  4. 使用防腐层,让服务与单体间进行通信,防止传统的单体领域模型污染服务的领域模型,他是在不同领域模型之间进行转换的一层代码。
  5. 单体应用发布和订阅领域事件,也需要一定的改造。一种是在所有发生改变的代码位置,手动发布领域事件,但耗时费力,可能遗漏。另一种是在数据库级别发布领域事件,例如事务逻辑拖尾或者轮询,但通常表示数据库的更改,而不是表示业务实体的更改。对于单体的订阅,如果单体赢哟更不支持消息代理客户端,可以编写“帮助器”订阅事件,在更新单体的数据库。

处理身份验证和访问授权
基于微服务的应用程序使用令牌(JWT)来传递用户身份。而单体应用,使用内存中会话状态并使用本地线程对象传递用户身份。在重构时的挑战是,需要同时支持基于单体和基于JWT的安全机制。
一种解决方案是,在用户登录有,API Gateway同时设置JSESSIONID和USERINFO,JSESSIONID可以支持单体的认证方式;而在请求服务时,API Gateway将USERINFO转换为Authorization header供服务使用。

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