
技术选型与架构设计
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>