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