从0开始SpringBoot - 8:SptringCloud

187 阅读6分钟

Spring Cloud Alibaba 项目简介

Spring Cloud Alibaba(下文简称为 SCA ) 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。 依托 SCA,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里分布式应用解决方案,通过阿里中间件来迅速搭建分布式应用系统。

阿里巴巴Spring Cloud Alibaba 文档地址

项目最佳实践案例介绍

SCA 的项目的最佳实践,是整合了 SCA 相关组件(Nacos,Sentinel,Seata,RocketMQ)的 Example 示例项目。方便用户全面体验 SCA 提供的一站式微服务解决方案。

1. Spring Cloud Gateway:网关
2. Nacos:服务注册和配置中心
3. Sentinel:熔断限流
4. Seata:分布式事务
5. RocketMQ:消息队列,削峰填谷
6. Docker:使用Docker进行容器化部署
7. Kubernetes:使用k8s进行容器化部署

下图为 SCA 最佳实践项目结构示意图:

项目结构示意图

Spring Cloud 技术点及方案选型

Spring Cloud 微服务架构中各个技术点的技术选型及其特点的表格总结:

技术点技术选型特点
服务注册与发现Eureka简单易用,Spring Cloud 默认集成,适合中小规模项目。
Nacos功能强大,支持动态配置和服务发现,适合大规模分布式系统。
配置管理Spring Cloud Config集中化管理配置,支持 Git 存储,适合需要版本控制的场景。
Nacos动态配置刷新,支持多环境配置,适合需要实时更新的场景。
服务通信RestTemplate简单易用,适合同步调用场景。
OpenFeign声明式 REST 客户端,支持负载均衡和熔断,适合微服务间调用。
RabbitMQ/Kafka异步消息队列,适合高并发和解耦场景。
负载均衡Ribbon客户端负载均衡,支持多种负载均衡策略。
Spring Cloud LoadBalancerRibbon 的替代方案,支持 Reactive 编程模型。
熔断与限流Hystrix提供熔断、降级和隔离功能,适合防止雪崩效应。
Resilience4j轻量级熔断库,支持函数式编程,适合 Spring Boot 2.x。
Sentinel支持流量控制、熔断和系统保护,适合高并发场景。
API 网关Spring Cloud Gateway基于 Spring 5 和 Reactor,支持动态路由和过滤器,适合现代微服务架构。
Zuul功能强大,但性能较差,适合旧项目迁移。
分布式追踪Spring Cloud Sleuth + Zipkin提供分布式追踪 ID 和可视化分析,适合排查复杂调用链问题。
SkyWalking支持 APM(应用性能监控),适合大规模分布式系统。
安全与鉴权Spring Security OAuth2 + JWT提供认证和授权功能,适合微服务安全场景。
Keycloak开源身份和访问管理工具,适合复杂权限管理场景。
容器化与部署Docker轻量级容器化技术,适合快速部署和扩展。
Kubernetes容器编排工具,支持自动扩缩容和负载均衡,适合大规模生产环境。
监控与告警Prometheus + Grafana提供指标收集和可视化监控,适合实时监控和告警。
Spring Boot Actuator提供健康检查、指标和审计功能,适合集成到 Spring Boot 应用中。
测试策略JUnit + Mockito单元测试框架,适合测试单个类或方法。
Spring Boot Test集成测试框架,适合测试整个 Spring Boot 应用。
Spring Cloud Contract契约测试工具,确保服务间接口的兼容性。
文档与协作Swagger/OpenAPI自动生成 API 文档,适合团队协作和接口调试。
Git版本控制工具,适合代码管理和团队协作。
性能优化Redis内存缓存,适合缓存热点数据。
Caffeine本地缓存库,适合单机缓存场景。
分库分表/读写分离数据库优化策略,适合高并发和大数据量场景。
故障排查与恢复ELK(Elasticsearch, Logstash, Kibana)日志聚合和分析工具,适合集中管理日志。
Graylog日志管理工具,适合实时日志分析和告警。

实操

版本说明

因为用到 spring cloud alibaba ,所以参考alibaba文档-版本说明

适配 Spring Boot 3.2,Spring Cloud 2023.x 版本及以上的 Spring Cloud Alibaba 版本按从新到旧排列如下表(最新版本用*标记):

Spring Cloud Alibaba VersionSpring Cloud VersionSpring Boot Version
2023.0.1.0*Spring Cloud 2023.0.13.2.4
2023.0.0.0-RC1Spring Cloud 2023.0.03.2.0

项目架构

image.png

内容说明
.mysql-data挂载 docker 中 DB 的数据存储
.redis-data挂载 docker 的 redis 的数据存储
model公共 bean 对象
mysql-init挂载到 docker db 作为初始化表 sql
services各个服务
service-gateway网关服务
service-product商品服务
service-order订单服务
service-user用户服务
docker-compose.env.ymldocker compose 配置文件,部署环境,例如 mysql,nacos 等
docker-compose.service.ymldocker compose 配置文件,部署业务服务
Dockfiledocker 部署服务的配置文件
pommaven 打包项目

这里子父子 module 的 maven 配置要注意

父模块要去除 executions

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

子模块要使用 repackage 命令这样才能将其他模块的类,打入 jar 包

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <id>repackage</id>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

当然还有其他方案,例如子模块 install 到本地 maven 仓库,然后再引用,(不推荐)

docker compose env

services:
  # MySQL 服务
  mysql:
    image: mysql:8
    container_name: mysql8
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    ports:
      - "3307:3306"
    volumes:
      - ./.mysql-data:/var/lib/mysql
      - ./mysql-init/create_table.sql:/docker-entrypoint-initdb.d/init.sql
    #启动脚本
    networks:
      - app-network

  # Redis 服务
  redis:
    image: redis:6
    container_name: redis6
    restart: always
    ports:
      - "6379:6379"
    networks:
      - app-network
    volumes:
      - ./.redis-data:/data

  # Nacos 服务
  nacos:
    image: nacos/nacos-server:v2.4.3-slim
    container_name: nacos1
    restart: always
    environment:
      MODE: standalone
    ports:
      - "8848:8848"
    depends_on:
      - mysql
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

docker compose service

services:
  # 商品服务
  service-product:
    build:
      context: ./services/service-product
      dockerfile: Dockerfile
      no_cache: true
    container_name: service-product01
    restart: always
    ports:
      - "9001:9001"
    networks:
      - app-network

  # 订单服务
  service-order:
    build:
      context: ./services/service-order
      dockerfile: Dockerfile
      no_cache: true
    container_name: service-order01
    restart: always
    ports:
      - "8000:8000"
    networks:
      - app-network

  # 用户服务
  service-user:
    build:
      context: ./services/service-user
      dockerfile: Dockerfile
      no_cache: true
    container_name: service-user01
    restart: always
    ports:
      - "9500:9500"
    networks:
      - app-network

  # 网关服务
  service-gateway:
    build:
      context: ./services/service-gateway
      dockerfile: Dockerfile
      no_cache: true
    container_name: service-gateway01
    restart: always
    ports:
      - "80:80"
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

Dockerfile


FROM openjdk:25-slim
# 设置工作目录
WORKDIR /app
# 从第一阶段的构建结果中复制生成的 JAR 文件到当前工作目录
# COPY --from=builder /app/target/*.jar app.jar
# 添加jar包
ADD target/service-gateway-0.0.2-SNAPSHOT.jar .

# 暴露 Spring Gateway 默认的端口,可根据实际情况修改
EXPOSE 80
# 定义容器启动时执行的命令,运行 Spring Gateway 应用
ENTRYPOINT ["java", "-jar", "/app/service-gateway-0.0.2-SNAPSHOT.jar","--spring.profiles.active=dev"]

注意事项

  1. docker 配置镜像源
  2. docker compose 配置,要与官网的仔细核对,包括镜像及配置项,版本号等
  3. 清理 docker 缓存
  4. nacos 地址

1. clean,package 项目

image.png

2.构建 docker-compose.env.yaml和 构建 docker-compose.service.yaml

image.png

4. 检查 docker 运行情况

Screenshot 2025-02-25 at 18.41.10.png

5。 检查 nacos 等运行情况

整体项目 springBoot springCloud为基础架构,整合

  • nacos (服务发现,注册)
  • openfeign (服务调用)
  • spring loadbalance(负载均衡)
  • spring Gateway (网关)
  • Sentinel (流量控制,熔断)
  • seata (分布式事务)

Nacos

image.png