版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
微服务架构改造方案
0背景技术圈流行一句话,凡脱离业务谈架构的,都是耍流氓。作为微服务改造系列的第一篇博客,首先介绍一下实施这次技术改造的背景。第一,我所在公司(简称XR)的后台服务采用的主技术栈是Scala,虽然开发效率很高,但也带来一系列的副作用。1.由于Scala语言强大的表达能力和丰富的函数式特性,很容易写出俗称“意大利面条”式的代码,一个类文件动辄上千行,代码的可读性非常差,导致可维护性也很差。2.编译Scala源码时首先需要将Scala源码转换成Java源码然后再通过JVM进行编译,加上隐式类型的存在进一步拖慢了编译期间的类型推导,Scala的编译速度比Java足足慢了一个数量级,这个差异在代码量少的时候还不明显,但随着代码量的上升,就成了团队的一个nightmare,试想本地全量编译一次需要10+分钟。3.Scala小众语言的标签决定了Scala程序员的稀缺性,晦涩难懂的官方文档拔高了学习曲线,后果就是高昂的招聘成本和漫长的培养时间。以上这些副作用不但抵消了先期开发效率上的优势,而且使得对新需求的响应能力越来越慢,技术负债也越垒越高。第二,历经2年多的产品迭代,整个后台服务项目越来越庞大,已经成为一个典型意义上的单体应用(也就是MartinFowler常说的monolithicapplication):
1.各个业务模块犬牙交错,重复代码随处可见,补丁代码越打越多。
2.任何一个改动都需要一次全量发布,哪怕是修改一句文案。
第三,与微服务化改造同时进行的是容器化改造,如果不对上述单体应用进行拆分,很多容器化带来的好处就会被削弱,甚至毫无意义,比如提高资源利用率(CPU型应用和内存型应用搭配部署),异构应用的环境隔离能力等。1局限
谷歌前研发总监Tiger曾经说过,一个系统的演化一般会经历三个阶段:首先是under-engineer,然后是over-engineer,最后才是right-engineer。
考虑到参与此次微服务改造的人员有限(一人主导,多人配合),同时也是团队第一次尝试做这类系统性的改造,最后我们决定采取一条比较实用的改良式路线:
最小化对已有应用的侵入性偏好主流的微服务框架只做必要的微服务治理第一条定下了此次改造的基调,降低了方案无法落地的风险,确保了项目的整体可行性。第二条让我们站在巨人的肩膀上,不重复造轮子,聚焦在问题本身,而不是工具。第三条缩减项目范围,避免过度工程,以战养兵,不打无用之仗。2微服务那些事三个关键词有关微服务的定义,最权威的版本莫属微服务之父MartinFowler在microservices一文中所述:Inshort,themicroservicearchitecturalstyleisanapproachtodevelopingasingleapplicationasasuiteofsmallservices,eachrunninginitsownprocessandcommunicatingwithlightweightmechanisms,oftenanHTTPresourceAPI.Theseservicesarebuiltaroundbusinesscapabilitiesandindependentlydeployablebyfullyautomateddeploymentmachinery.–JamesLewisandMartinFowler注意其中有3个关键词,small,independentlydeployable和automateddeployment。
small对应的就是微服务的微,很多初次接触微服务的同学对微的理解往往会停留在实现层面,以为代码少就是微,但实际上,这里的微更多的是体现在逻辑层面。微服务的一个重要设计原则是shareaslittleaspossible,什么意思呢?就是说每个微服务应该设计成边界清晰不重叠,数据独享不共享,也就是我们常说的高内聚、低耦合。保证了small,才能做到independentlydeployable。
而实现automateddeployment的关键是DevOps文化。需要提醒的是,随着业务复杂度的上升,一个微服务可能需要拆分为更多更细粒度的微服务,比方说,一开始只是一个简单的订单服务,后面逐步拆分出清算,支付,结算,对账等其他服务。
康威定律与单体应用拆分为微服务的过程类似,随着公司规模的不断扩大,一个组织势必会分化出多个更小的组织。根据康威定律,组织结构决定系统结构,因此,从这个层面来说,微服务也是一种必然。
康威定律(Conway’sLaw):“Anyorganizationthatdesignasystem(definedbroadly)willproduceadesignwhosestructureisacopyoftheorganization’scommunicationstructure.-MelvinConway,1968取舍从本质上来看,相对单体应用,微服务是以牺牲强一致性、提高部署复杂性为代价,换取更彻底的分布式特性,比如异构性和强隔离性。对应CAP理论,就是用Consistency换取Partition。
异构性比较容易理解,通过定义统一的API规范(一般采用REST风格),每个微服务团队可以根据各自的能力矩阵选用最适合的技术栈,而不是所有人必须使用相同的技术栈。
强隔离性指的是,对于一个典型的单体应用,隔离性最高只能体现到模块级别,由于共享同一个代码仓库,模块的边界往往比较模糊,需要人为定义很多规范来保证良好的隔离性,但无论如何强调,稍一疏忽,就会产生“越界”行为,时间愈长,维护隔离性的成本愈高。
而到了微服务阶段,自带应用级别的隔离性,“越界”的成本大大提升,无需任何规范,架构本身就保证了隔离性。
另一方面,由于采用了分布式架构,微服务无法再简单的通过数据库事务来保证强一致性,而是通过消息中间件或者某种事务补偿机制来保证最终一致性,比如微信朋友圈的点赞,淘宝订单的物流状态。
其次,在微服务阶段,随着应用数量的激增,一次发布往往涉及多个应用,加上异构性带来的部署方式的多样性,对团队的运维水平尤其是自动化水平提出了更高的要求,运维和开发的边界进一步模糊。领域知识除了组织架构和技术取舍,领域知识是另一个非常重要的决策因素。对于不熟悉的业务领域,很难第一次就把各个微服务的边界和接口定义正确,一旦开始开发,重构成本就会非常可观。反过来说,当对领域知识有了一定的积累,再重构一个单体应用就会容易的多。
3微服务看上去很美综上所述,虽然微服务看上去很美,但在决定采用微服务架构之前,不仅要仔细考量团队的技术水平(包括知识结构,理论深度,经验积累和技术氛围),还应综合考虑项目的时间范围,领域知识的熟悉程度,以及所在组织的规模架构。除非这些前提条件都满足,否则单体应用是更适合的选择,就像Fowler建议的那样。4微服务化改造总览上图是XR微服务化第一阶段的整体架构图。可以看到,一些支撑微服务的必要组件都已包含其中:服务注册中心:所有服务注册到Consul集群,集成Nginx实现负载均衡,使用Hystrix实现简单的服务降级和熔断机制CI/CD:利用JenkinsPipeline实现
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 精益服务解决方案
- 面部护理客户分析方案
- 煤炭车队营运方案
- 公共卫生突发事件下中小企业面临困境及应对策略
- 离婚孩子探视方案
- 部编版八年级(上)第三单元练习语文试卷含答案
- 期中测试卷-2024-2025学年统编版(五四制)语文一年级上册
- 怒杀阎婆惜概括50字左右
- 军史长廊策划方案
- 2024-2025学年湖南省长沙市长郡月亮岛学校九年级(上)第一次月考物理试卷(含答案)
- 临床病理诊断报告管理制度
- CATTI汉英词汇手册
- 《无人机法律法规知识》课件-第1章 民用航空法概述
- GB/Z 44306-2024颗粒质量一致性评价指南
- 大健康产业互联网医疗服务创新方案设计
- 幼儿家庭教育(山东联盟)智慧树知到答案2024年青岛滨海学院
- 2024年安全工程师考试真题及答案
- 公开课课件-《大气的组成和垂直分层》
- 三个和尚幼儿故事课件
- 互联网产品运营策略与用户增长考核试卷
- 水文勘测工(中级)技能鉴定考试题库(浓缩500题)
评论
0/150
提交评论