经过前两天的环境搭建与基础概念梳理,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/
`
spring-cloud-starter-netflix-eureka-client依赖,并在配置文件中指向Eureka Server地址。RestTemplate或OpenFeign通过服务名进行调用。坑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();
}
`
@EnableFeignClients,并编写接口。坑3:OpenFeign接口编写后,注入调用报“BeanCreationException”
现象:FeignClient接口定义无误,但启动时Spring容器创建Bean失败。
原因:最常见的原因是依赖缺失或扫描路径问题。
* 解决:
1. 检查是否引入了spring-cloud-starter-openfeign依赖。
@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秒)
`
今天的踩坑经历,让我深刻体会到开发与运维的紧密关联。在微服务架构下:
instance-id、prefer-ip-address这样的配置,直接决定了服务在注册中心的“可观测性”和“可维护性”。清晰的命名和准确的IP是后续进行日志追踪、服务治理的基础。成功打通服务调用后,明天将向更深处进发:
---
****:Day3是一场从“连接失败”的焦虑到“调用成功”的狂喜的旅程。每一个Bug都不是绊脚石,而是通往更深层理解的阶梯。微服务之路,道阻且长,行则将至。
如若转载,请注明出处:http://www.zhengsl.com/product/61.html
更新时间:2026-02-24 12:14:27