使用说明
Spring Boot微服务演示
该项目演示了两个Spring Boot微服务通过WebClient相互通信,使用Docker进行容器化,并可在多种配置中部署。
建筑
- 用户服务 (端口8080):使用CRUD操作管理用户数据
- 订单服务 (端口8081):管理订单并通过WebClient与用户服务通信
服务概述
用户服务
- 公开REST端点以进行用户管理
- 使用H2内存数据库
- 提供健康检查端点
- JPA/Hibernate用于数据持久化
订单服务
- 管理订单数据
- 通过WebClient调用用户服务来验证用户的存在
- 提供订单详细信息和用户信息
- 使用WebClient进行非阻塞HTTP通信
运行应用程序
先决条件
- 已安装Docker和Docker Compose
- Java 17+(用于本地开发)
- Maven 3.6+(用于本地开发)
快速入门(自动脚本)
使用处理所有设置的自动脚本:
./run-docker.sh
此脚本将:
- 检查Docker可用性
- 构建Maven工件
- 构建Docker镜像
- 使用docker compose启动服务
Docker编写选项
- 标准设置 (推荐):
docker-compose up --build
- Render.com部署:
docker-compose -f docker-compose.render.yml up --build
- 联合服务 (单个容器):
docker build -f Dockerfile.combined -t combined-service .
docker run -p 8080:8080 -p 8081:8081 combined-service
- 使用Nginx代理:
docker build -f Dockerfile.proxy -t proxy-service .
docker run -p 80:80 proxy-service
地方发展
- 首先构建这两个服务:
# User Service
cd user-service && mvn clean package -DskipTests && cd ..
# Order Service
cd order-service && mvn clean package -DskipTests && cd ..
- 启动用户服务:
cd user-service
mvn spring-boot:run
- 启动订单服务(在另一个终端中):
cd order-service
USER_SERVICE_URL=http://localhost:8080 SERVER_PORT=8081 mvn spring-boot:run
API终点
用户服务(http://localhost:8080)
GET /api/users/health-健康检查端点GET /api/users-获取所有用户GET /api/users/{id}-按ID获取用户POST /api/users-创建新用户PUT /api/users/{id}-更新用户DELETE /api/users/{id}-删除用户
用户模型:
{
"id": 1,
"name": "John Doe",
"email": "john@example.com"
}
订购服务(http://localhost:8081)
GET /api/orders/health-健康检查端点GET /api/orders-获取所有订单GET /api/orders/{id}-按ID获取订单GET /api/orders/user/{userId}-按用户ID获取订单GET /api/orders/{id}/with-user-使用用户详细信息获取订单(WebClient调用)POST /api/orders-创建新订单(通过WebClient验证用户)PUT /api/orders/{id}-更新订单DELETE /api/orders/{id}-删除订单
订单型号:
{
"id": 1,
"userId": 1,
"product": "Laptop",
"quantity": 1,
"totalAmount": 999.99
}
测试服务
自动化测试
运行测试所有端点的演示脚本:
./demo.sh
手动测试
- 健康检查:
curl http://localhost:8080/api/users/health
curl http://localhost:8081/api/orders/health
- 创建用户:
curl -X POST http://localhost:8080/api/users \
-H "Content-Type: application/json" \
-d '{"name": "John Doe", "email": "john@example.com"}'
- 创建订单 (订单服务通过WebClient验证用户):
curl -X POST http://localhost:8081/api/orders \
-H "Content-Type: application/json" \
-d '{"userId": 1, "product": "Laptop", "quantity": 1, "totalAmount": 999.99}'
- 获取包含用户详细信息的订单 (演示WebClient通信):
curl http://localhost:8081/api/orders/1/with-user
部署选项
1.标准Docker编写
服务与docker组成网络独立运行。
2.联合服务
这两个服务都使用supervisord在单个容器中运行。
3.Nginx代理
服务在Nginx反向代理后面运行,以实现负载平衡。
4.云部署(Render.com)
优化了Render.com平台部署的配置。
Docker网络
服务通过Docker网络进行通信:
- 发展:
http://localhost:8080和http://localhost:8081 - Docker Compose:
http://user-service:8080和http://order-service:8081 - 组合/代理:通过本地主机进行内部通信
主要特点
- WebClient集成:服务之间的非阻塞HTTP通信
- 多种部署策略:Docker Compose、组合容器、代理设置
- 健康监测:内置健康检查端点
- 数据库:使用JPA/Hibernate的H2内存数据库
- 错误处理:正确的错误响应和记录
- 云就绪:包含Render.com部署配置
可用脚本
./run-docker.sh-自动化Docker设置和部署./demo.sh-API测试和演示./start-services.sh-备选启动脚本./push-to-registry.sh-容器注册表部署
故障排除
删除重复的订单服务文件夹:
rm -rf user-service/order-service/
清理和重建:
mvn clean package -DskipTests
docker-compose down && docker-compose up --build
检查日志:
docker-compose logs -f user-service
docker-compose logs -f order-service
停止服务
docker-compose down
对于联合服务:
docker stop <container-id>
