当前位置: 首页 > article >正文

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>


http://www.kler.cn/a/305360.html

相关文章:

  • DNS面临的4大类共计11小类安全风险及防御措施
  • HarmonyOS SDK下的实践与探索
  • ML 系列: 第 23 节 — 离散概率分布 (多项式分布)
  • MyBatisPlus 用法详解
  • 1小时构建Vue3知识体系之vue的生命周期函数
  • Web安全之SQL注入---基础
  • 如何从github上clone项目
  • 事件和委托,Lambda表达式
  • python之pyecharts制作可视化数据大屏
  • Git 回滚详解:应对各种场景的策略
  • Java 21的Concurrency的笔记
  • 【架构设计模式-1】代理模式
  • 物品识别——基于python语言
  • python深拷贝和浅拷贝的实验
  • python学习第八节:爬虫的初级理解
  • 远程跨境传输大文件如何做到安全又稳定?
  • 使用Selenium进行网页自动化
  • 水平垂直居中的几种方法(总结)
  • 【浅谈】单片机基本概念
  • 在WPF中使用矢量图标
  • 【ArcGISProSDK】初识
  • Vue Router push方法的使用
  • vm虚拟机中ubuntu连不上网络,网络图标消失解决办法
  • 技术成神之路:设计模式(十三)访问者模式
  • 2.1 溪降技术:溪降运动的定义
  • 链路层和交换网_计算机网络