傲渊山岳 发表于 2025-3-28 19:29:19

SpringCloud入门、搭建、调试、源代码

源代码: https://github.com/Rodert/SpringCloud-Demo
    SpringCloud-Demo 是 SpringCloud 的入手项目,假如你想自己搭建一次 SpringCloud,那可以参考这个。Springcloud-demo is the starting project of SpringCloud, if you want to build your own SpringCloud, you can refer to this.


https://i-blog.csdnimg.cn/direct/530cb9a534c94f58ae97c269e0f349b0.png
Spring Cloud 微服务实践

这是一个基于Spring Cloud的微服务架构示例项目,展示了微服务架构的核心组件和根本功能。项目代码托管在 Rodert/SpringCloud-Demo 堆栈。
English Version | 中文版
项目架构

该项目接纳微服务架构,包含以下组件:


[*]网关服务:体系入口,负责请求路由和全局认证
[*]认证服务:提供用户认证和令牌天生
[*]用户服务:管理用户信息
[*]订单服务:管理订单信息,并通过Feign调用用户服务
[*]公共模块:包含所有服务共用的工具类和实体类
组件关系图

┌─────────────┐      ┌─────────────┐
│    客户端    │─────▶│API网关    │
└─────────────┘      │(8080)       │
                     └──────┬──────┘
                            │
                            ▼
       ┌────────────────────┬────────────────────┐
       │                  │                  │
┌──────▼─────┐      ┌──────▼─────┐      ┌──────▼─────┐
│ 认证服务    │      │ 用户服务    │◀─────▶│ 订单服务    │
│ (8081)   │      │ (8082)   │      │ (8083)   │
└──────┬─────┘      └──────┬─────┘      └──────┬─────┘
       │                   │                   │
       └───────────┬───────┴───────────┬───────┘
                   │                   │
         ┌───────▼───────┐   ┌───────▼───────┐
         │Nacos 注册中心 │   │    公共模块    │
         │(8848)       │   │   (common)    │
         └───────────────┘   └───────────────┘
技能栈



[*]Spring Boot 2.6.3:应用基础框架
[*]Spring Cloud 2021.0.1:微服务框架
[*]Spring Cloud Alibaba 2021.0.1.0:阿里云微服务组件
[*]Nacos:服务注册与发现
[*]OpenFeign:声明式服务调用
[*]Spring Cloud Gateway:API网关
[*]Spring Security:认证授权
[*]JWT:无状态令牌
[*]H2 Database:内存数据库(用于开发和测试)
[*]Spring Data JPA:数据访问层
项目布局

spring-cloud-practice/
├── gateway-service/    # 网关服务
├── auth-service/       # 认证服务
├── user-service/       # 用户服务
├── order-service/      # 订单服务
├── common/             # 公共组件
└── pom.xml             # 父POM
功能特性


[*]服务注册与发现:所有服务通过Nacos注册中心自动注册和发现
[*]统一认证:基于JWT的认证体系,通过网关统一验证令牌
[*]服务间通讯:使用OpenFeign实现声明式服务调用
[*]负载平衡:通过Spring Cloud LoadBalancer实现客户端负载平衡
[*]熔断降级:使用Resilience4j实现服务熔断和降级
[*]数据长期化:使用Spring Data JPA进行数据访问
[*]安全防护:基于Spring Security实现认证授权
快速开始

获取代码

# 克隆项目仓库
git clone https://github.com/Rodert/SpringCloud-Demo.git

# 进入项目目录
cd SpringCloud-Demo
环境要求



[*]JDK 1.8+
[*]Maven 3.6+
[*]Docker (推荐运行Nacos服务)
启动服务


[*]启动Nacos服务器
使用Docker可以快速启动Nacos服务:
docker run --name nacos-standalone -e MODE=standalone -p 8848:8848 -d nacos/nacos-server:latest
下图显示Docker Desktop中运行的Nacos容器:
https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=img%2Fimg.png&pos_id=img-P50IDp0j-1742976469647
图1: Docker Desktop中运行的Nacos容器
大概使用本地Nacos:
# 进入Nacos目录
cd nacos/bin
# 启动服务器(单机模式)
sh startup.sh -m standalone

[*]构建并启动各个服务
# 构建整个项目
mvn clean package -DskipTests

# 按以下顺序启动各个服务:
# 1. 先启动认证服务
java -jar auth-service/target/auth-service-1.0-SNAPSHOT.jar
# 2. 再启动用户服务
java -jar user-service/target/user-service-1.0-SNAPSHOT.jar
# 3. 然后启动订单服务
java -jar order-service/target/order-service-1.0-SNAPSHOT.jar
# 4. 最后启动网关服务
java -jar gateway-service/target/gateway-service-1.0-SNAPSHOT.jar
服务发现

所有微服务启动后,会自动注册到Nacos服务中心,可以通过Nacos控制台检察已注册的服务。
https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=img%2Fimg_3.png&pos_id=img-ttlL3Kh1-1742976469648
图2: Nacos控制台中的服务列表,显示所有成功注册的微服务
API文档

认证服务 API

用户登录



[*]URL: POST /auth/login
[*]形貌: 验证用户凭证并返回JWT令牌
[*]请求体:{
"username": "user",
"password": "password"
}

[*]响应:{
"code": 200,
"message": "操作成功",
"data": {
    "token": "eyJhbGciOiJIUzI1NiJ9..."
}
}

下图展示了使用Postman调用登录接口并获取JWT令牌的过程:
https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=img%2Fimg_2.png&pos_id=img-bMealiLP-1742976469648
图3: 登录接口测试及JWT令牌天生
用户服务 API

获取所有用户



[*]URL: GET /users
[*]形貌: 返回体系中所有用户的列表
[*]请求头: Authorization: Bearer {token}
[*]响应:{
"code": 200,
"message": "操作成功",
"data": [
    {
      "id": 1,
      "username": "user1",
      "email": "user1@example.com"
    },
    {
      "id": 2,
      "username": "user2",
      "email": "user2@example.com"
    }
]
}

下图展示了使用JWT令牌成功访问用户服务的效果:
https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=img%2Fimg_1.png&pos_id=img-i12bG6Hp-1742976469648
图4: 使用JWT令牌访问用户服务API
根据ID获取用户



[*]URL: GET /users/{id}
[*]形貌: 返回指定ID的用户详细信息
[*]请求头: Authorization: Bearer {token}
[*]响应:{
"code": 200,
"message": "操作成功",
"data": {
    "id": 1,
    "username": "user1",
    "email": "user1@example.com"
}
}

搜刮用户



[*]URL: GET /users/search?keyword={keyword}
[*]形貌: 根据关键字搜刮用户
[*]请求头: Authorization: Bearer {token}
订单服务 API

获取所有订单



[*]URL: GET /orders
[*]形貌: 返回体系中所有订单的列表
[*]请求头: Authorization: Bearer {token}
获取订单详情



[*]URL: GET /orders/{id}
[*]形貌: 返回指定ID的订单详细信息,包含关联的用户信息
[*]请求头: Authorization: Bearer {token}
[*]响应:{
"code": 200,
"message": "操作成功",
"data": {
    "id": 1,
    "userId": 1,
    "productName": "iPhone 13",
    "quantity": 1,
    "amount": 6999,
    "createTime": "2023-01-01T12:00:00",
    "user": {
      "id": 1,
      "username": "user1",
      "email": "user1@example.com"
    }
}
}

获取用户订单



[*]URL: GET /orders/user/{userId}
[*]形貌: 返回指定用户的所有订单
[*]请求头: Authorization: Bearer {token}
创建订单



[*]URL: POST /orders
[*]形貌: 创建新订单
[*]请求头: Authorization: Bearer {token}
[*]请求体:{
"userId": 1,
"productName": "MacBook Pro",
"quantity": 1,
"amount": 12999
}

测试API (命令行方式)

除了使用Postman,您也可以使用curl命令进行API测试:

[*]获取令牌
curl -X POST http://localhost:8080/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"user","password":"password"}'

[*]使用令牌访问用户服务
curl -X GET http://localhost:8080/users \
-H "Authorization: Bearer {YOUR_TOKEN}"

[*]获取订单并包含用户信息
curl -X GET http://localhost:8080/orders/1 \
-H "Authorization: Bearer {YOUR_TOKEN}"
设置说明

各个服务的主要设置项说明:
认证服务

server:
port: 8081# 服务端口

spring:
application:
    name: auth-service# 服务名称
datasource:
    url: jdbc:h2:mem:authdb# H2内存数据库
    driver-class-name: org.h2.Driver
    username: sa
    password:
jpa:
    database-platform: org.hibernate.dialect.H2Dialect
    hibernate:
      ddl-auto: update# 自动更新表结构
cloud:
    nacos:
      discovery:
      server-addr: 127.0.0.1:8848# Nacos服务器地址

jwt:
secret: mySecretKey# JWT签名密钥
expiration: 86400    # 令牌过期时间(秒)
用户服务

server:
port: 8082# 服务端口

spring:
application:
    name: user-service# 服务名称
cloud:
    nacos:
      discovery:
      server-addr: 127.0.0.1:8848# Nacos服务器地址
订单服务

server:
port: 8083# 服务端口

spring:
application:
    name: order-service# 服务名称
cloud:
    nacos:
      discovery:
      server-addr: 127.0.0.1:8848# Nacos服务器地址

feign:
client:
    config:
      default:
      connectTimeout: 5000# 连接超时(毫秒)
      readTimeout: 5000   # 读取超时(毫秒)
网关服务

server:
port: 8080# 服务端口

spring:
application:
    name: gateway-service# 服务名称
cloud:
    nacos:
      discovery:
      server-addr: 127.0.0.1:8848# Nacos服务器地址
    gateway:
      routes:# 路由配置
      - id: auth-service
          uri: lb://auth-service
          predicates:
            - Path=/auth/**
      - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/users/**
      - id: order-service
          uri: lb://order-service
          predicates:
            - Path=/orders/**
题目排查

服务无法启动



[*]题目: 应用启动时报端口占用错误
[*]办理方案: 检查指定端口是否已被其他应用占用,或在设置中修改端口号
服务无法注册到Nacos



[*]题目: 服务启动成功但在Nacos控制台看不到服务
[*]办理方案:
[*]确认Nacos服务器已正常运行
[*]检查设置文件中Nacos的地址是否正确
[*]检查@EnableDiscoveryClient注解是否添加到应用主类
[*]检查网络连接是否正常

认证失败



[*]题目: 登录时返回认证失败
[*]办理方案:
[*]确认用户名和密码是否正确
[*]检查SecurityConfig设置
[*]确认UserDetailsService实现是否正确

服务间调用失败



[*]题目: 订单服务无法调用用户服务
[*]办理方案:
[*]确认两个服务都已注册到Nacos
[*]检查Feign客户端接口是否正确界说
[*]确认目的服务名称是否与注册到Nacos的名称一致

数据库连接题目



[*]题目: 应用启动时报数据库连接错误
[*]办理方案:
[*]确认H2数据库设置是否正确
[*]检查JPA实体类注解是否正确

开发指南

添加新服务


[*]创建一个新的Maven模块
[*]添加必要的依赖(如Spring Boot、Spring Cloud、Nacos等)
[*]创建应用主类并添加@SpringBootApplication和@EnableDiscoveryClient注解
[*]创建设置文件application.yml,设置服务名称、端口和Nacos地址
[*]开发业务逻辑(控制器、服务、数据访问层等)
[*]修改网关设置,添加新服务的路由规则
添加新接口


[*]在控制器中界说新的API方法
[*]为方法添加适当的请求映射注解(如@GetMapping、@PostMapping等)
[*]实现业务逻辑
[*]使用Result<T>包装响应数据,确保统一的响应格式
服务间通讯


[*]在调用方服务添加OpenFeign依赖
[*]创建Feign客户端接口,添加@FeignClient注解
[*]在接口中界说需要调用的长途方法
[*]在主类上添加@EnableFeignClients注解
[*]注入Feign客户端并调用其方法
扩展与改进

可以添加以下功能进一步增强体系:

[*]设置中心:添加Nacos或Spring Cloud Config作为设置中心
[*]服务监控:集成Spring Boot Admin或Prometheus+Grafana
[*]分布式追踪:集成Sleuth和Zipkin
[*]消息队列:添加RabbitMQ或Kafka进行异步通讯
[*]数据库:替换内存模拟数据为真实数据库
[*]分布式事件:集成Seata管理跨服务事件
[*]API文档:集成Swagger或SpringDoc自动天生API文档
[*]限流熔断:增强网关和服务的限流、熔断和降级能力
贡献指南

欢迎提交题目和功能需求,大概直接提交Pull Request。

[*]Fork Rodert/SpringCloud-Demo 堆栈
[*]创建您的特性分支 (git checkout -b feature/amazing-feature)
[*]提交您的更改 (git commit -m 'Add some amazing feature')
[*]推送到分支 (git push origin feature/amazing-feature)
[*]打开一个Pull Request
许可证

本项目接纳 Apache-2.0 许可证 - 详见 LICENSE 文件
关于

SpringCloud-Demo 是 SpringCloud 的入手项目,假如你想自己搭建一次 SpringCloud,那可以参考这个。本项目旨在提供一个完备的微服务架构示例,帮助开发者快速理解和应用 Spring Cloud 技能栈。
源代码

   源代码: https://github.com/Rodert/SpringCloud-Demo

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: SpringCloud入门、搭建、调试、源代码