【微服务初体验】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>
相关推荐
努力努力再努力wz几秒前
【MySQL 进阶系列】拒绝滥用root:从 mysql.user 到权限校验,带你彻底理解用户管理与授权机制!
android·c语言·开发语言·数据结构·数据库·c++·mysql
超梦dasgg2 分钟前
智慧充电系统订单服务Java 实现方案
java·开发语言·微服务
迷糊小白告27 分钟前
Java微服务——SpringCloud
java·spring cloud·微服务
Hical_W1 小时前
用 Hical + MySQL 5 分钟搭建 CRUD API(C++20 协程版)
数据库·mysql·c++20
想唱rap2 小时前
传输层协议之UDP
java·linux·网络·c++·网络协议·mysql·udp
猪脚踏浪2 小时前
mysql 用户授权
mysql
budingxiaomoli4 小时前
注册中心的其他实现-Nacos
java·spring cloud·微服务
努力努力再努力wz4 小时前
【MySQL 进阶系列】C/C++ 如何通过客户端库访问 MySQL?从连接原理到 API 调用流程详解(附完整demo代码)
服务器·c语言·数据结构·数据库·c++·b树·mysql
苍煜5 小时前
SkyWalking最新实操入门博客:微服务可观测性搭建+原理详解+从零部署+UI使用教程
ui·微服务·skywalking
重生之小比特6 小时前
【MySQL 数据库】表的操作
数据库·mysql