SpringCloud Alibaba 实战:搭建第一个 SpringCloud Alibaba 项目

引言

在现代微服务架构中,SpringCloud 已经成为开发者构建分布式系统的首选工具之一。SpringCloud Alibaba 是 SpringCloud 生态中的一个重要子集,提供了一整套微服务开发的解决方案,集成了阿里巴巴的中间件和服务。这篇博客将带领大家一步一步搭建一个简单的 SpringCloud Alibaba 项目,帮助开发者快速上手。

目录

  1. SpringCloud Alibaba 简介
  2. 项目准备
    • 环境要求
    • 工具安装
  3. 创建 SpringCloud Alibaba 项目
    • 使用 Spring Initializr 初始化项目
    • 项目结构分析
  4. 引入 SpringCloud Alibaba 依赖
    • Maven 依赖配置
  5. 搭建服务注册中心(Nacos)
    • Nacos 简介
    • Nacos 安装与配置
  6. 实现服务消费者与提供者
    • 创建服务提供者
    • 创建服务消费者
    • 服务调用测试
  7. 配置网关(Spring Cloud Gateway)
    • 网关简介
    • 网关配置与路由规则
  8. 服务降级与熔断(Sentinel)
    • Sentinel 简介
    • 配置与使用示例
  9. 配置中心(Nacos Config)
    • 动态配置管理
  10. 总结与展望

SpringCloud Alibaba 简介

SpringCloud Alibaba 是一个为微服务解决方案提供全面支持的工具集。它集成了阿里巴巴的开源技术栈,如 Nacos、Sentinel、RocketMQ 等,旨在简化微服务架构的构建与管理。其主要特点包括:

  • 服务注册与发现:通过 Nacos 实现服务注册与发现。
  • 负载均衡与路由:使用 Spring Cloud Gateway 提供 API 网关功能。
  • 限流与熔断:Sentinel 提供了流量控制和熔断降级功能。
  • 配置管理:Nacos Config 允许动态配置管理,便于服务的配置更新。

项目准备

环境要求

在开始搭建项目之前,需要确保本地环境满足以下要求:

  • Java 11 或以上
  • Maven 3.6.0 或以上
  • IDEA 或 Eclipse 开发工具

工具安装

  1. Java 安装:从 OracleOpenJDK 下载并安装 JDK 11。

  2. Maven 安装:从 Maven 官方网站 下载并安装 Maven。

  3. IDEA/Eclipse 安装:推荐使用 IDEA,下载地址:JetBrains IDEA

创建 SpringCloud Alibaba 项目

使用 Spring Initializr 初始化项目

Spring Initializr 是 Spring 官方提供的项目初始化工具,能够快速生成项目结构。

  1. 访问 Spring Initializr,选择如下配置:

    • Project:Maven Project
    • Language:Java
    • Spring Boot:2.7.x
    • Project Metadata
      • Group:com.example
      • Artifact:springcloud-alibaba-demo
      • Name:SpringCloudAlibabaDemo
      • Package name:com.example.springcloudalibabademo
      • Packaging:Jar
      • Java:11
  2. Dependencies

    • Spring Web
    • Spring Cloud Alibaba Nacos Discovery
    • Spring Cloud Alibaba Nacos Config
    • Spring Cloud Gateway
    • Spring Cloud Alibaba Sentinel

点击“Generate”生成项目并下载。

项目结构分析

解压并导入项目后,项目结构大致如下:

springcloud-alibaba-demo
│   pom.xml
└───src
    ├───main
    │   ├───java
    │   │   └───com.example.springcloudalibabademo
    │   │       └───SpringCloudAlibabaDemoApplication.java
    │   └───resources
    │       ├───application.properties
    │       └───static
    └───test
        └───java

引入 SpringCloud Alibaba 依赖

Maven 依赖配置

pom.xml 中添加 SpringCloud Alibaba 相关依赖:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2021.1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <!-- Spring Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Nacos Discovery -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

    <!-- Nacos Config -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>

    <!-- Spring Cloud Gateway -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>

    <!-- Sentinel -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    </dependency>
</dependencies>

搭建服务注册中心(Nacos)

Nacos 简介

Nacos 是一个易于使用的动态服务发现、配置和服务管理平台。它帮助开发者快速实现微服务架构中的注册、配置与发现功能。

Nacos 安装与配置

  1. 下载 NacosNacos Releases

  2. 启动 Nacos

    解压后进入 bin 目录,执行启动命令:

    • Windows:startup.cmd -m standalone
    • Linux/Unix/Mac:sh startup.sh -m standalone
  3. 访问控制台

    启动成功后,访问 http://localhost:8848/nacos 进入 Nacos 控制台。

实现服务消费者与提供者

创建服务提供者

  1. 在项目中创建一个模块 provider,并添加以下代码:

    pom.xml

    <dependencies>
        <!-- Spring Web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    
        <!-- Nacos Discovery -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>
    
  2. application.properties

    server.port=8081
    spring.application.name=service-provider
    spring.cloud.nacos.discovery.server-addr=localhost:8848
    
  3. ProviderApplication.java

    package com.example.springcloudalibabademo.provider;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @SpringBootApplication
    @RestController
    public class ProviderApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ProviderApplication.class, args);
        }
    
        @GetMapping("/hello")
        public String hello() {
            return "Hello from Provider!";
        }
    }
    

创建服务消费者

  1. 在项目中创建一个模块 consumer,并添加以下代码:

    pom.xml

    <dependencies>
        <!-- Spring Web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
    
    
        </dependency>
    
        <!-- Nacos Discovery -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    
        <!-- OpenFeign -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>
    
  2. application.properties

    server.port=8082
    spring.application.name=service-consumer
    spring.cloud.nacos.discovery.server-addr=localhost:8848
    
  3. ConsumerApplication.java

    package com.example.springcloudalibabademo.consumer;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.openfeign.EnableFeignClients;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.beans.factory.annotation.Autowired;
    
    @SpringBootApplication
    @EnableFeignClients
    @RestController
    public class ConsumerApplication {
    
        @Autowired
        private ProviderClient providerClient;
    
        public static void main(String[] args) {
            SpringApplication.run(ConsumerApplication.class, args);
        }
    
        @GetMapping("/hello")
        public String hello() {
            return providerClient.hello();
        }
    }
    
  4. ProviderClient.java

    package com.example.springcloudalibabademo.consumer;
    
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.GetMapping;
    
    @FeignClient(name = "service-provider")
    public interface ProviderClient {
    
        @GetMapping("/hello")
        String hello();
    }
    

服务调用测试

  1. 启动服务提供者和消费者模块。
  2. 访问消费者服务的接口:http://localhost:8082/hello
  3. 返回结果应为:“Hello from Provider!”

配置网关(Spring Cloud Gateway)

网关简介

Spring Cloud Gateway 是 Spring 官方提供的 API 网关解决方案,提供路由、断言和过滤器等功能,支持对微服务进行统一管理。

网关配置与路由规则

  1. 在项目中创建一个模块 gateway,并添加以下代码:

    pom.xml

    <dependencies>
        <!-- Spring Cloud Gateway -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
    
        <!-- Nacos Discovery -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>
    
  2. application.properties

    server.port=8080
    spring.application.name=gateway
    spring.cloud.nacos.discovery.server-addr=localhost:8848
    spring.cloud.gateway.discovery.locator.enabled=true
    spring.cloud.gateway.discovery.locator.lower-case-service-id=true
    
  3. GatewayApplication.java

    package com.example.springcloudalibabademo.gateway;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class GatewayApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(GatewayApplication.class, args);
        }
    }
    
  4. 配置路由规则

    application.properties 中添加路由规则,使请求 /api/hello 路由到 service-consumer 服务:

    spring.cloud.gateway.routes[0].id=consumer
    spring.cloud.gateway.routes[0].uri=lb://service-consumer
    spring.cloud.gateway.routes[0].predicates[0]=Path=/api/hello
    
  5. 启动网关模块,访问 http://localhost:8080/api/hello,应返回“Hello from Provider!”

服务降级与熔断(Sentinel)

Sentinel 简介

Sentinel 是阿里巴巴开源的一款流量防护和熔断降级解决方案,用于保护服务的稳定性和可用性。

配置与使用示例

  1. 在消费者模块中添加 Sentinel 依赖:

    pom.xml

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    </dependency>
    
  2. ConsumerApplication.java

    修改 ProviderClient 接口以支持熔断降级:

    @FeignClient(name = "service-provider", fallback = ProviderClientFallback.class)
    public interface ProviderClient {
    
        @GetMapping("/hello")
        String hello();
    }
    
    @Component
    public class ProviderClientFallback implements ProviderClient {
        @Override
        public String hello() {
            return "Fallback: Service Unavailable";
        }
    }
    
  3. 启动消费者模块,停止提供者服务,访问 http://localhost:8082/hello,应返回“Fallback: Service Unavailable”。

配置中心(Nacos Config)

动态配置管理

  1. 在 Nacos 控制台添加配置:

    • Data ID:service-provider-dev.yaml
    • Group:DEFAULT_GROUP
    • Content:
      server:
        port: 8081
      
  2. 在服务提供者的 application.properties 中启用 Nacos Config:

    spring.profiles.active=dev
    spring.cloud.nacos.config.server-addr=localhost:8848
    spring.cloud.nacos.config.file-extension=yaml
    
  3. 启动服务提供者,查看是否读取了 Nacos 配置的端口号。

总结与展望

通过本次实践,我们成功搭建了一个简单的 SpringCloud Alibaba 项目,涵盖了服务注册与发现、网关路由、服务降级与熔断以及配置中心等核心功能。SpringCloud Alibaba 提供了一整套解决方案,帮助开发者轻松构建和管理微服务架构。在未来的开发中,可以进一步探索更多高级功能,如分布式事务(Seata)、消息队列(RocketMQ)等,构建更加复杂和健壮的微服务系统。


通过这种方式,读者可以逐步理解和实践 SpringCloud Alibaba 的核心功能,从而在真实项目中应用这些技术。希望这篇博客能够为您的开发旅程提供帮助!如果有任何疑问或建议,欢迎在评论区留言。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐