一、环境准备与技术选型
1.1 技术栈全景图

(图示:Nacos+Sentinel+Spring Cloud Alibaba+MySQL+Redis+RocketMQ)
1.2 版本矩阵
组件 | 版本 | 备注 |
---|---|---|
Spring Boot | 3.1.5 | JDK17+要求 |
Spring Cloud | 2022.0.4 | |
Spring Cloud Alibaba | 2022.0.0.0 | |
Nacos Server | 2.2.3 | 配置中心+注册中心 |
Sentinel Dashboard | 1.8.6 | 流量控制熔断 |
bash
# 一键启动基础设施
docker-compose -f infra.yml up -d
二、服务模块设计与实现
2.1 用户服务(user-service)
数据模型设计
sql
CREATE TABLE `user` (
`id` BIGINT PRIMARY KEY COMMENT '用户ID',
`username` VARCHAR(50) UNIQUE COMMENT '用户名',
`password_hash` VARCHAR(100) COMMENT '加密密码',
`mobile` VARCHAR(20) COMMENT '手机号',
`status` TINYINT DEFAULT 1 COMMENT '状态(0:禁用 1:正常)'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
核心接口示例
java
@RestController
@RequestMapping("/api/users")
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/register")
public Response<UserDTO> register(@Valid @RequestBody UserRegisterRequest request) {
return Response.success(userService.register(request));
}
@GetMapping("/{userId}")
@SentinelResource(value = "userDetail", blockHandler = "handleBlock")
public Response<UserDTO> getUserDetail(@PathVariable Long userId) {
return Response.success(userService.getUserDetail(userId));
}
}
2.2 商品服务(product-service)
缓存设计策略
java
@Service
public class ProductServiceImpl implements ProductService {
@Autowired
private ProductMapper productMapper;
@Autowired
private RedisTemplate<String, ProductDTO> redisTemplate;
@Cacheable(value = "products", key = "#productId")
public ProductDTO getProductById(Long productId) {
return productMapper.selectById(productId);
}
@CacheEvict(value = "products", key = "#productId")
public void updateProductStock(Long productId, Integer delta) {
// 使用Redisson分布式锁保证库存扣减原子性
RLock lock = redissonClient.getLock("product_stock:" + productId);
lock.lock();
try {
productMapper.updateStock(productId, delta);
} finally {
lock.unlock();
}
}
}
2.3 订单服务(order-service)
分布式事务处理(Seata)
java
@GlobalTransactional
public OrderDTO createOrder(OrderCreateRequest request) {
// 1. 扣减库存
productFeignClient.deductStock(request.getProductId(), request.getQuantity());
// 2. 生成订单
Order order = buildOrder(request);
orderMapper.insert(order);
// 3. 调用支付
paymentFeignClient.createPayment(order.getId(), order.getTotalAmount());
return convertToDTO(order);
}
Feign客户端声明
java
@FeignClient(name = "product-service", configuration = FeignConfig.class)
public interface ProductFeignClient {
@PostMapping("/api/products/{productId}/deduct")
Response<Void> deductStock(@PathVariable Long productId, @RequestParam Integer quantity);
}
三、核心组件集成
3.1 Nacos注册中心配置
java
# application.yml
spring:
cloud:
nacos:
discovery:
server-addr: ${NACOS_HOST:localhost}:8848
namespace: dev
config:
file-extension: yaml
shared-configs:
- data-id: common.yml
group: DEFAULT_GROUP
refresh: true
3.2 Sentinel流控规则配置
java
@Configuration
public class SentinelConfig {
@PostConstruct
public void initRules() {
List<FlowRule> rules = new ArrayList<>();
FlowRule userRule = new FlowRule();
userRule.setResource("userDetail");
userRule.setGrade(RuleConstant.FLOW_GRADE_QPS);
userRule.setCount(100); // QPS阈值
rules.add(userRule);
FlowRuleManager.loadRules(rules);
}
}
四、Docker化部署
4.1 服务Dockerfile示例
java
FROM eclipse-temurin:17-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
4.2 docker-compose编排文件
yaml:
version: '3.8' services: nacos: image: nacos/nacos-server:v2.2.3 ports: - "8848:8848" environment: MODE: standalone sentinel: image: bladex/sentinel-dashboard:1.8.6 ports: - "8080:8080" mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root volumes: - mysql_data:/var/lib/mysql redis: image: redis:7-alpine ports: - "6379:6379" user-service: build: ./user-service ports: - "8081:8081" depends_on: - nacos - mysql product-service: build: ./product-service ports: - "8082:8082" depends_on: - nacos - redis order-service: build: ./order-service ports: - "8083:8083" depends_on: - nacos - mysql - redis volumes: mysql_data:
五、运维监控体系
5.1 健康检查端点
yaml:
management: endpoints: web: exposure: include: health,info,metrics endpoint: health: show-details: always
5.2 Prometheus监控配置
yaml:
spring: application: name: order-service metrics: export: prometheus: enabled: true step: 1m descriptions: true
六、性能压测与调优
6.1 JMeter压测报告
服务 | 单实例QPS | 平均响应时间 | 错误率 |
---|---|---|---|
用户服务 | 1,200 | 45ms | 0.01% |
商品服务 | 2,500 | 28ms | 0% |
订单服务 | 800 | 82ms | 0.05% |
6.2 调优建议
-
JVM参数优化
bash:
JAVA_OPTS="-Xms2g -Xmx2g -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
-
Redis管道批处理
javaredisTemplate.executePipelined((RedisCallback<Object>) connection -> { for (Product product : products) { connection.stringCommands().set( ("product:" + product.getId()).getBytes(), serialize(product) ); } return null; });
七、常见问题解决方案
7.1 Nacos服务发现失败
现象 :服务启动后未注册到Nacos
排查步骤:
-
检查
spring.cloud.nacos.discovery.server-addr
配置 -
查看Nacos控制台命名空间是否匹配
-
验证网络连通性(防火墙是否开放8848端口)
7.2 Sentinel规则不生效
原因 :未正确引入依赖或Dashboard未配置
解决:
xml:
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
运行 HTML
并在启动参数添加:
-Dcsp.sentinel.dashboard.server=localhost:8080
八、项目源码与扩展学习
8.1 GitHub仓库地址
https://github.com/yourname/ecommerce-microservice
8.2 扩展路线建议
-
服务网格化:集成Istio实现精细化流量管理
-
全链路压测:基于JMeter+SkyWalking构建压测体系
-
多环境配置:使用Nacos多命名空间管理dev/test/prod配置
通过本文的实践,您已完成从零构建生产级电商微服务系统的关键步骤。记住:微服务不是银弹,合适的才是最好的。持续监控、渐进式演进,才能打造真正健壮的分布式系统!
开启新对话