2019/09/01 Approaches to Architecture Development

架构是解决问题的过程和方案。架构不是一成不变的,一个问题可以用不同的架构来解决,但是肯定有一种架构是最合适的。所以架构没有好坏,只有是否合适。如果我们脱离了实际问题讨论架构,那将是空中楼阁。架构是经验的总结和提炼,经过不断的抽象,逐渐形成以下几种架构。

Monolith 架构

Monolith 就是单体应用程序,即单个应用程序包含所有的功能,一个应用就是一个进程。
3dNjRs.png
单体架构是我们最熟悉的一种架构,它的优点很明显,易于开发,测试,部署和扩展。同时它的缺点也很明显,就是所有功能耦合在一起,修改任何一个功能,都需要对所有功能进行测试,不利于做持续集成和发布。所以如果我们的场景不需要持续集成持续发布,那么单体架构是非常不错的选择。

分层架构

在单体应用中,往往我们为了开发和维护方便,我们会将软件划分成多个层次,比如常见的 3 层架构:表现层,业务层和数据访问层。
3dUioF.png
每一层都有清晰的角色和分工,层与层之间通过接口通信,如果多人协同开发,不同的人员负责不同的层,每一层都是相对独立的,可以单独进行测试和部署。这对于大型的公司或是多人协同开发是非常合适。这种水平分层架构解决了功能耦合的问题,但是增加了调试和定位问题的难度,同时也对部署的要求更高。

SOA 架构

SOA 即面向服务的架构,它和分层架构的思想类似。水平分层是从功能层面解耦,而 SOA 则是从业务层面进行解耦。
3dUYQI.png
优点是业务比较独立,服务之间通过接口通信,内部调整不会影响其他服务。但是我们同时也会看到对业务的划分比水平层次的划分更难。

微服务架构

微服务架构,是在 2014 年由 James Lewis 和 Martin Fowler 提出的,更多信息可以参考 https://www.martinfowler.com/articles/microservices.html 。简单来说微服务架构就是水平分层架构 + SOA 架构。
3dUwTS.png
水平分层架构有业务耦合,SOA 架构有功能耦合,微服务架构在垂直方向进行业务解耦,在水平方向进行功能解耦,完全解决了耦合性的问题。其优势在于各个服务之间耦合度低,具有很好的扩展性。每个服务可以单独开发,测试和部署,单个服务调整不会影响其他服务,利于做持续集成和发布。各个服务拆分开来,不用再囿于相同的语言和环境,各个团队可以根据自身的技术选择实现方式。凡事有两面,我们不能光看到微服务架构的优点,同时我们也应该清楚微服务架构的缺点。由于要解耦,服务会被拆分成大量的微服务,而服务之间需要进行通信这就导致系统的变得极为复杂。同时由于通信链路变多,微服务的性能和单体架构相比会有所损失。还有在服务被拆分之后,在分布式环境中,数据的一致性也变得难以保证,需要我们额外使用一些手段来保证数据一致性。在大量的微服务面前,也对运维提出了极高的要求,所以虽然微服务在当下十分流行,但是在架构选择的时候还要根据自身的情况进行衡量,不要盲目跟风。

服务网格架构

Service Mesh 服务网格架构是由 Linkerd 提出的一种微服务架构,伴随着微服务的流行,Service Mesh 也越来越被人们关注。在微服务时代,服务治理是微服务架构的首要难题和痛点。微服务通过水平拆分功能解耦,垂直拆分业务解耦,已经极大降低了耦合性。但是微服务之间要通信,那么每个微服务中又必须包含相关的通信组件。通信和业务耦合不利于业务快速迭代,同时也不利于通信组件的升级。所以在这种情况下,Service Mesh 就将通信从服务中剥离出来,从而提高业务的迭代速度和降低通信组件的维护难度。
3dUH61.png