SpringCloud Alibaba 工程搭建详细教程
使用 Spring Cloud Alibaba 的主要目的是解决单体应用的痛点,并利用微服务架构的优势来构建高扩展性、可靠的分布式系统。
1. 单体应用的痛点
单体应用虽然在小型项目中优势明显,但随着业务复杂性增加,逐渐暴露出许多问题:
- 代码复杂性:随着功能增长,单体应用代码量增加,导致可读性、可维护性和可扩展性下降。新开发人员需要花费大量时间理解系统。
- 测试困难:在单体应用中,任何小的更改都可能影响整个系统,导致测试覆盖范围大,测试成本高。
- 并发能力有限:单体应用运行在一台服务器上,随着访问量的增加,性能瓶颈显现,用户体验下降。
- 容错性差:如果某一功能模块出现故障,可能导致整个应用系统不可用。
2. 微服务的优势
微服务架构通过将单体应用按业务功能划分为多个独立的小模块(微服务),每个服务都有独立的进程、数据库和部署方式。这种架构的优势包括:
- 独立部署与扩展:每个微服务可以独立开发、测试、部署,并且根据需要单独扩展,大大提高了灵活性和可扩展性。
- 容错性提高:微服务之间通过 HTTP RESTful API 或者消息机制进行通信,某个服务的故障不会影响整个系统,可以局部熔断,保障整体可用性。
- 语言与技术多样性:不同的微服务可以采用不同的编程语言或存储技术,灵活适应业务需求。
- 易于维护:由于每个微服务的代码规模较小,可维护性更高,新开发人员上手难度降低。
3. Spring Cloud Alibaba 的重要组件
Spring Cloud Alibaba 提供了构建微服务架构的核心组件,帮助开发者应对微服务架构中面临的复杂性。
主要组件包括:
Nacos:
- 服务注册与发现:Nacos 作为注册中心,负责微服务的动态注册和发现,简化了服务之间的通信。
- 配置中心:Nacos 提供分布式配置管理,支持动态配置更新,避免了繁琐的手动配置文件修改。
Ribbon:
- 负载均衡:Ribbon 是客户端负载均衡器,能够在多个服务实例之间分配请求流量,提升服务的可用性和性能。
Feign:
- 声明式 HTTP 客户端:通过 Feign,可以轻松调用其他微服务的 HTTP 接口,简化远程调用的代码,实现更清晰的代码逻辑。
Sentinel:
- 限流、降级、熔断:Sentinel 提供了强大的流量控制功能,能实时监控微服务的运行状况,进行限流和熔断,保障系统的稳定性。
Gateway:
- API 网关:Spring Cloud Gateway 是一个高性能的 API 网关,它通过 WebFlux 编程模式支持路由转发、认证授权、日志监控等功能,集中管理外部请求流量。
Sleuth:
- 调用链监控:Sleuth 负责微服务间的调用链路追踪,能够在分布式系统中帮助快速定位问题,提供链路级的性能监控。
Seata:
- 分布式事务解决方案:Seata 提供了跨微服务的分布式事务管理,保证微服务之间的事务一致性,解决了分布式架构中事务管理复杂的问题。
工程搭建
1、搭建父工程
删除掉src目录(父目录不需要)
2、引入相关springcloud依赖
先看下springboot和springcloud、springcloud alibaba 和各个组件之间的版本对应关系:
SpringCloud与SpringBoot的版本的兼容关系
springcloud和springcloud alibaba版本保持一致
<?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.2.9</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>cloud</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging> <!-- 这里设置为pom -->
<name>demo</name>
<description>demo</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>17</java.version>
<spring-cloud.version>2023.0.2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-alibaba-dependencies -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2023.0.1.0</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<!-- 定义子模块 -->
<modules>
<module>service1</module>
<module>service2</module>
</modules>
</project>
3、创建子模块
创建子模块service1、service2
子模块service1的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>cloud</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <!-- 指向父项目的 pom 文件 -->
</parent>
<artifactId>service1</artifactId>
<dependencies>
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2023.0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2023.0.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>
子模块service2的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>cloud</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <!-- 指向父项目的 pom 文件 -->
</parent>
<artifactId>service2</artifactId>
<dependencies>
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2023.0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2023.0.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>