Spring Cloud Alibaba快速入门01
文章目录
- 前言
- Spring Cloud和Spring Cloud Alibaba的关系
- 架构演进
- 单体架构
- 集群架构
- 分布式架构
- 环境准备
- 创建项目
- 创建父项目cloud-demo
- 创建子项目services
前言
随着微服务技术的发展,微服务(MicroServices) 的概念早已深⼊⼈⼼,也越来越多的公司开始使⽤微服务架构来开发业务应⽤。
如果采⽤得当,微服务架构可以带来⾮常⼤的优势。微服务架构的最⼤好处是它可以提升开发效率和系统整体的稳定性:
- 开发和部署相对简单:单个微服务的功能可以更快地更改,因为可以独⽴部署,影响范围更⼩,启动和调试单个微服务的时间成本相⽐于单体应⽤也⼤⼤减少。
- 横向扩展简单:根据业务的⾼峰低⾕周期快速的横向扩展⾮常简单,因为单个微服务通常很⼩,可以随着系统整体负载的变化更快地启动和停⽌。
- 架构升级灵活:单个微服务的内部架构可以迅速升级,因为微服务之间松散耦合的,只⾯向定义好的通讯接⼝进⾏编程。这使开发团队能够基于⾃身的技术背景和偏好灵活选择,⽽不会直接影响其他应⽤程序、服务或团队。
- 更好的容错性:微服务之间可以实现更好的故障隔离,单个服务内的内存泄露等故障不容易影响其他服务,相⽐单体应⽤⼀个组件故障会拖垮整个系统。
但是微服务也并非没有缺点。如果微服务治理得不恰当,反⽽有可能适得其反,不仅不能享受到微服务架构带来的好处,反⽽会因为微服务带来的系统复杂性,造成开发、运维部署的复杂度增加,进⽽影响开发迭代的速度,甚⾄影响系统的整体稳定性。
Spring Cloud和Spring Cloud Alibaba的关系
官网:https://sca.aliyun.com/docs/2023/overview/what-is-sca/
架构演进
单体架构
定义:将所有功能模块(如用户管理、订单管理、支付管理等)打包成一个单一的、完整的应用程序单元(通常是一个巨大的 WAR 或 JAR 包),使用同一个数据库。
优点:
- 开发简单:IDE 容易调试,代码结构直观。
- 部署简单:只需要维护一个应用程序,复制一个包到服务器即可运行。
- 测试简单:端到端测试容易,本地即可启动整个应用。
- 易于横向扩展:初期可以通过集群来提升性能。
缺点:
- 代码臃肿,维护困难:随着业务发展,代码库变得巨大,牵一发而动全身。
- 技术栈僵化:必须使用统一的技术栈,难以引入新的语言或框架。
- 扩展性差:无法对某个特定功能做独立扩展。比如“双十一”时订单模块是瓶颈,但你不得不扩展整个应用,浪费资源。
- 可靠性差:任何一个模块的 Bug(如内存泄漏)都可能导致整个应用崩溃。
- 阻碍持续交付:任何一个微小的修改都需要全量编译、测试和部署整个应用,发布周期长、风险高。
集群架构
定义:这并非一种新的应用架构,而是单体架构的部署模式。为了解决单点故障和性能瓶颈,将同一个单体应用部署到多台服务器上,形成一个集群,并通过负载均衡器(如 Nginx)将流量分发到各个实例。
优点:
- 解决了高可用性问题:一台机器宕机,其他机器可以继续服务。
- 提升了吞吐量:通过水平扩展,初步解决了并发用户数增长的问题。
缺点:
- 并未解决单体架构的任何根本性缺陷(代码臃肿、技术栈僵化等)。
- 引入了新的复杂性:需要管理负载均衡器、Session 共享、数据库主从同步等。
- 数据库成为新的单一瓶颈:所有应用实例都连接到一个中心数据库,数据库的读写压力巨大。
分布式架构
定义:将单体应用按业务边界拆分为一系列小的、自治的、松散耦合的服务。每个服务都是一个独立的应用,拥有自己的进程、数据库(或数据结构),并围绕特定的业务能力进行构建。服务间通过轻量级的通信机制(如 HTTP/REST, gRPC)进行协作。
优点:
- 技术异构性:每个服务可以选择最合适的技术栈(例如,AI 服务用 Python,大数据分析用 Spark)。
- 弹性扩展:可以针对特定服务进行精准扩展,资源利用更高效。
- 故障隔离:单个服务故障不会导致整个系统瘫痪。
- 独立开发、部署和迭代:小团队负责特定的服务,提升开发效率和交付速度(符合 DevOps 理念)。
- 代码复杂度降低:每个服务代码库更小,更易于理解和维护。
缺点:
- 分布式系统复杂性:开发者需要处理网络延迟、分布式事务、 eventual consistency (最终一致性)。
- 运维复杂度急剧上升:需要管理大量的服务、监控、日志聚合等。容器化(Docker)和编排(Kubernetes)是管理微服务的的事实标准。
- 测试和调试困难:需要模拟服务依赖,问题追踪跨越多个服务。
- 数据一致性挑战:放弃了传统的强一致性 ACID 事务,转而使用 BASE 理论,通过 Saga 模式、TCC 等方案解决分布式事务问题。
- 网络通信开销:服务间调用从本地方法调用变成了网络通信,增加了延迟和失败的可能性。
环境准备
文章中框架版本选择
JDK17
SpringBoot:3.3.4
SpringCloud:2023.0.3
SpringCloudAlibaba:2023.0.3.2
创建项目
创建父项目cloud-demo
删掉其他创建maven项目时多余的文件
在pom.xml中加上标签:
<packaging>pom</packaging>
完整的pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.3.4</version><relativePath/> <!-- lookup parent from repository --></parent><packaging>pom</packaging><groupId>com.qf</groupId><artifactId>cloud-demo</artifactId><version>0.0.1-SNAPSHOT</version><name>cloud-demo</name><description>cloud-demo</description><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><spring-cloud.version>2023.0.3</spring-cloud.version><spring-cloud-alibaba.version>2023.0.3.2</spring-cloud-alibaba.version></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
创建子项目services
在子项目中pom.xml中加上标签:
<packaging>pom</packaging>
之后再分别创建services下的子项目services-order、services-product等
创建配置相同
创建好之后在maven项目结构中可以看到
如果没有分组显示,可以点击以下按钮
在services的pom.xml中导入nacos的服务发现
<dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2021.0.4.0</version></dependency>
</dependencies>
在maven项目结构中可以看到子项目也依赖了
至此完成基本框架搭建