微服务架构和单体架构

一、微服务架构和单体架构

微服务架构

什么是微服务

微服务架构的系统是一个分布式的系统,按业务进行划分为独立的服务单元,解决单体系统的不足,同时也满足越来越复杂的业务需求。

微服务架构就是将单一程序开发成一个微服务,每个微服务运行在自己的进程中,并使用轻量级的机制通信,通常是HTTP RESTFUL API。这些服务围绕业务能力来划分,并通过自动化部署机制来独立部署。这些服务可以使用不同的编程语言,不同数据库,以保证最低限度的集中式管理。

总结起来微服务就是将一个单体架构的应用按业务划分为一个个的独立运行的程序即服务,它们之间通过HTTP协议进行通信(也可以采用消息队列来通信,如RoocketMQ,Kafaka等),可以采用不同的编程语言,使用不同的存储技术,自动化部署(如Jenkins)减少人为控制,降低出错概率。服务数量越多,管理起来越复杂,因此采用集中化管理。例如Eureka,Zookeeper等都是比较常见的服务集中化管理框架。

clipboard.png

优势

  1. 轻巧

    将复杂的业务拆分成多个小的业务,每个业务拆分成一个服务,将复杂的问题简单化。利于分工,降低新人的学习成本。

  2. 细分业务

    微服务系统是分布式系统,业务与业务之间完全解耦,随着业务的增加可以根据业务再拆分,具有极强的横向扩展能力。面对搞并发的场景可以将服务集群化部署,加强系统负载能力。

  3. 功能独立

    服务间采用HTTP协议通信,服务与服务之间完全独立。每个服务可以根据业务场景选取合适的编程语言和数据库。

  4. 不影响其他功能

    微服务每个服务都是独立部署的,每个服务的修改和部署对其他服务没有影响。

  5. 不受技术限制

    在微服务中,我们可以结合项目业务及团队的特点,合理地选择技术栈

微服务设计要点

  1. AKF拆分原则
  2. 前后端分离
  3. 无状态服务
  4. Restful通信风格

传统单体架构

什么是单体架构

在软件设计的时候经常提到和使用经典的3层模型,即表现层,业务逻辑层,数据访问层。虽然在软件设计中划分了3层模型,但是对业务场景没有划分,一个典型的单体架构就是将所有的业务场景的表现层,业务逻辑层,数据访问层放在一个工程中最终经过编译,打包,部署在一台服务器上。此时服务架构如图:

clipboard 1.png

一个归档包(例如war格式)包含了应用所有功能的应用程序,我们通常称之为单体应用。架构单体应用的方法论,我们称之为单体应用架构。

单体架构的优点

  1. 结构简单,容易理解

    对于开发人员而言,这是非常重要的一点。经典的分层架构已经相对比较成熟,更容易被更多的开发人员所理解和接受,学习成本也相对比较低,对团队本身的要求也不是特别高。这不仅使得系统的设计和开发都相对比较容易,而且出错的几率会相对低一些。用现在时髦的词语说,就是“坑相对较少”,开发实现都可以“踩在踩坑人的背上前进”

  2. 实现数据一致性相对比较容易

    通过本地事务或者分布式事务可以方便有效地保证数据一致性

  3. 部署简单方便

    可以方便快速地打包成WAR包,部署到Jetty或者Tomcat容器中。一次部署完成即可运行整个应用程序

总结起来,这种架构大致可以使用下图表示,各层组件可以通过相互引用进行相互调用,也可以通过IoC/DI实现解耦,进而实现应用程序“一体化”,这也是“单体架构”一词的由来:

单体架构存在的问题

  1. 系统仍然为单体应用

    大量的业务必然会有大量的代码,代码的可读性和可维护性依然很差。

  2. 存在瓶颈

    面对海量的用户,数据库将会成为瓶颈,解决方案将使用分布式数据库,也就是将数据库进行分库分表。

  3. 持续交付能力差

    业务越复杂,代码越多,修改代码和添加代码所需的时间越长。新人熟悉代码的时间长、成本高。

参考资料

漫谈单体架构与微服务架构(上):单体架构

微服务设计、拆分原则