北哥在前文陆续总结了程序员成长所具备的核心能力,以及Java程序员成长过程中应学习的基础知识。
在一个Java程序员工作3、5年之后,已经可以承担起大部分的核心开发工作,成长为团队中的高级开发人员。大部分工作中遇到的问题都已经可以自行解决。这个阶段很多同学会面临着新的成长困惑,到底接下来自己还需要在哪些方面继续提升?如何能够成长为团队里面的架构师呢?
市面上有很多分析和拆解架构师能力的书籍,例如《聊聊架构》《亿级流量网站架构核心技术》《大型网站技术架构:核心原理与案例分析》等,书中有一些相关的实战和理论知识分享。这些书籍如果有时间推荐大家去读一读。
今天北哥结合自己工作中的经验,也来浅谈一下如何做应用系统架构设计。
需要说明的是,架构师本身要求的是综合能力,架构也分为业务架构、应用系统架构、技术架构、数据架构等多个维度多个细分领域,但今天分享的关于架构的相关内容,更多还是侧重在服务端的应用系统架构。
01 指导思想
作为一个架构师,在做应用系统架构时,最好逐步沉淀自己的一套指导思想,指导思想用于在做架构设计过程中遇到困惑或遇事不决时的一个指引。我个人总结下来的经验有以下三点
-
平衡和取舍
架构是一个复杂的工作,既要考虑当下的需求,还要关注未来可能的变化;既要考虑的足够全面,还要简单容易实现;既要衡量实现成本,还要关注落地的效率。这些无不意味着在做架构时需做好平衡,学会取舍。
-
迭代和演进
一个好的架构,一定是经过长期迭代演进而来的。在做架构设计时,受限于当前已经明确的需求,往往无法对未来考虑的那么全面。即使在做架构设计时已经考虑到了方方面面,系统上线后也会遇到一些新的未知问题,并且随着需求的不断迭代,又会引入新的变化和挑战,因此持续的对架构做优化和迭代演进,是必须要重视的。
-
聚焦业务需求
没有毫无瑕疵完美的架构,也没有一成不变适合所有业务的架构,只有适合当前业务和产品需求的架构。我们可以借鉴、吸收别人的经验和实践总结,但最合适的架构一定是结合业务的实际需求设计和演变出来的。脱离业务需求设计的架构一定会在开发中遇到新的问题。
02 架构设计目标
在做应用系统架构设计时,应遵循一些普适的架构设计目标。这些目标包括
-
可实现的:架构被设计出来,一定是需要能够被实现和落地的,如果设计架构所采用的技术还没成熟或不具备生产环境可用性,这种架构只能停留在理论阶段,不具备落地的可行性,这样的架构也就没有特别大的价值和意义。
-
可扩展的:虽然无法预知需求未来的变化,但有些场景下,我们设计的架构也应该具备当用户量、带宽、数据量等增长时,具备较好的扩展性;除此之外,在做需求分析时,把系统、领域服务甚至模块做好规划和设计,能够合理的应对未来需求膨胀可能带来的问题,也是架构可扩展性的一种体现。
-
高可用的:系统架构需要考虑各种异常情况下系统可用性,如流量的突然爆发的消峰限流,某个服务或接口故障后的降级等,通过在架构中设计的各种措施保障整个应用系统是高可用的