0赞
赞赏
更多好文
去年我们团队升级Spring Boot 3.0时,老大拍着桌子说:“上云!必须用微服务!”结果第一版部署直接翻车——服务注册失败、配置乱成一团、压测时直接崩了。折腾了两周才跑通。今天不扯虚的,直接上真实踩坑经验,手把手教你从零搭出能扛住大流量的系统。
一、环境准备:别踩这些坑
关键点:Spring Boot 3.0必须用Java 17+,别用JDK 11!
在pom.xml里先干掉这些坑:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.0</version> <!-- 必须是3.0+ -->
</parent>
<properties>
<java.version>17</java.version> <!-- 重点!别写11 -->
</properties>
血泪教训:
我同事在本地跑得好好的,一部署到测试环境就报NoClassDefFoundError,查了三天才发现是JDK版本混了。现在公司强制所有项目用JDK 17,别省事。
二、核心组件:Nacos+Sentinel组合拳
为什么选Nacos?
Eureka太老,Zookeeper太重,Nacos(阿里巴巴开源)又支持服务注册、配置中心、熔断,一锅端。
1. 服务注册与发现(最基础但最易错)
在application.yml里配Nacos:
spring:
cloud:
nacos:
server-addr: 127.0.0.1:8848 # 本地Nacos地址
discovery:
# 必须加!否则服务不注册
register-enabled: true
关键配置:
在启动类加@EnableDiscoveryClient(不是@EnableEurekaClient!)
踩坑点:
- 没加
register-enabled: true→ 服务注册失败,日志全是No service instance found - Nacos端口写错(比如写成8849)→ 服务注册超时,排查半天
2. 配置中心(动态刷新救命稻草)
把数据库密码、超时时间这些扔进Nacos Config:
-
在Nacos控制台新建配置:
- Data ID:
user-service.properties - Group:
DEFAULT_GROUP - 内容:
spring.datasource.password=123456
- Data ID:
-
服务端配置:
@Configuration
public class Config {
@Value("${spring.datasource.password}")
private String dbPassword;
// 用@RefreshScope让配置热更新
@Bean
@RefreshScope
public DataSource dataSource() {
return DataSourceBuilder.create().password(dbPassword).build();
}
}
真实案例:
上线时发现密码写错,直接在Nacos改配置,不用重启服务!比以前动不动就重启强100倍。
三、高可用核心:Sentinel熔断实战
为什么必须加Sentinel?
没熔断的微服务,一个接口卡死,整个系统全崩。去年我们服务被流量冲垮,就是没配熔断。
1. 添加依赖(pom.xml)
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2. 配置熔断规则(Nacos里配)
在Nacos控制台:
- 点击“流控规则” → 新建规则
- 资源名:
/api/user/{id}(对应Controller路径) - 流控阈值:
500(QPS) - 熔断策略:慢调用比例 → 慢调用比例阈值:
0.5(50%慢请求触发熔断)
效果:
当接口平均响应时间>500ms且占比超50%,自动熔断,返回友好错误页,而不是让请求堆积。
四、从零搭一个服务:用户服务示例
步骤1:创建Spring Boot项目
用Spring Initializr选:
- Spring Web
- Nacos Discovery
- Nacos Config
- Sentinel
步骤2:写个简单接口(UserController.java)
@RestController
@RequestMapping("/api/user")
public class UserController {
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
// 模拟慢请求(测试熔断用)
if (id % 2 == 0) {
try { Thread.sleep(1000); } catch (InterruptedException e) {}
}
return new User(id, "user" + id);
}
}
步骤3:启动服务
- 先启动Nacos(下载地址)
- 启动服务,访问
http://localhost:8080/api/user/1 - 用JMeter压测:1000并发,QPS 500(看Nacos控制台服务列表,确认注册成功)
高可用验证:
当接口响应超时,Sentinel自动弹出熔断页面,其他请求不受影响。之前没配熔断时,压测到200 QPS就卡死。
五、避坑指南(全是血泪)
-
Spring Cloud版本冲突
- 问题:
spring-cloud-starter-alibaba-nacos-discovery用2.2.6.RELEASE,Spring Boot 3.0需要2.2.10+ - 解决:在pom.xml统一管理版本:
<dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2022.0.0.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
- 问题:
-
Nacos配置热更新失效
- 问题:改了Nacos配置,服务不刷新
- 解决:必须加
@RefreshScope(Bean上)+@Value读取,别用@ConfigurationProperties(Spring Boot 3.0有兼容问题)
-
Sentinel控制台不显示
- 问题:访问
http://localhost:8080/sc404 - 解决:在
application.yml加:
注意:Sentinel控制台单独下载,不是Spring Boot自带。server: port: 8080 spring: cloud: sentinel: enabled: true # 指定控制台地址 transport: dashboard: localhost:8080
- 问题:访问
六、为什么说“高可用”?
- 服务注册:Nacos自动发现,4台机器部署,1台挂了其他3台顶上
- 配置动态:数据库密码改了,Nacos一改,服务秒刷新
- 熔断兜底:接口超时自动降级,返回
{"code":503,"msg":"服务不可用"} - 监控:Sentinel看板实时显示QPS、错误率、熔断状态(比以前用Prometheus简单多了)
结语:别再等了
Spring Boot 3.0 + Nacos + Sentinel这套组合,我们线上跑了3个月,从原来的300 QPS提升到1500+,没再出现过服务雪崩。
现在就做:
- 升级JDK 17
- 用Spring Initializr建个新项目
- 按着避坑指南配Nacos和Sentinel
别被“微服务”吓到,它就是把大应用拆成小服务,再用这些工具管好。去年我团队被坑的,今年都成了老手。
