經(jīng)過前兩天的環(huán)境搭建與基礎(chǔ)概念梳理,Day3的實戰(zhàn)正式進入了微服務(wù)的核心環(huán)節(jié)——服務(wù)注冊與發(fā)現(xiàn)。本以為照著教程能一帆風順,沒想到卻踏入了一個又一個“坑”,但也正是這些坑,讓我對Eureka、Nacos這些組件的理解從“知道”深化到了“懂得”。
1. Eureka Server 搭建:相對順利,主要配置了服務(wù)端端口、關(guān)閉自我保護模式(為了在測試環(huán)境更直觀地看到服務(wù)剔除)和實例名。
`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通過服務(wù)名進行調(diào)用。坑1:服務(wù)實例IP顯示異常,顯示為“127.0.0.1”或主機名
現(xiàn)象:Eureka控制臺的服務(wù)實例鏈接不可點,或指向錯誤地址。
原因:Eureka客戶端默認獲取的主機信息可能不正確,尤其是在Docker或多網(wǎng)卡環(huán)境中。
* 解決:在服務(wù)提供者的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:消費者無法通過服務(wù)名解析到提供者,報“UnknownHostException”
現(xiàn)象:訂單服務(wù)使用RestTemplate調(diào)用http://PRODUCT-SERVICE/product/1時,提示未知主機。
原因:RestTemplate默認沒有負載均衡能力,無法將服務(wù)名解析為具體的實例地址。
解決:有兩種方案:
方案A(使用LoadBalanced):在創(chuàng)建RestTemplate的Bean上添加@LoadBalanced注解。
`java
@Bean
@LoadBalanced // 關(guān)鍵注解!
public RestTemplate restTemplate() {
return new RestTemplate();
}
`
@EnableFeignClients,并編寫接口。坑3:OpenFeign接口編寫后,注入調(diào)用報“BeanCreationException”
現(xiàn)象:FeignClient接口定義無誤,但啟動時Spring容器創(chuàng)建Bean失敗。
原因:最常見的原因是依賴缺失或掃描路徑問題。
* 解決:
1. 檢查是否引入了spring-cloud-starter-openfeign依賴。
@EnableFeignClients注解的包掃描范圍能覆蓋到你的FeignClient接口。如果接口不在主類子包下,需指定:@EnableFeignClients(basePackages = "com.example.api")。坑4:服務(wù)下線后,Eureka控制臺仍有殘留(自我保護機制)
現(xiàn)象:手動停掉一個服務(wù)實例后,Eureka頁面仍顯示該實例,狀態(tài)為“DOWN”但未被剔除。
原因:Eureka Server的自我保護機制。當短時間內(nèi)丟失過多客戶端(如網(wǎng)絡(luò)故障),Eureka會進入自我保護模式,保留所有實例,防止“誤殺”。這在生產(chǎn)環(huán)境是優(yōu)點,在測試環(huán)境卻會造成困惑。
解決(僅供測試環(huán)境):
Server端:關(guān)閉自我保護,并縮短清理間隔。
`yaml
eureka:
server:
enable-self-preservation: false # 關(guān)閉自我保護
eviction-interval-timer-in-ms: 3000 # 清理間隔(毫秒)
`
* Client端:加快心跳和續(xù)約間隔。
`yaml
eureka:
instance:
lease-renewal-interval-in-seconds: 5 # 客戶端向服務(wù)端發(fā)送心跳的間隔(默認30秒)
lease-expiration-duration-in-seconds: 10 # 服務(wù)端收到最后一次心跳后等待時間,超時剔除(默認90秒)
`
今天的踩坑經(jīng)歷,讓我深刻體會到開發(fā)與運維的緊密關(guān)聯(lián)。在微服務(wù)架構(gòu)下:
instance-id、prefer-ip-address這樣的配置,直接決定了服務(wù)在注冊中心的“可觀測性”和“可維護性”。清晰的命名和準確的IP是后續(xù)進行日志追蹤、服務(wù)治理的基礎(chǔ)。成功打通服務(wù)調(diào)用后,明天將向更深處進發(fā):
---
****:Day3是一場從“連接失敗”的焦慮到“調(diào)用成功”的狂喜的旅程。每一個Bug都不是絆腳石,而是通往更深層理解的階梯。微服務(wù)之路,道阻且長,行則將至。
如若轉(zhuǎn)載,請注明出處:http://www.mjonline.cn/product/61.html
更新時間:2026-02-24 12:14:27