今天给大家介绍一下微服务开发框架 SpringCloud。
概述
微服务架构是当前软件开发领域的技术热点。它在各种博客、社交媒体和会议演讲上的出镜率非常之高。大家以前可能或多或少听说过些许。然而微服务似乎又是非常虚幻的——我们找不到微服务的完整定义,以至于很多人认为这是一个概念的炒作。
单体应用
一般讲到微服务架构,都会提到单体应用。首先来说说单体应用:
一个归档包(比如 war 包)包含的所有功能的应用程序。在项目中我们通常将需求分为三个主要部分:数据库、服务端处理、前端展现。在业务发展初期,由于所有的业务逻辑在一个应用中,开发、测试、部署都还比较容易且方便。这种通常称为单体应用。这也就是现在称之为单体应用架构的方法论。
尽管该应用已经进行了模块化,但由于 UI 和若干业务模块最终都被打包在同一个 War 包中,改 war 包包含了整个系统所有的业务功能,这样的应用系统成为单体应用。 相信很多项目都是从单体应用开始的。单体应用比较容易部署、测试,在项目初期,单体应用可以很好地稳定运行。然而,一般项目都会随着需求而不断的变化以及增加,越来越多的人加入到项目的开发团队,代码库也在飞速地膨胀。慢慢地,单体应用变得越来越臃肿,可维护性、灵活性逐渐降低,维护成本越来越高。
因此,我们可以从中看出单体应用会面临的一些问题:
- 复杂性高
在大型单体应用中一般会包含的模块非常多、模块的边界也非常模糊、依赖关系不清晰、代码质量参差不齐、混乱地堆砌在一起,这些将导致整个项目非常复杂。每次修改代码都心惊胆战,甚至添加一个简单的功能,或者修改一个 Bug 都会带来隐藏的缺陷。
- 技术债务
随着时间推移、需求变更和人员更迭,会逐渐形成应用程序的技术债务,并且越积越多。
- 部署频率低
随着代码的增多,构建和部署的时间成本也会上升。一般修复或者新增功能都可能需要重新部署整个应用。这种全量部署的方式耗时长、影响范围大、风险高,使得单体应用项目上线部署的频率较低。
- 可靠性差
某个应用 Bug 可能会导致整个应用的崩溃。
- 扩展能力受限
单体应用只能作为一个整体进行扩展,无法根据业务模块的需要进行伸缩。例如,应用中有的模块是计算密集型的,它需要强劲的 CPU;有的模块则是 IO 密集型的,需要更大的内存。由于这些模块部署在一起,不得不在硬件的选择上作出妥协。
- 阻碍技术创新
单体应用往往使用统一的技术平台或方案解决所有的问题,团队中的每个成员都必须使用相同的开发语言和框架,要想引入新框架或新技术平台会非常困难。
下面着重介绍微服务架构:
微服务架构风格是一种将一个单体应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用 HTTP资源API)。这些服务围绕业务能力构建摒弃人可通过全自动部署机制独立部署。这些服务共用一个最小型的集中式的管理,服务可用不同的语言开发,使用不同的数据存储技术。——引自Martin Fowler 的博客
最直观的区别如下:
那么从上面的描述中可以看到,微服务加否应具备以下特性:
- 每个微服务可独立运行在自己的进程里,做到了进程隔离。
- 一系列独立运行的微服务共同构建起整个系统。
- 每个服务为独立的业务开发,一个微服务只关注某个特定的功能,例如订单管理、用户管理等。
- 微服务之间通过一些轻量级的通信机制进行通信,例如通过 RESTful API 进行调用。
- 可以使用不同的语言与数据库存储技术。
- 全自动的部署机制。
还是以之前的电商平台系统为例,使用微服务架构来架构该应用,如下图:
将整个应用拆分为多个服务,各个微服务独立运行在自己的进程中,并分别有自己的数据库,微服务之间使用 REST 或者其他协议通信。
当然,在软件领域,没有万能的解决方案。同样的,微服务也存在一定的不足:
- 运维要求较高:
更多的服务意味着更多运维的投入。在单体应用架构中,只需要保证一个应用的正常运行。而在微服务当中,需要保证几十甚至几百个服务的正常运行与协作,这给运维带来了很大的挑战。
- 分布式系统固然的复杂性:
使用微服务构建的是分布式系统。对于一个分布式系统,系统容错、网络延时、分布式事务等都会带来巨大的挑战。
- 重复劳动:
很多服务可能都会使用相同的功能,而这个功能并没有达到分解为一个微服务的程度,这个时候,可能各个服务都会开发这一功能,从而导致代码重复。
如何实现微服务架构以及技术选型
通过上面的介绍,我们不仅知道了微服务架构的定义及其缺点,还总结了一些指导性的原则,为合理架构微服务提供了理论支持。
技术选型
开始进入真正的主角介绍,Spring Cloud开发框架。
Spring Cloud 是一个用于构建分布式系统的通用模块的工具集。
Spring Cloud 特点
- 约定优于配置
- 适用于各种环境
- 隐藏了组件的复杂性
- 开箱即用
- 轻量级的组件
- 丰富的组件,比如:服务发现、断路器、微服务网关等,后面实验将会一一介绍。
- 灵活,Spring Cloud 的组成是解耦的,开发人员可按需灵活挑选组合。
更多关于 Spring Cloud 的信息可以去官网查看:spring.io。
参考资料:https://www.lanqiao.cn/courses/1360
如果觉得对你有帮助的话就点个赞关注一下吧!