【微服务初体验】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表结构设计应遵循微服务边界:

sql 复制代码
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实现

服务实现示例

商品服务接口定义:

java 复制代码
@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客户端调用示例:

java 复制代码
@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模式配置:

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

业务方法注解:

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

性能优化建议

缓存策略实施:

java 复制代码
@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;
}

接口限流配置:

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

部署与监控

Docker Compose部署示例:

yaml 复制代码
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

监控指标采集:

XML 复制代码
<!-- pom.xml -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
相关推荐
月夕·花晨5 小时前
Gateway-断言
java·开发语言·分布式·spring cloud·微服务·nacos·sentinel
小霞在敲代码5 小时前
MySQL主从同步原理
mysql
Morpheon5 小时前
SQL窗口函数中的排名函数详解:从基础到高级应用
数据库·sql·mysql
lang201509286 小时前
MySQL I/O容量调优终极指南
数据库·mysql
kobe_OKOK_6 小时前
mysql 创建容器和启动远程链接
数据库·mysql
Z_z在努力9 小时前
【MySQL 高阶】MySQL 架构与存储引擎全面详解
数据库·mysql·架构
全栈工程师修炼指南9 小时前
DBA | MySQL 数据库基础查询语句学习实践笔记
数据库·笔记·学习·mysql·dba
veminhe10 小时前
MySQL 索引失效原理剖析:别让 “加速键” 变成 “绊脚石”
mysql
奥尔特星云大使10 小时前
mysql重置管理员密码
linux·运维·数据库·mysql·centos