【微服务初体验】Spring Cloud+MySQL构建简易电商系统 - 教程

技术选型与架构设计

Spring Cloud 微服务架构通常包含以下核心组件:

  • 服务注册与发现:Eureka/Nacos
  • API网关:Spring Cloud Gateway
  • 配置中心:Spring Cloud Config/Nacos
  • 数据库:MySQL 8.0+分库分表
  • 服务间通信:OpenFeign/RestTemplate
  • 熔断降级:Hystrix/Sentinel

典型服务拆分示例:

  • 用户服务(user-service)
  • 商品服务(product-service)
  • 订单服务(order-service)
  • 支付服务(payment-service)

数据库设计要点

MySQL表结构设计应遵循微服务边界:

CREATE TABLE `product` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `price` decimal(10,2) NOT NULL,
  `stock` int DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `order` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `user_id` bigint NOT NULL,
  `total_amount` decimal(10,2) NOT NULL,
  `status` tinyint DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

分库分表策略建议:

  • 用户ID取模分片
  • 时间范围分表
  • 使用ShardingSphere实现

服务实现示例

商品服务接口定义:

@RestController
@RequestMapping("/products")
public class ProductController {
    @Autowired
    private ProductService productService;
    @GetMapping("/{id}")
    public Product getProduct(@PathVariable Long id) {
        return productService.getById(id);
    }
    @PostMapping("/reduce-stock")
    public Boolean reduceStock(@RequestParam Long productId,
                             @RequestParam Integer quantity) {
        return productService.reduceStock(productId, quantity);
    }
}

Feign客户端调用示例:

@FeignClient(name = "product-service", path = "/products")
public interface ProductFeignClient {
    @GetMapping("/{id}")
    Product getProduct(@PathVariable Long id);
    @PostMapping("/reduce-stock")
    Boolean reduceStock(@RequestParam Long productId,
                      @RequestParam Integer quantity);
}

分布式事务处理

Seata AT模式配置:

# application.properties
spring.cloud.alibaba.seata.tx-service-group=my_test_tx_group
seata.service.grouplist.default=127.0.0.1:8091

业务方法注解:

@GlobalTransactional
public void createOrder(OrderDTO orderDTO) {
    // 1. 扣减库存
    productFeignClient.reduceStock(orderDTO.getProductId(), orderDTO.getQuantity());
    // 2. 创建订单
    orderService.create(orderDTO);
    // 3. 扣减余额
    accountFeignClient.decrease(orderDTO.getUserId(), orderDTO.getAmount());
}

性能优化建议

缓存策略实施:

@Cacheable(value = "product", key = "#id")
public Product getById(Long id) {
    return productMapper.selectById(id);
}
@CacheEvict(value = "product", key = "#productId")
public Boolean reduceStock(Long productId, Integer quantity) {
    return productMapper.reduceStock(productId, quantity) > 0;
}

接口限流配置:

@RestController
@SentinelResource(value = "productApi",
                blockHandler = "handleBlock")
public class ProductController {
    public Product handleBlock(Long id, BlockException ex) {
        return Product.emptyProduct();
    }
}

部署与监控

Docker Compose部署示例:

version: '3'
services:
  product-service:
    image: demo/product-service:1.0
    ports:
      - "8081:8080"
    depends_on:
      - mysql
      - nacos
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root

监控指标采集:



    org.springframework.boot
    spring-boot-starter-actuator


    io.micrometer
    micrometer-registry-prometheus

posted on 2025-10-24 14:28  slgkaifa  阅读(2)  评论(0)    收藏  举报

导航