前面已经聊到了如何做高层架构设计,并开始让设计落地,去划分了系统边界,进行了服务和模块的拆分,也就是系统的整体轮廓已经有了。
接下来,就该来做整体的技术架构设计了。
其实做架构设计一点都不神秘,都是有章可循,有方法可依的。
一:做整体的技术架构设计的基本方法:
其实做整体技术架构的方法相对简单,就是一个不断做决策的过程。
最后把你的各个决策的结果组合起来,就是整体的技术架构了。
虽然方法很简单,但这个阶段的责任重大。架构的好坏,决定了后期开发的难易程度;也决定了系统性能的好坏、系统的稳定性、安全性、可扩展性等等的。
项目架构好坏,也间接影响了项目的工期、成本、人力等等的。可以这么说,架构的好坏,基本上决定了项目的成败。
方法看似简单,但是对架构师的能力要求是比较高的,技术知识的广度、深度,技术架构设计的经验等,都会有较高的要求。
解决一个问题,通常都不只一种方法,也就是架构师要有很多备选的方案,然后就需要做决策,到底用A方案好,还是B方案好呢?
这就取决于架构师对它们理解的深度了,经过比较他们的适用场景、优点缺点,再综合考虑项目的实际需要,才能决策出具体要选用哪个方案,并给出令人信服的依据或理由。
这也就是我们经常说的,最合适的方案才是最好的方案。
二:做整体的技术架构设计的基本步骤
步骤一:根据应用风格来确定技术架构的风格
比如是一个单体应用还是一个分布式的应用,这就是应用风格。
假如就是一个小管理软件,公司内部使用,一共也就几十个人用,做个单体应用,Tomcat和数据库放一台服务器部署就可以了。
或者是一个单体集群的应用,规模比单独一个应用部署稍大一些,需要部署多个Tomcat,前面再配上Nginx做反向代理和负载均衡。
也有可能是分布式应用,或者是微服务应用,大数据分析应用,人工智能AI应用,等等的。
不同的应用风格,需要使用的技术组合是不一样的,技术架构形式也是不一样的。
架构师就需要根据不同的应用风格,结合系统实际要求,来选择使用不同的技术架构形式,并结合实际应用进行调整。
比如说是微服务的应用,可能主要的选择就是Springboot+SpringCloud体系;但也有从早期Dubbo转过来的,现在Dubbo3.x也出来了,也可以选用Dubbo来实现微服务。
又比如大数据分析的应用,可能会考虑Hdoop体系;AI应用可能会考虑Python+Tensorflow等等。
不管怎么选择,在这个阶段,架构师需要做一个决策,把技术架构方案的风格和基本技术路线确定下来。
步骤二:确定基础框架
确定好技术架构风格和基本技术路线过后,就该来确定基础框架了。
比如我们前面确定了是微服务的架构形式,选的技术路线是Springboot+SpringCloud,那好,这里就要把基础的框架确定下来。
比如单个服务使用Springboot+SpringMVC+Spring+Mybatis,每个服务部署在Docker里面。至于SpringCloud,还需要考虑版本,是选1.5.x还是选2.x的,里面的技术组件是不一样的。
比如选了SpringCloud2.x的,就要来确定内部组件怎么选择,怎么组合,一种可能的选择是:SpringCloudGateway+Nacos+Feign+LoadBalancer+Sentinel+Seata等等的。
总之,这个步骤里面,把要使用到的基础框架确定下来。
步骤三:确定基本技术栈
在确定的基础框架之上,通盘考虑整个项目要用的主要技术,把它们确定下来,并明确好版本。
除了前面提到的,还需要考虑其它要使用的技术,比如:
缓存体系:Redis6.x
MQ:Kafka2.8
分库分表:ShardingSphere5.x
搜索引擎:ElasticSearch7.x
数据库:Mysql8.x
等等的吧,一个项目涉及很多技术,有些是开发上用,还有部署需要的,比如Nginx,还有运维需要的,比如Zabbix等等。
这些都要确定下来,后面的架构设计和详细设计,就需要在这里确定的圈子下来进一步细化了。
步骤四:组合技术栈中的技术和框架,形成初步的整体技术架构
前面是不断选择,不断决策,把要用到的东西都选出来,然后呢?
就需要把它们有机地组合起来,形成一个整体,这样就得到了一个初步的整体技术架构了,是不是很简单?
最后,架构师把这个组合,画图展示出来,就是整体技术架构设计图;把选择过程,选择理由,选择目的,解决了什么问题等内容,写成文档,就是整体技术架构设计文档了。
步骤五:对初步的整体技术架构进行细化
在确定的初步的整体技术架构基础上,进一步细化,完善整个技术架构设计。
通常是结合系统的一些重难点问题,深入到每一种技术里面,明确采用什么方式,什么架构,怎么组合,来具体解决这些问题。
比如:系统实现中会用到分布式锁,如果前面确定使用Zookeeper来实现,那好,具体使用Zookeeper的什么特性来实现,大致实现的机制是怎样的?可能会出现什么样的问题?怎么解决或预防这些问题?等等,都是细化的内容。
把所有