干货 | 什么是真正的架构设计?
Posted 小黑格子屋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了干货 | 什么是真正的架构设计?相关的知识,希望对你有一定的参考价值。
原文链接:http://www.itpub.net/2020/03/24/5703/
今天的干货开始之前
黑要说一件大事
前段时间黑做了一个调查问卷
最后效果甚好
小黑被奖励了鸡腿
所以小黑又肩负重任地来了
这次调查问卷和上次的还不太一样
这次是主要针对架构师进行调研
因为公司决定联合研究院和多家一线互联网公司
一起打造一套更有深度
更贴合企业需求的架构师课程
对大家的需求进行收集
为课程更符合大家提升的需求
扫码赶紧说出你的需求吧~
填完调查问卷
干货已经准备好了
大家可以尽情享用了
觉得有内容还不错的话
给小黑个在看哦
系统与子系统
模块与组件
框架与架构
-
系统性思考的合理决策 :比如技术选型、解决方案等。 -
明确的系统骨架 :明确系统有哪些部分组成。 -
系统协作关系 :各个组成部分如何协作来实现业务请求。 -
约束规范和指导原则 :保证系统有序,高效、稳定运行。
-
需求相对复杂 -
非功能性需求在整个系统占据重要位置 -
系统生命周期长,有扩展性需求 -
系统基于组件或者集成的需要 -
业务流程再造的需要
业务架构(俯视架构)
应用架构(剖面架构或逻辑架构图)
-
逻辑分层;子系统、模块定义;关键类。
-
接口协议:应用对外输出的接口。 -
协作关系:应用之间的调用关系。
-
一种是水平分(横向),按照功能处理顺序划分应用, 比如把系统分为web前端/中间服务/后台任务,这是面向业务深度的划分。 -
另一种是垂直分(纵向),按照不同的业务类型划分应用, 比如进销存系统可以划分为三个独立的应用,这是面向业务广度的划分。
数据架构
代码架构(也叫开发架构)
技术架构
部署拓扑架构图(实际物理架构图)
-
系统级 :即整个系统内各部分的关系以及如何治理:分层 -
应用级 :即单个应用的整体架构,及其与系统内单个应用的关系等。 -
模块级 :即应用内部的模块架构,如代码的模块化、数据和状态的管理等。 -
代码级 :即从代码级别保障架构实施。
-
战略设计 :业务架构用于指导架构师如何进行系统架构设计。 -
战术设计 :应用架构要根据业务架构来设计。 -
战术实施 :应用架构确定以后,就是技术选型。
单体应用
-
性能需求 :使用缓存改善性能 -
并发需求 :使用集群改善并发 -
读写分离 :数据库地读写分离 -
使用反向代理和cdn加速 ;使用分布式文件和分布式数据库
-
复杂性高 :以一个百万行级别的单体应用为例,整个项目包含的模块非常多、模块的边界模糊、 依赖关系不清晰、 代码质量参差不齐、 混乱地堆砌在一起。 可想而知整个项目非常复杂。每次修改代码都心惊胆战, 甚至添加一个简单的功能, 或者修改一个Bug都会带来隐含的缺陷。 -
技术债务 :随着时间推移、需求变更和人员更迭,会逐渐形成应用程序的技术债务, 并且越积 越多。 “ 不坏不修”, 这在软件开发中非常常见, 在单体应用中这种思想更甚。已使用的系统设计或代码难以被修改,因为应用程序中的其他模块可能会以意料之外的方式使用它。 -
部署频率低 :随着代码的增多,构建和部署的时间也会增加。而在单体应用中, 每次功能的变更或缺陷的修复都会导致需要重新部署整个应用。 全量部署的方式耗时长、 影响范围大、 风险高, 这使得单体应用项目上线部署的频率较低。而部署频率低又导致两次发布之间会有大量的功能变更和缺陷修复,出错率比较高。 -
可靠性差 :某个应用Bug,例如死循环、内存溢出等, 可能会导致整个应用的崩溃。 -
扩展能力受限 :单体应用只能作为一个整体进行扩展,无法根据业务模块的需要进行伸缩。 例如,应用中有的模块是计算密集型的,它需要强劲的CPU;有的模块则是IO密集型的,需要更大的内存。由于这些模块部署在一起,不得不在硬件的选择上做出妥协。 -
阻碍技术创新 :单体应用往往使用统一的技术平台或方案解决所有的问题, 团队中的每个成员都必须使用相同的开发语言和框架,要想引入新框架或新技术平台会非常困难。
分布式
-
降低了耦合度 :把模块拆分,使用接口通信,降低模块之间的耦合度。 -
责任清晰 :把项目拆分成若干个子项目,不同的团队负责不同的子项目。 -
扩展方便 :增加功能时只需要再增加一个子项目,调用其他系统的接口就可以。 -
部署方便 :可以灵活的进行分布式部署。 -
提高代码的复用性 :比如Service层,如果不采用分布式rest服务方式架构就会在手机Wap商城,微信商城,PC,android,ios每个端都要写一个Service层逻辑,开发量大,难以维护一起升级,这时候就可以采用分布式rest服务方式,公用一个service层。
微服务
-
易于开发和维护 :一个微服务只会关注一个特定的业务功能,所以它业务清晰、代码量较少。开发和维护单个微服务相对简单。 而整个应用是由若干个微服务构建而成的,所以整个应用也会被维持在一个可控状态。 -
单个微服务启动较快 :单个微服务代码量较少, 所以启动会比较快。 -
局部修改容易部署 :单体应用只要有修改,就得重新部署整个应用,微服务解决了这样的问题。 一般来说,对某个微服务进行修改,只需要重新部署这个服务即可。 -
技术栈不受限 :在微服务架构中,可以结合项目业务及团队的特点,合理地选择技术栈 。例如某些服务可使用关系型数据库MySQL;某些微服务有图形计算的需求,可以使用Neo4j;甚至可根据需要,部分微服务使用Java开发,部分微服务使用Node.js开发。
-
运维要求较高 :更多的服务意味着更多的运维投入。 在单体架构中,只需要保证一个应用的正常运行。而在微服务中,需要保证几十甚至几百个服务服务的正常运行与协作,这给运维带来了很大的挑战。 -
分布式固有的复杂性 :使用微服务构建的是分布式系统。 对于一个分布式系统,系统容错、网络延迟、分布式事务等都会带来巨大的挑战。 -
接口调整成本高 :微服务之间通过接口进行通信。 如果修改某一个微服务的API,可能所有使用了该接口的微服务都需要做调整。 -
重复劳动 :很多服务可能都会使用到相同的功能,而这个功能并没有达到分解为一个微服务的程度,这个时候,可能各个服务都会开发这一功能,从而导致代码重复。 尽管可以使用共享库来解决这个问题(例如可以将这个功能封装成公共组件,需要该功能的微服务引用该组件),但共享库在多语言环境下就不一定行得通了。
架构为业务服务,没有最优的架构,只有最合适的架构,架构始终以高效,稳定,安全为目标来衡量其合理性。合理的架构设计:
系统与子系统
业务需求角度
非业务需求角度
-
高可用 :要尽可能的提高软件的可用性,我想每个操作人都不愿意看到自己的工作无法正常进行 。黑盒- 白盒测试、单元测试、自动化测试、故障注入测试、提高测试覆盖率等方式来一步一步推进。
-
文档化 :不管是整体还是部分的整个生命周期内都必须做好文档化,变动的来源包括但不限于BUG,需求。 -
可扩展 :软件的设计秉承着低耦合的理念去做,注意在合理的地方抽象。方便功能更改、新增和运用技术的迭代,并且支持在适时对架构做出重构。 -
高复用 :为了避免重复劳动,为了降低成本,我们希望能够重用之前的代码、之前的设计。这点对于架构环境的依赖是最大的。
-
安全 :组织的运作过程中产生的数据都是具有商业价值的,保证数据的安全也是刻不容缓的一部分。以免出现XX门之类丑闻。加密、https等为普遍手段
-
遗漏关键性约束与非功能需求 -
为虚无的未来埋单而过度设计 -
过早做出关键性决策 -
客户说啥就是啥成为传话筒 -
埋头干活儿缺乏前瞻性 -
架构设计还要考虑系统可测性 -
架构设计不要企图一步到位
常见误区
- End -
以上是关于干货 | 什么是真正的架构设计?的主要内容,如果未能解决你的问题,请参考以下文章