一、单体架构
1.什么是单体架构?
一个归档包(例如war格式)包含了应用所有功能的应用程序,我们通常称之为单体应用。架构单体应用的方法论,我们称之为单体应用架构。(就是一个war包打天下)
单体架构示意图:
优点:
1: 架构简单明了,没有”花里胡哨“的问题需要解决,排查问题时只需要排查这个应用就可以了,更有针对性。
2:在系统功能不是很臃肿下,代码文件小的情况下,部署简单(尤其是运维人员 睡着都会笑醒)
3.成本低,节约了服务器资源,在公司业务处刚开始阶段且团队人数不大的情况下比较适合。
2.单体架构的痛点
缺点一:项目过于臃肿,耦合严重
当大大小小的功能模块都集中在同一项目的时候,整个项目必然会变得臃肿,让开发者难以维护,即项目的复杂性将不断扩大。
业务复杂度增加,一个项目即会设计到订单,支付,用户,商品等模块的业务开发维护起来简单,还是只做订单模块的开发维护简单不言而喻。
迭代更新速度慢,因为可能牵一发而动全身,所以测试困难,在团队人数大的情况下无法快速迭代
缺点二:资源无法隔离
整个单体系统的各个功能模块都依赖于同样的数据库、内存等资源,一旦某个功能模块对资源使用不当,整个系统都会被拖垮如某个线程一直占着数据库连接不释放,将耗尽连接池。或者对cpu消耗过高将影响其他线程的处理性能。且多个模块共用一个jvm进程,进程资源紧张。
缺点三:无法灵活扩展
当系统的访问量越来越大的时候,单体系统固然可以进行水平扩展,部署在多台机器上组成集群:
但是这种扩展并非灵活的扩展。比如我们现在的性能瓶颈是支付模块,希望只针对支付模块做水平扩展,这一点在单体系统是做不到的。
缺点四:部署困难
能想像下一个来自200W+代码部署的速度(15分钟)。
如果只对某一个模块做了修改,那么其他模块也要对应上线,测试回归量大。
缺点五:只能用一种语言开发
1.单体应用编程语言都是一样的,某些服务可能用其他语言开发可能会更好
2.阻碍了新技术的发展。比如我们的web架构模块 从struts2迁移到springboot,那么就会成为灾难
二、微服务架构
2.1 什么是微服务?
微服务(Microservice Architecture)是近几年流行的一种架构思想,关于它的概念很难一言以蔽之。
究竟什么是微服务呢?我们在此引用 ThoughtWorks 公司的首席科学家 Martin Fowler 的一段话:
- 简而言之,微服务架构风格是一种将单个应用程序作为一套小型服务开发的方法,每种应用程序都在自己的进程中运行,并与轻量级机制(通常是HTTP资源API)进行通信。这些服务是围绕业务功能构建的,可以通过全自动部署机制独立部署。 这些服务的集中管理最少,可以用不同的编程语言编写,并使用不同的数据存储技术。
自己理解:
简单说就是将一个完整的应用(单体应用)按照一定的拆分规则(业务领域拆)拆分成多个不同的服务,每个服务都能独立地进行开发、部署、扩展。服务与服务之间通过http,消息,rpc等方式进行调用和通信。
2.2 微服务特点
1.独立部署,灵活扩展
传统的单体架构是以整个系统为单位进行部署,而微服务则是以每一个独立组件(例如用户服务,商品服务)为单位进行部署。
故微服务可以适用于快速迭代,快速交付需求场景。
2.资源的有效隔离
微服务设计的原则之一,就是每一个微服务拥有独立的数据源,假如微服务A想要读写微服务B的数据库,只能调用微服务B对外暴露的接口来完成。这样有效避免了服务之间争用数据库和缓存资源所带来的问题。
3.团队组织架构的调整
微服务设计的思想也改变了原有的企业研发团队组织架构。传统的研发组织架构是水平架构,前端有前端的团队,后端有后端的团队,DBA有DBA的团队,测试有测试的团队。
而微服务的设计思想对团队的划分有着一定的影响,使得团队组织架构的划分更倾向于垂直架构,比如用户业务是一个团队来负责,支付业务是一个团队来负责,所以对服务的拆分意味着也是对团队的拆分,一般适合中型或者大型企业。
这种团队拆分也间接的提升了团队内的沟通效率,因为都是做同样业务的,沟通理解更快,而大团队人数越多,沟通的效率越低。
微服务与面向服务架构SOA的区别
SOA架构强调的是异构系统之间的通信和解耦合,是一种粗粒度的拆分。而微服务架构强调的是系统按业务边界做细粒度的拆分和部署。
2.3 微服务架构的优缺点
首先,我们需要阐述一下为什么需要分布式系统,而不是传统的单体架构。
使用分布式系统主要有两方面原因。
-
增大系统容量。我们的业务量越来越大,而要能应对越来越大的业务量,一台机器的性能已经无法满足了,我们需要多台机器才能应对大规模的应用场景。所以,我们需要垂直或是水平拆分业务系统,让其变成一个分布式的架构。
-
加强系统可用。我们的业务越来越关键,需要提高整个系统架构的可用性,这就意味着架构中不能存在单点故障。这样,整个系统不会因为一台机器出故障而导致整体不可用。所以,需要通过分布式架构来冗余系统以消除单点故障,从而提高系统的可用性。
1.优点
- 迭代更快、开发部署效率高
1.每个服务足