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

服务清单

完整的服务列表

基础设施服务:

  1. MySQL:5个数据库实例(user_db, product_db, order_db, payment_db, inventory_db)
  2. Nacos Server:服务注册与发现、配置中心(端口 8848)
  3. Seata Server:分布式事务协调者(端口 8091)
  4. RocketMQ:消息队列(NameServer 端口 9876)
  5. Sentinel Dashboard:流量控制控制台(端口 8080)

业务服务:

  1. Gateway Service:API 网关(端口 8080)
  2. User Service:用户服务(端口 8081)
  3. Product Service:商品服务(端口 8082)
  4. Order Service:订单服务(端口 8083)
  5. Payment Service:支付服务(端口 8084)
  6. 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"

启动顺序说明

服务启动顺序:

  1. 基础设施服务(Docker Compose):

    • MySQL 数据库
    • Nacos Server
    • Seata Server
    • RocketMQ
    • Sentinel Dashboard
  2. 基础服务(独立启动):

    • User Service(端口 8081)
    • Product Service(端口 8082)
  3. 业务服务(独立启动):

    • Order Service(端口 8083)
    • Payment Service(端口 8084)
    • Inventory Service(端口 8085)
  4. 网关服务(最后启动):

    • 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 ==="

配置检查项

必须检查的配置项:

  1. Nacos 配置

    • Nacos 服务器地址:localhost:8848
    • 命名空间:public
    • 分组:DEFAULT_GROUP
  2. 数据库配置

    • 每个服务的数据库连接
    • 数据库是否已创建
    • 表结构是否已初始化
  3. 服务注册配置

    • 服务名配置
    • 端口配置
    • Nacos 连接配置
  4. 组件配置

    • Seata 配置(如果使用)
    • RocketMQ 配置(如果使用)
    • Sentinel 配置(如果使用)

服务注册验证

验证步骤

1. 访问 Nacos 控制台:

2. 查看服务列表:

在"服务管理" -> "服务列表"中应该看到以下服务:

  • user-service
  • product-service
  • order-service
  • payment-service
  • inventory-service
  • gateway-service
  • seata-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 ==="

官方资源

本节小结

在本节中,我们学习了:

第一个是服务清单。 完整的微服务列表。

第二个是服务启动顺序。 正确的服务启动顺序。

第三个是配置检查。 配置检查清单。

第四个是服务注册验证。 如何验证服务注册。

这就是完整微服务架构搭建。完成搭建后,我们就有了一个完整的微服务系统。

在下一节,我们将学习服务间调用测试。