目录
1.认识微服务
1.1 单体架构
1.2 集群和分布式架构
1.3 微服务架构
1.4 微服务带来的优势与挑战
2.微服务解决方案 - Spring Cloud
2.1 什么是Spring Cloud
2.2 Spring Cloud版本
2.3 Spring Cloud实现方案
3.小结
从这篇文章开始,我将开始介绍微服务的相关知识。众所周知,微服务架构已成为现代软件开发的重要范式,它将复杂系统拆分为独立、可扩展的服务,提升了灵活性和开发效率。学习微服务不仅是掌握技术栈,更是理解分布式系统设计、团队协作和持续交付的核心理念。
学习微服务,就离不开Spring Cloud的学习。在学习 Spring Cloud 之前,我们先来了解下什么是微服务,以及微服务的发展史。在架构发展的过程中,项目开发遇到了哪些问题,以及 Spring Cloud 是用来解决什么问题的。这会对我们的学习有一定的帮助。
1.认识微服务
到底什么是微服务呢?简单来说,微服务是一种经过演变而来的服务架构。服务架构最早是单体的,也被称作单体应用,下图就很好地表示了服务架构从单体应用向微服务架构的转变:
我们先来看服务架构最早的样子——单体架构是什么样的。
1.1 单体架构
单体架构(Monolithic Architecture)是一种传统的软件设计模式,整个应用程序作为一个单一、紧密集成的单元构建和部署。很多创业公司早期或者传统企业会把业务的所有功能实现都打包在一个项目,这就是单体架构。像这样,业务的所有功能实现都打包在一个 war 包或者 Jar 包中,这种方式就称为单体架构。
我以大家都熟悉的电商平台为例。电商平台包括:用户管理,商品管理,订单管理,支付管理,库存管理,物流管理等等,一个项目早期会把这些模块都写在一个web项目中,然后统一部署到一个web服务器中去。
这种架构的优点在于:开发简单,部署简单,⼀个项⽬就包含了所有的功能,省去了多个项⽬之间的交互和调用消耗,直接部署在⼀个服务器即可。但缺点也很明显:随着功能增加,代码增多,维护成本上升。扩展性差,无法针对特定模块独立扩展。技术升级困难,全系统依赖同一技术栈。
因此,早期服务架构经过时间的推移,渐渐抛弃了这种架构,转头向新的服务架构靠拢。
1.2 集群和分布式架构
当网站的用户量越来越大,需求就会越来越多,用户量也会越来越大,服务可能会面临以下问题:
1.后端服务器压力越来越大,负载越来越高,可能出现无法访问的情况。
2.业务场景逐渐复杂。为了满足用户需求,单体应用也会越来越大,各个模块代码之间的耦合度也会越来越高。一旦出了任何一个问题,整个项目都要重新打包,构建,发布。
3.一个很微小的问题,可能导致整个服务挂掉。
因此,我们可以从两个方面进行优化:
横向:添加服务器,把单台机器变为多台机器的集群。
纵向:把一个应用按照业务进行拆分,拆分为多个项目。此架构也称为垂直架构。以单体结构规模的项目为单位进行垂直划分,也就是将一个大项目拆分为一个一个的单体项目,项目与项目之间比较独立,接口用于数据同步。
由此就引入了集群和分布式这两种概念。集群 (cluster)是将一个系统完整的部署到多个服务器上,每个服务器都能提供系统所有的服务,多个服务器间通过负载均衡调度完成任务。每个服务器称为集群的节点 (node)。分布式是将一个系统拆分为多个子系统,多个子系统部署在多个服务器上,多个系统上的子系统协同合作完成一个特定的任务。
举个例子:
假设有一个餐馆,这个餐馆只有一个厨师,因此这个厨师就要负责做饭相关的所有工作。随着餐馆生意的火爆,一个厨师逐渐忙不过来,因此这个厨师现在有两个选择:
1.再招聘一个厨师,两个厨师都负责做饭相关的所有工作。
2.将厨师的工作分为:洗菜,切菜,配菜,炒菜。招聘一个配菜师,负责洗菜,切菜,配菜,厨师只负责炒菜。
后面随着餐馆的生意更加火爆,一个配菜师也忙不过来了,就再招聘多个厨师,多个配菜师。
集群和分布式的区别和联系在于:
1.从概念上来看,集群是多个计算机做同样的事,分布式是多个计算机做不同的事。
2.从功能上来看,集群的每一个节点功能是相同的,并且是可以替代的。分布式也是多个节点组成的系统,但是每个节点完成的业务是不同的,一个节点出问题,这个业务就不可访问了。
3.从关系上来看,分布式和集群在实践中很多情况下是相互配合使用的。比如分布式的某一个节点,可以由一个集群来代替。分布式架构大多是建立在集群上的,所以实际的分布式架构设计中并不会把分布式和集群单独区分,而是统称为分布式架构。
1.3 微服务架构
在分布式架构下,当部署的服务越来越多,重读的代码就会越来越多,服务的调用关系也会越来越复杂。我们可以把一些通用的,会被多个上层服务调用的共享业务,提取成独立的基础服务,组成一个个微小的服务,这就是微服务。
因此,微服务架构是一种将应用程序拆分为多个小型、独立服务的软件设计模式。每个服务运行在自己的进程中,通过轻量级通信机制(如HTTP/REST或消息队列)交互,并围绕特定业务功能构建。这些服务可以独立部署、扩展和维护,通常由不同的团队负责开发。
简单来说,微服务就是很小的服务。小到一个服务只对应一个单一的功能,只做一件事。这个服务可以单独部署运行。
从这个角度来看,微服务架构其实是分布式架构的一种拓展,这种架构模式下它拆分粒度更小,服务更独立。我们可以理解为:微服务是一种经过良好架构设计的分布式架构方案。
我们再来看分布式架构与微服务架构的区别:
分布式:将服务进行拆分,拆了就行。
微服务:指非常微小的服务,更细粒度的垂直拆分,通常指不能再拆的服务。
分布式架构侧重于压力的分散,强调的是服务的分散化。而微服务侧重于能力的分散,更强调服务的专业化和精细分工。从实践角度来看,微服务通常是分布式架构。因此,选择微服务架构通常意味着需要解决分布式架构的各种难题。
1.4 微服务带来的优势与挑战
微服务架构带来好处的同时,也面临一些挑战,从单体服务转向微服务意味着管理更加复杂。接下来我们从优势和挑战这两个方面来分析微服务架构。
优势:
模块化与独立性。微服务架构将应用拆分为多个独立服务,每个服务负责特定功能。这种模块化设计便于开发、测试和部署,团队可以独立工作而无需频繁协调。
容错性高。一个服务发生故障,可以使故障隔离在单个服务中,不影响整体服务故障。
扩展性好。每个服务都是独立运行的,我们可以结合项目实际情况进行扩展,按需伸缩。
技术栈灵活。不同服务可采用适合其需求的技术栈(如编程语言、数据库),避免单一技术限制。例如,计算密集型服务可用Go,而数据分析服务选用Python。
挑战:
分布式系统复杂性。服务间通信(如RPC或消息队列)引入网络延迟、序列化开销和一致性问题。需处理分布式事务、幂等性等场景。
运维成本高。需管理大量服务的监控、日志收集和链路追踪。工具链(如Prometheus、ELK)的搭建和维护成本显著增加。
开发和测试。一个业务流程可能涉及多个微服务共同完成,服务调用引入网络延迟,不可靠的网络,如何进行容错处理等问题。这对开发和测试而言,难度也会上升。
负载均衡。微服务架构中的服务实例数量可能非常庞大,因此需要有效的服务发现和负载均衡机制来管理请求流量和保证高可用性。
2.微服务解决方案 - Spring Cloud
2.1 什么是Spring Cloud
为了解决微服务遇到的各种难题,Spring Cloud便应运而生。我们先来看官网的介绍:
Spring Cloud 是一套基于 Spring Boot 的微服务架构开发工具集,用于快速构建分布式系统中的常见模式(如配置管理、服务发现、断路器、智能路由等)。它通过封装 Netflix、Consul、Zookeeper 等第三方组件,简化了分布式系统的开发流程。
简单来说,Spring Cloud就是分布式微服务架构的一站式解决方案,是微服务架构落地的多种技术的集合。
Spring Cloud并非由Spring团队独立开发的框架,而是对现有优秀开源微服务解决方案的整合。它遵循SpringCloud规范,将不同公司维护的组件以SpringBoot风格进行封装,简化了配置和底层实现细节。这种设计让开发者能够快速投入微服务开发,无需关注复杂技术细节。Spring Cloud在此过程中扮演了微服务生态协调者的角色。
2.2 Spring Cloud版本
Spring Cloud是一个由很多子项目组成的庞大项目,这些子项目由各个公司来维护,所以发布阶段也是不同的。
为了管理主项目和子项目的依赖关系,以及为了避免和子项目版本冲突,主项目版本的命名并没有采用和子项目数字版本化的形式,而是采用了英文名称。但由于英文版本号太复杂了,从Hoxton之后,Spring Cloud的版本就变成了2020.0.0这样的日期版本号了。
Spring Cloud中的所有子项目都依赖SpringBoot,所以SpringBoot和Spring Cloud的版本之间也存在一定的对应关系:
2.3 Spring Cloud实现方案
Spring Cloud作为微服务架构的规范,拥有多个实现方案,其中最具代表性的是Spring Cloud Netflix和Spring Cloud Alibaba。
Spring Cloud Netflix是Netflix开源软件(Netflix OSS)在Spring Cloud标准下的实现,提供了一系列核心组件:
Eureka:服务注册与发现
Zuul:API网关
Ribbon:客户端负载均衡
Feign:声明式服务调用
Hystrix:熔断与限流
Hystrix Dashboard:监控面板
在早期阶段,Spring Cloud Netflix曾是Spring Cloud生态的默认一站式解决方案,甚至让许多人将“Spring Cloud”直接等同于“Spring Cloud Netflix”。然而,Netflix在2018年前后宣布其核心组件(如Hystrix、Ribbon、Zuul)进入维护模式,不再积极更新。这一变化促使Spring Cloud官方逐步移除相关维护模块,推动社区转向其他替代方案。
Spring Cloud Netflix并未从Spring Cloud依赖中完全移除,但从2020.0版本开始,仅保留对Eureka的支持。
Spring Cloud Alibaba 是阿里巴巴集团基于 Spring Cloud 规范实现的开源组件和云产品集合。该项目由阿里中间件团队主导开发,目前处于快速发展阶段,功能迭代频繁。
尽管 Spring Cloud Alibaba 尚未被列为 Spring Cloud 官方默认推荐方案,但其核心组件在融入 Spring Cloud 生态之前,就已经在众多企业级应用中广泛使用。该项目可视为继 Spring Cloud Netflix 之后的第二代 Spring Cloud 实现方案。
更多详细信息可参考官方文档: Spring Cloud Alibaba 官方介绍
Spring Cloud Alibaba 主要包含以下关键组件:
Nacos:服务发现与配置管理
Sentinel:流量控制与系统保护
Seata:分布式事务解决方案
Spring Cloud Alibaba 以 Spring Cloud Netflix 的设计思想为基础,通过性能增强实现了技术升级。在 Spring Cloud Netflix 停止维护的背景下,Spring Cloud Alibaba 迅速崛起并成为微服务开发的首选框架。
我们来看Spring Cloud的实现对比:
| Spring Cloud官方 | Spring Cloud Netflix | Spring Cloud Alibaba | |
|---|---|---|---|
| 服务注册/发现 | Eureka | Eureka | Nacos |
| 服务调用 | OpenFeign | Feign | Dubbo |
| 服务网关 | SpringCloudGateway | Zuul | SpringCloudGateway |
| 配置中心 | SpringCloudConfig | Archaius | Nacos |
| 负载均衡 | SpringCloud LoadBalance | Ribbon | Dubbo |
3.小结
本文从架构演进的角度出发,带大家回顾了从单体架构到集群与分布式架构,再到微服务架构的发展历程。可以看到,微服务并非凭空产生,而是为了解决传统架构在扩展性、维护性和技术灵活性等方面的痛点而逐步演化出来的。它以更细粒度的服务拆分、独立部署和灵活的技术选型,为现代大型应用开发提供了新的思路。
当然,微服务架构在带来诸多优势的同时,也引入了分布式系统固有的复杂性——服务发现、配置管理、负载均衡、容错处理等问题都需要专业的工具来解决。Spring Cloud正是为此而生的一站式解决方案,它整合了 Spring Cloud Netflix 和 Spring Cloud Alibaba 等多个生态实现,帮助开发者更高效地落地微服务架构。
在接下来的文章中,我们将深入 Spring Cloud 的核心组件,逐一拆解它们在微服务体系中扮演的角色与实战用法,敬请期待。