当前位置: 首页 > 产品大全 > 黑马程序员SpringCloud微服务实战Day3 从零到一,我的踩坑与Bug攻坚实录

黑马程序员SpringCloud微服务实战Day3 从零到一,我的踩坑与Bug攻坚实录

黑马程序员SpringCloud微服务实战Day3 从零到一,我的踩坑与Bug攻坚实录

Day3:服务注册与发现的迷雾与破晓

经过前两天的环境搭建与基础概念梳理,Day3的实战正式进入了微服务的核心环节——服务注册与发现。本以为照着教程能一帆风顺,没想到却踏入了一个又一个“坑”,但也正是这些坑,让我对Eureka、Nacos这些组件的理解从“知道”深化到了“懂得”。

一、核心学习与实战步骤

1. Eureka Server 搭建:相对顺利,主要配置了服务端端口、关闭自我保护模式(为了在测试环境更直观地看到服务剔除)和实例名。
`yaml
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false # 单机版server,不自我注册
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
`

  1. 服务提供者(Provider)注册:在商品服务模块中引入spring-cloud-starter-netflix-eureka-client依赖,并在配置文件中指向Eureka Server地址。
  1. 服务消费者(Consumer)发现与调用:在订单服务模块中同样引入客户端依赖,并使用RestTemplateOpenFeign通过服务名进行调用。

二、踩坑与Bug记录(全网最全实战陷阱)

坑1:服务实例IP显示异常,显示为“127.0.0.1”或主机名
现象:Eureka控制台的服务实例链接不可点,或指向错误地址。
原因:Eureka客户端默认获取的主机信息可能不正确,尤其是在Docker或多网卡环境中。
* 解决:在服务提供者的application.yml中强制指定IP地址和实例名。
`yaml
eureka:
instance:
prefer-ip-address: true
ip-address: 你的本机实际IP(如192.168.1.100)
instance-id: ${spring.cloud.client.ip-address}:${server.port} # 用IP:端口作为实例ID,更清晰
`

坑2:消费者无法通过服务名解析到提供者,报“UnknownHostException”
现象:订单服务使用RestTemplate调用http://PRODUCT-SERVICE/product/1时,提示未知主机。
原因RestTemplate默认没有负载均衡能力,无法将服务名解析为具体的实例地址。
解决:有两种方案:
方案A(使用LoadBalanced):在创建RestTemplate的Bean上添加@LoadBalanced注解。
`java
@Bean
@LoadBalanced // 关键注解!
public RestTemplate restTemplate() {
return new RestTemplate();
}
`

  • 方案B(使用OpenFeign):直接使用声明式客户端,更优雅。需在主启动类加@EnableFeignClients,并编写接口。

坑3:OpenFeign接口编写后,注入调用报“BeanCreationException”
现象:FeignClient接口定义无误,但启动时Spring容器创建Bean失败。
原因:最常见的原因是依赖缺失扫描路径问题
* 解决
1. 检查是否引入了spring-cloud-starter-openfeign依赖。

  1. 确保主启动类@EnableFeignClients注解的包扫描范围能覆盖到你的FeignClient接口。如果接口不在主类子包下,需指定:@EnableFeignClients(basePackages = "com.example.api")

坑4:服务下线后,Eureka控制台仍有残留(自我保护机制)
现象:手动停掉一个服务实例后,Eureka页面仍显示该实例,状态为“DOWN”但未被剔除。
原因:Eureka Server的自我保护机制。当短时间内丢失过多客户端(如网络故障),Eureka会进入自我保护模式,保留所有实例,防止“误杀”。这在生产环境是优点,在测试环境却会造成困惑。
解决(仅供测试环境)
Server端:关闭自我保护,并缩短清理间隔。
`yaml
eureka:
server:
enable-self-preservation: false # 关闭自我保护
eviction-interval-timer-in-ms: 3000 # 清理间隔(毫秒)
`

* Client端:加快心跳和续约间隔。
`yaml
eureka:
instance:
lease-renewal-interval-in-seconds: 5 # 客户端向服务端发送心跳的间隔(默认30秒)
lease-expiration-duration-in-seconds: 10 # 服务端收到最后一次心跳后等待时间,超时剔除(默认90秒)
`

三、运维服务视角的思考

今天的踩坑经历,让我深刻体会到开发与运维的紧密关联。在微服务架构下:

  1. 配置即代码:像instance-idprefer-ip-address这样的配置,直接决定了服务在注册中心的“可观测性”和“可维护性”。清晰的命名和准确的IP是后续进行日志追踪、服务治理的基础。
  2. 理解默认配置:框架的默认配置(如Eureka的自我保护)往往为生产环境的稳定性设计。作为开发者兼未来可能的运维者,必须理解其原理,并知道如何在不同的环境(开发/测试/生产)中进行恰当的调整。
  3. 健康检查与故障快速发现:服务注册与发现不仅是“上线”,更是持续的健康监控。后续需要集成Actuator健康端点,并考虑如何与监控告警系统联动,实现从“服务不可用”到“开发人员收到告警”的快速闭环。

四、明日计划

成功打通服务调用后,明天将向更深处进发:

  • 深入负载均衡:Ribbon与LoadBalancer的原理与自定义策略。
  • 服务容错堡垒:Hystrix或Sentinel实现熔断、降级,这是保障系统高可用的关键。
  • 期待新的“坑”与突破!

---
****:Day3是一场从“连接失败”的焦虑到“调用成功”的狂喜的旅程。每一个Bug都不是绊脚石,而是通往更深层理解的阶梯。微服务之路,道阻且长,行则将至。

如若转载,请注明出处:http://www.zhengsl.com/product/61.html

更新时间:2026-02-24 12:14:27

产品大全

Top