下面是一个完整的 微服务拆分示例代码工程,采用 Spring Boot + Spring Cloud + Docker,演示了如何将“用户服务”和“订单服务”分成两个独立微服务,并通过 REST 接口通信完成一个简单的“下订单”流程。


✅ 微服务拆分实战代码(用户服务 + 订单服务)

🧱 项目结构

microservices-demo/
├── user-service/       --> 用户服务(独立 Spring Boot 应用)
├── order-service/      --> 订单服务(独立 Spring Boot 应用)
└── docker-compose.yml  --> Docker 一键启动服务

🧩 1. 用户服务(user-service)

📁 user-service/src/main/java/com/example/user/UserServiceApplication.java

@SpringBootApplication
@RestController
@RequestMapping("/users")
public class UserServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }

    // 假设返回用户信息
    @GetMapping("/{id}")
    public Map<String, String> getUser(@PathVariable String id) {
        return Map.of("id", id, "name", "User_" + id);
    }
}

📄 user-service/pom.xml(关键依赖)

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

📦 2. 订单服务(order-service)

📁 order-service/src/main/java/com/example/order/OrderServiceApplication.java

@SpringBootApplication
@RestController
@RequestMapping("/orders")
public class OrderServiceApplication {

    @Autowired
    private RestTemplate restTemplate;

    public static void main(String[] args) {
        SpringApplication.run(OrderServiceApplication.class, args);
    }

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    @PostMapping("/create/{userId}")
    public Map<String, Object> createOrder(@PathVariable String userId) {
        // 调用用户服务获取用户信息
        Map userInfo = restTemplate.getForObject("http://localhost:8081/users/" + userId, Map.class);
        return Map.of(
                "orderId", UUID.randomUUID().toString(),
                "user", userInfo,
                "status", "CREATED"
        );
    }
}

📄 order-service/pom.xml(关键依赖)

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

🐳 3. 使用 Docker Compose 启动两个服务

📄 docker-compose.yml

version: '3.8'

services:
  user-service:
    build: ./user-service
    ports:
      - "8081:8080"
  
  order-service:
    build: ./order-service
    ports:
      - "8082:8080"

📌 注意:这里默认两个服务分别运行在 8081 和 8082 端口。


✅ 4. 构建与运行

确保你安装了 JDK、Maven、Docker,执行以下命令:

# 构建镜像
cd microservices-demo
docker-compose build

# 启动服务
docker-compose up

🔍 5. 测试接口调用

返回示例:

{
  "orderId": "ccf7e11e-21d9-4b32-b7a1-c1e82ac9c62a",
  "user": {
    "id": "1001",
    "name": "User_1001"
  },
  "status": "CREATED"
}

📌 小结

  • 用户服务与订单服务完全解耦,分别启动
  • 服务间通过 HTTP REST 调用(可替换为 Feign、gRPC、消息队列)
  • Docker Compose 实现本地一键部署
  • 可继续扩展:商品服务、库存服务、服务注册发现、网关、熔断限流等

如你希望:

  • 增加服务注册中心(如 Nacos / Eureka)
  • 用 Spring Cloud OpenFeign 替代 RestTemplate
  • 改为 gRPC 通信或 Kafka 消息驱动
  • 添加分布式链路追踪或数据库操作

我可以为你继续补充更多代码模块,是否继续深入?