微服务架构 - 正确的开始
顶级架构师后台回复 1024 有特别礼包
作者:lex-wu
来源:cnblogs.com/lex-wu/p/13923414.html
上一篇:别去外包
大家好,我是顶级架构师。
前言
微服务自从Fred George提出,后续逐渐由不同的大师如Martin Fowler,Neal Ford等人接力推广演进后,已经在业界如火如荼的流行了好些年,它的目的是有效的拆分应用,实现敏捷开发和部署 。
微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。
每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相协作(通常是基于HTTP协议的RESTful API)。
每个服务都围绕着具体业务进行构建,并且能够被独立的部署到生产环境、类生产环境等。
从这里面我们可以看出,这里面的关键字是“小”,“独立”,“轻量级”,从中我们可以总结为:服务之间是松耦合的,不相互影响的。但“小”绝对不是字面上理解的小,我们下面将介绍一个服务的小的维度是什么。
单体服务
提到微服务,就不能不提到单体应用了,我们通常所说的单体应用,即将所有功能都打包成在一个独立单元的应用程序。
一个典型的单体应用就是将所有业务场景的表示层、业务逻辑层和数据访问层放在一个工程中,最终经过编译、打包,部署在一台服务器上。
在微服务或者SOA架构没提出来之前,业界应该基本都是单体应用,分布式系统架构在业界内已经有较长的历史了,但单体应用还是占据着大半壁江山。
存在即合理的
优点
开发方便:集中式管理,只需要在一个解决方案中编程和构建 测试相对简单:只需要写一些端到端的测试用例,启动即可整体联调查找问题 部署手段简易:只需要把一份构建好的文件丢上服务器 容易横向扩展:可以部署多个实例,由负载均衡器调度即可 没有分布式的管理/调用开销
这些优点是显著的,它们能给人带来明确的掌控感觉,而不是不可控的飘渺虚无感。
然而,它的缺点也是非常明显的,想想我们现在大部分的项目,伴随着越来越快的互联网信息时代,业务要的就是灵活变动和快速上线,针对于灵活和快速,单体应用是无法提供的。
缺点
开发效率低:系统庞大复杂,没人能理解全部,且所有的开发在一个项目改代码,代码冲突不断 代码维护难:代码功能耦合在一起,牵一发动全身 部署不灵活:构建时间长,任何小修改必须重新构建整个项目,这个周期往往很长 稳定性不高:系统缺乏故障隔离,一个微不足道的小问题,可以导致整个应用挂掉
可以肯定的是,一旦你的应用变成一个又大又复杂的怪物,那开发团队肯定很痛苦。敏捷开发和部署举步维艰,每次的开发都会引出其他问题,因为它们的耦合性太强了。
其中最主要问题就是这个应用太复杂,以至于任何单个开发者都不可能搞懂它。因此,修正bug和正确的添加新功能变的非常困难,并且很耗时。
另外,团队士气也会走下坡路。如果代码难于理解,就不可能被正确的修改,最终会走向巨大的、不可理解的泥潭。
所以在这时,很多人把目光投向了微服务。
微服务
由来
首先任何的技术不会平白无故的出现,它们的出现,是某些痛点一直在困扰着大多数人,所以这些技术的出现,都是有特定背景的。
从上面来看,有诉求才会有发展,没有单体式应用的痛点折磨,没有分布式系统的铺垫,没有自动化工具的应用,是不可能出现所谓的微服务的,所以我们可以说,微服务架构是演进过来的。
微服务是一种架构风格
微服务在Chris口中,是一种架构设计风格,而在国内,更多的开发者视之为具体的某个服务,所以我们通常的说法是“一个微服务”,按照Chris自己的说法,系统是采用了微服务架构设计风格,由若干个服务构成,这才是一个完整的微服务。
“微”服务
微服务这个术语让我们很多人错误的将关注点聚焦在“微”上,它暗示着我们服务的颗粒度是应该非常小的。
实际上,大小不是一个重要的考虑因素。
细想一下微服务的进化铺垫,我们为什么要拆服务?是由于单体应用的臃肿庞大且耦合性过高的特性。所以我们在拆分的过程中,更多的考虑方面是在如何避免单体应用的耦合问题,不然拆出来的一样是一个相互牵扯的单体微应用,所以我们的关注点应该是在每个服务的松散耦合上,确定好它的边界,让每个服务能做到真正的松耦合,而不仅仅是大小问题。
诚然,小服务确实是维护性更高。但我们微服务的目标,更多的是定义我们的工作方式,比如定义为可由小团队自主开发,并且交付时间短,与其他团队协作少,不会相互影响的工作方式。
所以我们服务的设计和定义,需遵循我们的目标法则去规划的,而这个法则就是服务内的高内聚和服务间的低耦合。
微服务架构通过把一些小的,松耦合的服务组织在一起,重新定义了我们的应用,这样的结果是提升了我们开发阶段的效率,特别是可维护性,可测试性和可部署性,通过这样的方式影响着团队的效率提升。
服务的本质
每个构成微服务架构体系的服务,本质都是一个可独立运行的应用程序。
这个服务是由一组边界清晰,高内聚的职责组成,而且它可以做自己的负载均衡,独立部署,独立发布,能够快速脱离单体应用的局限性快速上线。
搜索公众号GitHub猿后台回复“赚钱”,获取一份惊喜礼包。
这也是微服务的优势所在,只要做到接口兼容或者版本兼容,不必做过多的服务依赖。
优点
更加契合敏捷开发
我们知道,敏捷开发这种软件工程方法已经在很多公司中采用了,敏捷开发的意义在于更快速的交付可运行版本以及迭代做功能最小闭环,它是这个信息时代的必然产物。当我们采用微服务时,在团队自治的同时,意味着更快速的开发和交付。
Devops文化的推广
在Neal Ford的微服务理念中,Microservices are the first post DevOps revolution architecture,DevOps所涵盖的一系列文化和理念,是微服务演进过程中必不可少的先决条件。
微服务的流行,更好的推动了Devops文化,它们是相辅相成的。
比较确定的说,在传统的运维模式下,是很难有效实现微服务架构的,因为微服务在治理层面需要自动化基础设施、自动化部署、自动化验证、以及利用有效的工具完成运维、监控、告警等。而只有将DevOps与微服务紧密的结合起来,才能达到事半功倍的效果。
技术栈的选择
我们的企业发展能存活的根本是什么?就是能赚钱才能活下去,换言之也就是对成本的控制。当我们能够采用适合自己的成本投入方式,在各个环节和服务采用最合适的技术栈,能够给企业的投入成本做一定的保障。
组织结构的变化
其实我们一直在暗示着,服务的职责要单一,做到专,然而这个专并不仅仅在服务的职责层面上,还有在组织结构上, 微服务势必会影响到我们的中台战略能力,所以我们更需要不同的组专注于不同的技术和业务。
简单点说,让专业的人做专业的事!这样才能更好的提高整体的生产效率,而不是事事都有牵绊。
云生态下的新技术冲击
当我们采用微服务时,目光已经不能仅局限于应用层面的开发了,容器化,服务编排工具,服务网格,云原生等新生的技术,让我们知道如何更好的治理好自己的服务群,支撑自己的服务更好的扩展。
挑战
微服务本质上是分布式系统,所以在分布式系统中遇到的难点,在微服务中都会遇到,分布式系统进程间的通信保证,网络开销以及事务处理从来都是难题
微服务的流行,离不开容器化和云生态,离不开gRPC,ServiceMesh,云原生等新技术的崛起以及实际生产应用。换言之,你需要了解乃至熟知这些技术,毕竟传统的单体应用只需要更多的专注于应用层面
微服务架构带来过多的运维操作,需要团队具备一定的 DevOps 技能,在运维层面开销会很大
治理中心(包括基础设施架构,集合着CICD,监控等微服务必要的非功能性需求)
测试将会是非常难,因为它不再是端到端,还很大可能会存在多版本的不同服务带来不同的测试场景
这些挑战,分析一下本质,就是对人的要求更高了,所以说采用微服务并不仅仅是技术层面带来的冲击,更多的是对人带来的思想/能力冲击。
微服务的解剖
服务划分
服务开发
服务治理
这三部也是涵盖了微服务架构落地的全部步骤,每一步都会有不同的指导方法论用于区别于传统的开发思想,后续将会基于这些步骤结合流行的方法学来指导我们服务落地。
总结
微服务不是银弹!
我特别喜欢说的一句话是:任何的技术,都是有适用场景的。所以我很喜欢看到那些能基于目前的痛点以及中长期的发展所面临的问题分析, 对比单体架构和微服务架构带来的收益比。
我们需要的是思考技术能带来的价值,而不是为技术疯狂。
任何的技术手段,都是用来服务业务的,能支撑业务创造价值的,才是好技术,否则这些技术一文不值。
不管黑猫白猫,捉到老鼠的就是好猫!
微服务架构也不例外。
为什么团队想要采用微服务?采用后团队将能得到什么?(说明充分了解了单体/微服务的优缺点,并能清晰了解到业务以及团队在中长期所面临的问题点) 是否组织结构以及文化底蕴有一定的支撑?(团队是否能经得起微服务所带来的冲击) 是否有一定的技术基础支撑?(说明能对微服务的所面临的技术挑战有了一定的认识)
当你能做到对以上问题都有清晰答案后,且仍然决定采用微服务架构,说明你已经对微服务所带来的收益比有了自己的判断。
Last but not least
在将组织推向微服务道路之前,最重要的决策人理解了“为什么是微服务”,而不是“为什么不是微服务”。
「顶级架构师」建立了读者架构师交流群,大家可以添加小编微信进行加群。欢迎有想法、乐于分享的朋友们一起交流学习。
扫描添加好友邀你进架构师群,加我时注明【姓名+公司+职位】
版权申明:内容来源网络,版权归原作者所有。如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。
猜你还想看
一次简单的Java服务性能优化,实现压测 QPS 翻倍
Sharding-Jdbc实现读写分离、分库分表,妙!
阿里技术专家:一文教你高效画出技术架构图
看看人家 SpringBoot 的全局异常处理,多么优雅...