16.1、完整微服务架构搭建
分类: 综合实战与总结
完整微服务架构搭建
本节将学习如何搭建完整的微服务架构。本节将学习完整微服务架构搭建。
本节将学习:服务清单、服务启动顺序、配置检查,以及服务注册验证。
完整的 Docker Compose 配置
基础设施服务配置
文件路径: mall-microservices/docker/docker-compose.yml
version: '3.8' services: # MySQL 数据库(多个数据库实例) mysql-user: image: mysql:8.0 container_name: mysql-user environment: - MYSQL_ROOT_PASSWORD=root - MYSQL_DATABASE=user_db ports: - "3306:3306" volumes: - mysql-user-data:/var/lib/mysql networks: - mall-network mysql-product: image: mysql:8.0 container_name: mysql-product environment: - MYSQL_ROOT_PASSWORD=root - MYSQL_DATABASE=product_db ports: - "3307:3306" volumes: - mysql-product-data:/var/lib/mysql networks: - mall-network mysql-order: image: mysql:8.0 container_name: mysql-order environment: - MYSQL_ROOT_PASSWORD=root - MYSQL_DATABASE=order_db ports: - "3308:3306" volumes: - mysql-order-data:/var/lib/mysql networks: - mall-network mysql-payment: image: mysql:8.0 container_name: mysql-payment environment: - MYSQL_ROOT_PASSWORD=root - MYSQL_DATABASE=payment_db ports: - "3309:3306" volumes: - mysql-payment-data:/var/lib/mysql networks: - mall-network mysql-inventory: image: mysql:8.0 container_name: mysql-inventory environment: - MYSQL_ROOT_PASSWORD=root - MYSQL_DATABASE=inventory_db ports: - "3310:3306" volumes: - mysql-inventory-data:/var/lib/mysql networks: - mall-network mysql-seata: image: mysql:8.0 container_name: mysql-seata environment: - MYSQL_ROOT_PASSWORD=root - MYSQL_DATABASE=seata ports: - "3311:3306" volumes: - mysql-seata-data:/var/lib/mysql networks: - mall-network # Nacos nacos: image: nacos/nacos-server:v2.3.0 container_name: nacos-server environment: - MODE=standalone ports: - "8848:8848" - "9848:9848" depends_on: - mysql-user networks: - mall-network # Seata Server seata-server: image: seataio/seata-server:latest container_name: seata-server ports: - "8091:8091" - "7091:7091" environment: - SEATA_PORT=8091 - STORE_MODE=file depends_on: - nacos networks: - mall-network # RocketMQ rocketmq-nameserver: image: apache/rocketmq:5.1.4 container_name: rocketmq-nameserver ports: - "9876:9876" command: sh mqnamesrv networks: - mall-network rocketmq-broker: image: apache/rocketmq:5.1.4 container_name: rocketmq-broker ports: - "10909:10909" - "10911:10911" environment: - NAMESRV_ADDR=rocketmq-nameserver:9876 command: sh mqbroker -n rocketmq-nameserver:9876 depends_on: - rocketmq-nameserver networks: - mall-network # Sentinel Dashboard sentinel: image: bladex/sentinel-dashboard:latest container_name: sentinel-dashboard ports: - "8080:8858" environment: - JAVA_OPTS=-Dserver.port=8858 -Dcsp.sentinel.dashboard.server=localhost:8858 networks: - mall-network volumes: mysql-user-data: mysql-product-data: mysql-order-data: mysql-payment-data: mysql-inventory-data: mysql-seata-data: networks: mall-network: driver: bridge
服务清单
完整的服务列表
基础设施服务:
- MySQL:5个数据库实例(user_db, product_db, order_db, payment_db, inventory_db)
- Nacos Server:服务注册与发现、配置中心(端口 8848)
- Seata Server:分布式事务协调者(端口 8091)
- RocketMQ:消息队列(NameServer 端口 9876)
- Sentinel Dashboard:流量控制控制台(端口 8080)
业务服务:
- Gateway Service:API 网关(端口 8080)
- User Service:用户服务(端口 8081)
- Product Service:商品服务(端口 8082)
- Order Service:订单服务(端口 8083)
- Payment Service:支付服务(端口 8084)
- Inventory Service:库存服务(端口 8085)
服务启动顺序
启动脚本
文件路径: mall-microservices/scripts/start-all.sh
#!/bin/bash echo "Starting infrastructure services..." # 1. 启动基础设施服务 cd docker docker-compose up -d echo "Waiting for infrastructure services to be ready..." sleep 30 # 2. 启动基础服务 echo "Starting user service..." cd ../user-service mvn spring-boot:run > ../logs/user-service.log 2>&1 & echo $! > ../logs/user-service.pid sleep 10 echo "Starting product service..." cd ../product-service mvn spring-boot:run > ../logs/product-service.log 2>&1 & echo $! > ../logs/product-service.pid sleep 10 # 3. 启动业务服务 echo "Starting order service..." cd ../order-service mvn spring-boot:run > ../logs/order-service.log 2>&1 & echo $! > ../logs/order-service.pid sleep 10 echo "Starting payment service..." cd ../payment-service mvn spring-boot:run > ../logs/payment-service.log 2>&1 & echo $! > ../logs/payment-service.pid sleep 10 echo "Starting inventory service..." cd ../inventory-service mvn spring-boot:run > ../logs/inventory-service.log 2>&1 & echo $! > ../logs/inventory-service.pid sleep 10 # 4. 启动网关服务 echo "Starting gateway service..." cd ../gateway-service mvn spring-boot:run > ../logs/gateway-service.log 2>&1 & echo $! > ../logs/gateway-service.pid echo "All services started!" echo "Gateway: http://localhost:8080" echo "Nacos: http://localhost:8848/nacos" echo "Sentinel: http://localhost:8080"
启动顺序说明
服务启动顺序:
-
基础设施服务(Docker Compose):
- MySQL 数据库
- Nacos Server
- Seata Server
- RocketMQ
- Sentinel Dashboard
-
基础服务(独立启动):
- User Service(端口 8081)
- Product Service(端口 8082)
-
业务服务(独立启动):
- Order Service(端口 8083)
- Payment Service(端口 8084)
- Inventory Service(端口 8085)
-
网关服务(最后启动):
- Gateway Service(端口 8080)
启动流程图
配置检查清单
完整的配置检查清单
文件路径: mall-microservices/scripts/check-config.sh
#!/bin/bash echo "=== Configuration Check ===" # 1. 检查 Nacos 是否运行 echo "Checking Nacos..." if curl -s http://localhost:8848/nacos/v1/console/health > /dev/null; then echo "✓ Nacos is running" else echo "✗ Nacos is not running" fi # 2. 检查 Seata 是否运行 echo "Checking Seata..." if docker ps | grep seata-server > /dev/null; then echo "✓ Seata is running" else echo "✗ Seata is not running" fi # 3. 检查 RocketMQ 是否运行 echo "Checking RocketMQ..." if docker ps | grep rocketmq-nameserver > /dev/null; then echo "✓ RocketMQ is running" else echo "✗ RocketMQ is not running" fi # 4. 检查 MySQL 是否运行 echo "Checking MySQL..." if docker ps | grep mysql > /dev/null; then echo "✓ MySQL is running" else echo "✗ MySQL is not running" fi # 5. 检查服务注册 echo "Checking service registration..." SERVICES=("user-service" "product-service" "order-service" "payment-service" "inventory-service" "gateway-service") for service in "${SERVICES[@]}"; do if curl -s "http://localhost:8848/nacos/v1/ns/instance/list?serviceName=$service" | grep -q "hosts"; then echo "✓ $service is registered" else echo "✗ $service is not registered" fi done echo "=== Configuration Check Complete ==="
配置检查项
必须检查的配置项:
-
Nacos 配置:
- Nacos 服务器地址:
localhost:8848 - 命名空间:
public - 分组:
DEFAULT_GROUP
- Nacos 服务器地址:
-
数据库配置:
- 每个服务的数据库连接
- 数据库是否已创建
- 表结构是否已初始化
-
服务注册配置:
- 服务名配置
- 端口配置
- Nacos 连接配置
-
组件配置:
- Seata 配置(如果使用)
- RocketMQ 配置(如果使用)
- Sentinel 配置(如果使用)
服务注册验证
验证步骤
1. 访问 Nacos 控制台:
- 地址:http://localhost:8848/nacos
- 用户名:nacos
- 密码:nacos
2. 查看服务列表:
在"服务管理" -> "服务列表"中应该看到以下服务:
user-serviceproduct-serviceorder-servicepayment-serviceinventory-servicegateway-serviceseata-server
3. 检查服务健康状态:
- 点击每个服务,查看实例列表
- 确认所有实例状态为"健康"
- 检查服务元数据
4. 验证服务调用:
# 通过 Gateway 访问用户服务 curl http://localhost:8080/api/users/1 # 通过 Gateway 访问商品服务 curl http://localhost:8080/api/products/1 # 通过 Gateway 创建订单 curl -X POST http://localhost:8080/api/orders \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_TOKEN" \ -d '{"userId": 1, "totalAmount": 100.00}'
验证脚本
文件路径: mall-microservices/scripts/verify-services.sh
#!/bin/bash echo "=== Service Verification ===" # 验证 Gateway echo "Testing Gateway..." if curl -s http://localhost:8080/actuator/health | grep -q "UP"; then echo "✓ Gateway is healthy" else echo "✗ Gateway is not healthy" fi # 验证用户服务 echo "Testing User Service..." if curl -s http://localhost:8081/actuator/health | grep -q "UP"; then echo "✓ User Service is healthy" else echo "✗ User Service is not healthy" fi # 验证商品服务 echo "Testing Product Service..." if curl -s http://localhost:8082/actuator/health | grep -q "UP"; then echo "✓ Product Service is healthy" else echo "✗ Product Service is not healthy" fi # 验证订单服务 echo "Testing Order Service..." if curl -s http://localhost:8083/actuator/health | grep -q "UP"; then echo "✓ Order Service is healthy" else echo "✗ Order Service is not healthy" fi echo "=== Service Verification Complete ==="
官方资源
- Spring Cloud Alibaba 架构搭建:https://spring-cloud-alibaba-group.github.io/github-pages/
本节小结
在本节中,我们学习了:
第一个是服务清单。 完整的微服务列表。
第二个是服务启动顺序。 正确的服务启动顺序。
第三个是配置检查。 配置检查清单。
第四个是服务注册验证。 如何验证服务注册。
这就是完整微服务架构搭建。完成搭建后,我们就有了一个完整的微服务系统。
在下一节,我们将学习服务间调用测试。