SpringCloud入门、搭建、调试、源代码
源代码: https://github.com/Rodert/SpringCloud-DemoSpringCloud-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]