服务发现失败怎么办
在使用微服务治理平台时,经常遇到服务注册后无法被其他服务发现的情况。比如订单服务启动后,在日志里看到注册成功,但支付服务却调用不到它。这通常是因为配置中心的地址写错了,或者网络不通导致心跳检测失败。可以先检查 application.yml 中的注册中心 URL,确认是否指向正确的 Nacos 或 Eureka 地址。
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.1.100:8848如果地址没问题,再查看防火墙设置,确保 8848 端口是开放的。有时候开发人员在本地测试,忘了开公司内网权限,也会出现这类问题。
调用链追踪看不到数据
线上出了问题,想查哪个环节耗时最长,结果打开 SkyWalking 页面,调用链一片空白。这种情况多半是客户端探针没装好。Spring Boot 项目需要引入 skywalking-agent.jar 并在启动命令里加上 -javaagent 参数。
java -javaagent:/opt/skywalking/agent/skywalking-agent.jar
-Dskywalking.agent.service_name=order-service
-jar order-service.jar少了这个参数,服务就不会上报链路数据。也有人把环境变量写错了,比如把 collector.backend_service 写成了本地 IP,而实际后端服务部署在 Kubernetes 集群内部,网络不通自然收不到数据。
限流规则不生效
大促期间怕系统扛不住,提前在 Sentinel 控制台上配了限流规则,结果流量一来还是崩了。排查后发现,原来只在控制台配置了规则,却没有在代码里接入 @SentinelResource 注解。
@RestController
public class OrderController {
@GetMapping("/create")
@SentinelResource(value = "createOrder", blockHandler = "handleBlock")
public String createOrder() {
return "订单创建成功";
}
}没有这个注解,Sentinel 就不知道要监控哪个方法,规则自然不会触发。还有些团队用了 Spring Cloud Gateway 做统一入口,但忘了在网关层配置路由级流控,导致请求直接打穿到下游。
配置更新不及时
改了个数据库连接超时时间,通过 Nacos 发布了新配置,可服务重启前一直用的还是旧值。这是因为很多项目默认没开启自动刷新。需要在类上加 @RefreshScope 注解才能让配置动态更新。
@Component
@RefreshScope
public class DbConfig {
@Value("${db.timeout:5000}")
private int timeout;
}不然就得重启服务才能加载新配置。有些老系统甚至压根没引入 spring-cloud-starter-alibaba-nacos-config 依赖,根本没法监听配置变化,这种只能手动改完重启了事。
服务雪崩怎么防
一个核心服务挂了,结果整个系统都卡住,用户刷不出页面。这就是典型的服务雪崩。比如商品详情页依赖库存、价格、评论三个服务,其中一个响应慢,线程池被占满,其他请求全堵着。这时候应该启用熔断机制,Hystrix 或 Sentinel 都能设置熔断策略。
// 设置 10 秒内错误率超过 50% 就熔断
@HystrixCommand(fallbackMethod = "getDefaultPrice")
public String getPrice() {
// 调用远程服务
}一旦触发熔断,后续请求直接走降级逻辑,返回默认值,避免拖垮整个调用链。同时配合线程隔离,不同服务用不同的线程池,就算某个服务出问题,也不影响别的功能正常使用。