Spring Cloud Alibaba 项目简介
Spring Cloud Alibaba(下文简称为 SCA ) 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。 依托 SCA,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里分布式应用解决方案,通过阿里中间件来迅速搭建分布式应用系统。
项目最佳实践案例介绍
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 LoadBalancer | Ribbon 的替代方案,支持 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 Version | Spring Cloud Version | Spring Boot Version |
|---|---|---|
| 2023.0.1.0* | Spring Cloud 2023.0.1 | 3.2.4 |
| 2023.0.0.0-RC1 | Spring Cloud 2023.0.0 | 3.2.0 |
项目架构
| 内容 | 说明 |
|---|---|
| .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.yml | docker compose 配置文件,部署环境,例如 mysql,nacos 等 |
| docker-compose.service.yml | docker compose 配置文件,部署业务服务 |
| Dockfile | docker 部署服务的配置文件 |
| pom | maven 打包项目 |
这里子父子 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"]
注意事项
- docker 配置镜像源
- docker compose 配置,要与官网的仔细核对,包括镜像及配置项,版本号等
- 清理 docker 缓存
- nacos 地址
1. clean,package 项目
2.构建 docker-compose.env.yaml和 构建 docker-compose.service.yaml
4. 检查 docker 运行情况
5。 检查 nacos 等运行情况
整体项目 springBoot springCloud为基础架构,整合
- nacos (服务发现,注册)
- openfeign (服务调用)
- spring loadbalance(负载均衡)
- spring Gateway (网关)
- Sentinel (流量控制,熔断)
- seata (分布式事务)