【微服务初体验】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>
相关推荐
鹏北海-RemHusband1 小时前
从零到一:基于 micro-app 的企业级微前端模板完整实现指南
前端·微服务·架构
7哥♡ۣۖᝰꫛꫀꪝۣℋ1 小时前
Spring-cloud\Eureka
java·spring·微服务·eureka
洛豳枭薰1 小时前
Innodb一次更新动作
mysql
xcLeigh2 小时前
Python 项目实战:用 Flask 实现 MySQL 数据库增删改查 API
数据库·python·mysql·flask·教程·python3
Fleshy数模2 小时前
MySQL 表创建全攻略:Navicat 图形化与 Xshell 命令行双模式实践
linux·mysql
Nandeska3 小时前
15、基于MySQL的组复制
数据库·mysql
AllData公司负责人3 小时前
AllData数据中台-数据同步平台【Seatunnel-Web】整库同步MySQL同步Doris能力演示
大数据·数据库·mysql·开源
醇氧4 小时前
【docker】mysql 8 的健康检查(Health Check)
mysql·docker·容器
lekami_兰4 小时前
MySQL 长事务:藏在业务里的性能 “隐形杀手”
数据库·mysql·go·长事务
惊讶的猫5 小时前
OpenFeign(声明式HTTP客户端)
网络·网络协议·http·微服务·openfeign