单体架构简介
传统的架构模式多是整体式架构即单体架构,单体架构的显著特征是整个系统实现包含在一个项目工程中,水平方向分为表现层、业务层和持久层,部署时打成一个 War 包运行在一个服务器中。这种架构方式适合小型项目,前期开发成本低, 但对于大型项目来说代码可读性差, 业务高度耦合, 不利于扩展,只能通过复制整个应用到多个服务器以集群的方式实现高性能需求, 这种方式因为后备服务器的存在而导致系统资源开销很大。 同时, 单体架构还阻碍了技术创新, 开发人员将一个系统改换成新的技术实现,将耗费巨大的工作量。
单体架构如图 2.1 所示,整个系统的不同业务功能包含在一个应用中,整体项目作为一个模块进行开发与部署。 如果系统中某个功能发生变更, 需要下线整个项目进行扩展或修复。当需要提高系统性能时,只能通过复制整个应用以搭建集群的方式来达到高可用、高性能的目的。
微服务架构简介
微服务架构已经成为面向服务软件行业的架构趋势[20]。 通过与整体应用进行对比, 微服务架构的特点得以产生, 它强调围绕业务,将系统划分为紧密业务功能的轻量级服务。微服务架构如图 2.2 所示,旨将系统划分为多个比一般服务粒度更细、 高内聚的业务模块, 重点突出“微”。 因此, 每个模块被称为微服务。 划分出的每个微服务独立开发并单独部署,可以拥有自己的技术栈,甚至使用不同的编程语言实现,对外提供一系列服务接口[21]。在运行期间, 服务器中的每个微服务可以按需扩展实例数量且每个服务实例运行在自己的进程内。微服务架构下数据去中心化管理, 各微服务拥有单独的数据库, 微服务之间通过轻量化的方式进行通信。
微服务架构的优势主要体现为以下几点:
- 单个微服务因为业务清晰、代码量少、容易理解,因此易于开发和维护;
- 某个业务功能发生变更只需修改对应的微服务,不影响其他服务的正常运行;
- 每个微服务独立部署,加快部署速度;
- 按照用户需要自由扩展服务实例, 达到高性能要求的同时又合理利用资源;
- 根据不同业务功能对应选择更合理的技术栈实现;
- 可以根据每个微服务组织开发团队。
同时, SOA(Service Oriented Architecture, 面向服务的架构) 作为一种设计方法,注重的是系统集成方面,使用企业服务总线(Enterprise Service Bus, ESB) 来实现,主张尽可能多的服务共享,而微服务侧重数据解耦,确定服务的边界[22][23]实现服务拆分,主张尽可能少的服务分享。随着互联网的发展、软件架构的更新演进、业务规模的扩大,导致 SOA 向更细粒度、更广泛化的微服务发展。因此, 微服务架构是 SOA 思想的体现,是 SOA 的一种特定方法或实践[24]。 微服务的出现使得企业或组织更容易、更有效的实现面向服务的架构。 表 2.1为 SOA 与微服务在方法理念、实现方式、部署等各方面的特征比较。
随着云计算技术的发展与运用, 微服务架构下的应用适合在云环境中部署和运行。云环境下的软件不再是传统意义上的代码实体,而是由一系列微服务构成的服务综合体即云件[16]。微服务架构更好的顺应软件云化的趋势,已经被 Amazon、 NetFlix 等公司应用到系统中并获得了巨大的收益,是未来软件架构的方向。
SpringBoot与SpringCloud
开发框架SpringBoot
SpringBoot 是在 Spring 基础上产生,用来简化 Spring 应用初始搭建以及开发过程的一种框架。 SpringBoot 对于 Spring 应用的优化体现在开发、配置、部署运行和监控四个方面:开发方面, SpringBoot 利用注解的形式简化开发工作量。 文件配置方面, SpringBoot 将传统应用的 Xml 与 Properties 配置文件统一整合为 Yml 文件,按照统一的格式规范书写配置。 部署时, SpringBoot 可以内嵌三种服务器, Tomcat、 Jetty 和 Undertow, 因此, 只需具备 Java 运行环境即可运行 SpringBoot 项目, 而不再像传统应用那样按照流程部署 War 包。 监控方面,Actuator 包可以对 SringBoot 应用进行监控。另外, SpringBoot 对 Maven 的依赖配置进行了简化[26],将常用的依赖包进行整合,可以快速的建立一个 Spring 应用。
微服务架构中服务众多,如果单独手工建立所有微服务将会耗费时间和增加工作量,因此可以将 SpringBoot 作为单个微服务的开发框架。
治理框架 SpringCloud
SpringCloud 是一个基于 SpringBoot 实现的微服务架构治理工具[27], 它提供了一系列组件如服务注册、服务发现、客户端负载均衡、服务配置管理等来搭建分布式系统中的基本元素。SpringCloud 为全局的微服务治理提供了完整的解决方案。使用 SpringCloud 开发的应用程序适合在 Docker 或 PaaS(Platform-as-a-Service, 平台即服务) 上部署,所以又叫云原生应用[25]。
SpringBoot 可以脱离 SpringCloud 独立开发项目,但是 SpringCloud 不能脱离 SpringBoot,SpringCloud 依赖于 SpringBoot,二者属于依赖关系。