learn-tech/专栏/周志明的架构课/春节特别放送(上)_有的放矢,事半功倍.md
2024-10-16 06:37:41 +08:00

165 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

因收到Google相关通知网站将会择期关闭。相关通知内容
春节特别放送_ 有的放矢,事半功倍
你好,我是周老师的课程编辑王惠。今天是正月初一,首先在这里祝你春节快乐、牛年吉祥,在新的一年,学业进步、工作顺利~另外疫情当前,你也要注意保护好身体。
不知你还记不记得在开篇词里,我们曾发起过一个活动:
在课程更新的过程中,分享出你的学习心得、实践感悟等等,或者也可以分享出你自己在架构设计中的实践经历、遇到的坑以及避坑的经验。在期中和期末时,课程编辑会甄选出优秀的留言分享内容,专门做一个展示模块,最后还会送出这门课程的纸质版图书。
那么到了这里,我们就已经跟随老师走完一半的学习之旅了,相信这两个半月的时间里,你学到了很多,究竟掌握得怎么样呢?
所以在春节假期这段时间,正好我们可以把那些硬核艰深的架构知识放一放,轻松一下,一起来复盘复盘我们学过的知识点,做到有的放矢地学习。
然后,我们再通过同学们的优秀留言,来理解那些自己可能还不够熟悉的课程内容,或者体验一下自己没有经历过的实践过程、没有亲身踩过的坑,希望以此能帮助你更高效地学习课程。
好,我们开始吧。
“演进中的架构”模块内容复盘
这个模块里我们一起了解了微服务发展历程中出现的大量技术名词、概念以及了解了这些技术的时代背景和探索过程同时也在此过程中更深入地理解了Unix设计哲学的思想。
原始分布式时代。这是计算机科学对分布式和服务化的第一次探索DCE、CORBA等都是早期的分布式基础架构原始分布式架构设计的主要目的就是为了追求简单、符合 Unix 哲学的分布式系统,这也是软件开发者对分布式系统最初的美好愿景。
单体系统时代。单体作为迄今为止使用人数最多的一种软件架构风格具有易于分层、易于开发、易于部署测试、进程内的高效交互等优势。它也存在一些关键性的问题比如存在隔离与自治能力上的欠缺、不兼容“Phoenix”的特性等。但这并不意味着单体最终会被微服务所取代未来它仍然会长期存在。
SOA时代。虽然SOA架构具有完善的理论和工具可以解决分布式系统中几乎所有主要的技术问题曾经也被视为更大规模的软件发展的方向但它最终还是没能成为一种普适的软件架构。为什么呢实际上这正是由于SOA架构过于严谨精密的流程与理论使得它脱离了人民群众从而走上了被架构者抛弃的不归路。
微服务时代。早期的微服务架构作为SOA的一种轻量化的补救方案是在SOA发展的同时被催生出来的产物。但发展到现在可以说微服务已然成为了一种独立的架构风格。在该架构模式下我们需要解决什么问题就引入什么工具团队熟悉什么技术就使用什么框架对开发者来说十分友善。不过我们也同样需要警惕因为在微服务中对于那些分布式服务的问题不再有统一的解决方案因此可以说微服务所带来的自由是一把双刃剑。
后微服务时代。现在人们常说的“云原生”时代,就是课程中所讲的后微服务时代,因为它跟前面的微服务时代中追求的目标相比,并没有什么本质的改变,都是通过一系列小型服务去构建大型系统。可以说,容器化技术、虚拟化技术的发展和兴起,对软件架构、软件开发产生了很大改变,软件和硬件的界限开始变得模糊,业务与技术能够完全分离,远程与本地完全透明,如同老师所说,也许这就是分布式架构最好的时代。
无服务时代。无服务是近几年出现的新概念,它最大的卖点就是简单,只涉及了后端设施和函数两块内容,其设计目标是为了让开发者能够更纯粹地关注业务。不过我们要注意,与单体架构、微服务架构不同,无服务架构天生的一些特点,比如冷启动、无状态、运行时间有限制等等,决定了它不是一种具有普适性的架构模式,我们也不要误会它比微服务更先进。
模块留言精选
第1讲
来自@Jxin
我认为,可以从两个方面来看待“简单”,分别是业务和技术。
先说业务。现代软件系统的业务复杂性越来越高,而分离关注点,无疑是应对日益增长的业务复杂性的有效手段。但如果依旧是一个大型单体系统(所有业务单元都在一个容器下),那么跨业务单元的知识诉求便很难避免了,并且在开发迭代以及版本发布中,彼此还会相互影响。而微服务的出现,就为其提供了设定物理边界的技术基础,这就使得多个特性团队对业务知识的诉求可以收敛在自身领域内,降低了单个特性团队所需了解的业务知识。
再来说下技术。这里我认为主要体现在技术隔离上。就如同RPC可以让你像调用本地方法一样调用远程方法微服务技术组件的出现大多是为了让开发人员可以基于意图去使用各种协调分布式系统的工具而不用深入具体工具的实现细节去研究怎么解决的分布式难题。
另外就像SpringBoot提到的生产就绪微服务的生态已经不局限于开发的阶段。在部署和运行阶段都有健全组件的支持。它可以让开发人员基于意图就可以简便地实现金丝雀发布基于意图就能拿到所有系统运行期的数据。而所有的这些便利都算是技术隔离带来的好处。
来自@J.Spring
目前我们团队在做从传统HTTP直接调用、向SOA服务化架构的改造这个过程让我对SpringCloud这种面向HTTP的服务以及Dubbo-RPC服务产生了疑问。
因为单论简单SpringCloud看起来更简单但它缺乏完善且强大的服务治理能力。而Dubbo框架看似沉重却拥有很强大的服务治理功能。
所以我认为,简单的东西可能后期会变得复杂。而一开始的复杂,可能后期会变得简单。
第2讲
来自@STOREFEE
如果可以很明显地预估到项目的开发规模不会很大,但是对性能要求很高,局部范围需要经常迭代,而且需要多点部署的场景,那就非常适合单体架构。
不过我观察到凡是和互联网沾边的流行的软件项目基本其规模都在不断膨胀趋向于包罗万象。因为现在很多用户会觉得软件越来越多去切换不同的东西太麻烦了有的还得申请账号、填写资料等比较繁琐。最明显的例子就是石墨和飞书前几年感觉石墨文档很贴近Word挺不错的。另外现在飞书、企业微信等工具都整合了企业聊天、会议、文档、存储、绘图等一系列的东西。
所以说像这种一站式服务,绝对会采用非单体架构。
来自@小高
单体架构并不是一无是处的。在公司的初始阶段,为了让业务快速上线,就必须得采用单体架构。然后随着业务的增长,架构才得以演进。
还是那句话,架构不是一成不变的,而是持续演进的。或许,微服务也不是终点。
第3讲
来自@Wacky小恺
在目前的信息技术行业中如果按照严谨的SOA架构去设计系统那么不仅为开发人员带来了负担也加重了用户的学习成本使得在快速迭代中需求会被架构所限制。
我认为软件的设计应当为简洁的、无门槛使用的比如国民产品微信不需要过多的学习成本即可使用。而SOA的风格是自上向下的工业标准自然不符合时代的潮流“不接地气”因而就会被时代所抛弃。
来自@Frank
我之前也使用过SOAP协议来开发服务那时候我们公司自己搞了一个ESB但是好景不长。一开始是所有服务调用均走ESB不过后来由于某些原因直接绕过了ESB当时我其实并不理解为什么要这么做。后面随着不断学习才慢慢明白之前搞得ESB服务之间的协议等等的 “太重”了,实施维护成本很高,不适合自身业务的发展。
第4讲
来自@陈珙
我做.Net实施微服务的时候当时业界还没有特别成熟的选型与方案所以自己在组件、方案之间选型对比、整合花了不少的功夫。
老师说架构师是做平衡与取舍,而开发工程师是实施。我也这么认为。微服务的分而治之、化繁为简的思想是减少了业务开发复杂度,但同时引入了很多组件支撑服务,因此加大了技术复杂度。
我自己是有几条设计原则的,如下:
技术服务于架构,架构服务于业务;
康威定律;
架构的实施是需要对应开发模式支撑的。
那总结起来就是业务规模与团队规模决定了架构的规模一个增删查改的系统并不需要用微服务架构使用了前后端分离那么团队里多数是有前端工程师由微服务架构拆分引起的量变导致质变结合DevOps能更好地支持运作。
来自@Mr.Chen
其实用不用微服务架构,主要取决于业务,撇开业务谈架构都是在耍流氓!
我们公司面向企业私有化的项目就没有用微服务,主要是用户的并发量小,考虑到部署和运维的简单,直接上单体架构。
第5讲
来自@zhanyd
软件架构的发展方向,是慢慢地把与业务无关的技术问题,从软件的层面剥离出来,在硬件的基础设施之内就被悄悄解决掉,让开发人员只专注于业务,真正“围绕业务能力构建”团队与产品。
把复杂的问题交给计算机硬件解决,使得开发人员只需要关注业务,让开发越来越简单,同时能够调用的计算机资源也会越来越强大。
这也符合奥卡姆剃刀原则:“如无必要,勿增实体”。如果问题能让计算机自动解决,就不要麻烦人类。
来自@Jxin
分布式架构发展到服务网格后,真的是到达“最好的时代”了吗?我的回答是:没有最好,只有更好。
云原生下SLS的FaaS和服务网格的纯应用包这两个各自的需求差异还是挺大的。前者算是技术架构上对效率和成本的创新后者算是业务架构上对技术分离的追求。这是两个发展分支但是也不知道会不会产生新的问题。
不过,业务知识的易传递性、代码的开发、软件发布的效率、高可用和高性能的诉求,等等,这些在可见的未来,应该还会是需要持续解决的问题。
第6讲
来自@大D
2011年我刚毕业进公司开始使用Mule、ESB做集成当时我也是初次接触WebService这一套东西SOAP、WSDL等等用了一年也没搞明白都是干啥用的感觉就是俩字“复杂”。再后来公司的产品采用OSGI的方式自己通过订制Eclipse插件的方式开发了一套IDE每次打包要勾选一堆的依赖解决依赖冲突、查找依赖苦不堪言。这些东西本身就有很多技术壁垒和学习成本。
再后来Maven流行开始各种分模块后面公司用MQ实现了一套总线现在看来它就类似于老师讲的事件驱动架构这个架构还是要自己解决很多负载、补偿、事务等问题不过总体来说比之前有进步。
然后直到微服务的出现,感觉轻松了很多,框架层面的东西已经有了很多的解决方案,选择一个合适的就行,其他的专注于业务开发即可。
现在的年轻人确实赶上了一个好时代,不用理解那么多的复杂实现,可以更多地磨练自身编码能力。但我觉得经历过的都是财富,不然也不会对老师的课程产生强烈的共鸣。
来自@walkingonair
我正在腾讯云上摸索无服务的架构模式,完全赞同老师的说法。选择无服务的初始原因是由于微信小程序生态的强大,在腾讯云上进行产品的开发,能大大降低人力成本、运维成本,提高产品的开发速度,帮助创业小公司度过艰难的初期。
同时,无服务的架构模式,也能在业务量快速上升时,只需要简单增加成本投入,即可快速提高整个架构的业务承载能力,满足未来更大的业务增长。
但这种架构模式的不足也是十分明显的:
我虽然是一个全栈开发工程师但是平常使用最多的还是Java语言而Java的运行离不开Java虚拟机那么在这种架构下使用Java开发的云函数性能上能得到保证吗这个问题我保持怀疑态度这也导致我在语言方面选择的是Node而且它也更适合小程序开发者。
虽然无服务与编程语言无关,但是工程师的开发能力与语言有关,代码的规范、设计、管理方面与语言有关。就像老师所说的,做到普适性还有很长的路要走。
由于无服务架构对非业务层(云函数)的封装,一些特殊需求变得难以实现。例如云数据库的封装和限制,使基于云函数的开发、批量数据变得难以处理,函数运行的超时时间限制和数据库对大批量获取的限制等等,都是瓶颈。
无服务架构虽然屏蔽了除业务开发外的实现但是也对开发人员提出了更高的要求。云函数的实现需要满足无状态、幂等的要求否则或许会出现“匪夷所思”的Bug。
当前云开发的各项功能还不完善,开发人员权限的管理、各种资源的授权分配、云函数和云数据库等产品的管理在大型企业的模式下难以适用。
总而言之,云开发有着诱人的优点,但也有一些致命的不足。从架构演化的角度来说,无服务架构未来值得期待,这也是我选择无服务架构的最大原因。