这是我参与「第三届青训营 -后端场」笔记创作活动的第3篇笔记。
定义
架构,又称软件架构,是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。
通俗一点来说就是,实现一个软件有很多种方法,架构在方法选择上起着至关重要的指导作用。
对于架构的重要性,就好比地基一样:地基没打好,大厦容易倒;地基坚实了,大厦才能盖得高;站在巨人肩膀上,才能看得远。
问题
这里我们以兰师傅开蛋糕坊为例,需要解决如下问题:
- 如何做蛋糕?刚开始采用独家秘方,还是亲自做比较好
- 如何卖蛋糕?刚开始客流量应该不大,边做边卖
看起来问题都解决了,开张!
单机
软件系统需要具备对外提供服务,单机,就是把所有功能都实现在一个进程里,并部署在一台机器上。
优点:简单
问题:C10K问题,运维需要停服
ps: C10K 问题是一个优化网络套接字以同时处理大量客户端连接的问题。 C10K 表示处理 10000 个并发连接。注意这里的并发连接和每秒请求数不同,虽然它们是相似的:每秒处理许多请求需要很高的吞吐量(快速处理它们),但是更大的数量并发连接需要高效的连接调度。
图例:
演进:为了卖更多的蛋糕,多雇了几个蛋糕师傅。
单体、垂直应用|垂直切分
单体架构类似于分布式部署。
垂直应用架构:按应用垂直切分的单体
优点:水平扩容,运维不需要停服
问题:职责太多,开发效率不高;爆炸半径大。(每个师傅需要做每种蛋糕的一整套工序)
图例:
演进:为了提高做蛋糕效率,开始分工协作
SOA、微服务|水平切分
SOA(Service-Oriented Architecture)
- 将应用的不同功能单元抽象为服务
- 定义服务之间的通信标准 微服务架构:SOA的去中心化演进方向
图例:
问题:
- 数据一致性(装货台共交付了多少蛋糕)
- 高可用(这么多师傅,如何合作?)
- 治理(烤箱坏了,怎么容灾?)
- 解耦 vs 过微(拆分成这么多服务,运维成本高了,值当么?)
结论
-
架构的演进初衷:好比做蛋糕 需求量越来越大,终归要增加人手
越做越复杂,终归要分工合作 -
架构的演进思路:就像切蛋糕。蛋糕越来越大,一口吃不下终归要切分。 竖着切(垂直切分)
横着切(水平切分)