最近公司項(xiàng)目準(zhǔn)備遷移kubernetes,于是在測(cè)試的過(guò)程中遇到了Eureka Server常見(jiàn)的unavailable-replicas問(wèn)題,對(duì)于Eureka 高可用部署出現(xiàn)副本不可用,也比較簡(jiǎn)單,其實(shí)就幾個(gè)參數(shù)配置問(wèn)題。以下兩個(gè)參數(shù)必須設(shè)置為true(默認(rèn)為true)(單節(jié)點(diǎn)部署的時(shí)候,設(shè)置成false):
eureka.client.registerWithEureka=true (eureka 實(shí)例之間互相發(fā)現(xiàn))
eureka.client.fetchRegistry=true (eureka 實(shí)例之間信息同步)
主要分兩種情況:
第一種情況,eureka.instance.preferIpAddress=true,這個(gè)時(shí)候應(yīng)該配置eureka.client.serviceUrl.defaultZone=http://ip:8761/eureka/,http://ip:8761/eureka/,因?yàn)榇藭r(shí)主機(jī)的hostname為IP地址,此時(shí)就會(huì)將hostname的值和serviceUrl里面的IP做比較,如果此時(shí)配置的是服務(wù)器的主機(jī)名稱(chēng),就會(huì)導(dǎo)致兩者不相等出現(xiàn)unavailable-replicas。
第二種情況,eureka.instance.preferIpAddress=false,這個(gè)時(shí)候應(yīng)該配置eureka.client.serviceUrl.defaultZone=http://www.zhongjima.net(可以是主機(jī)名、域名等非IP地址):8761/eureka/,http://amd5.cn:8761/eureka/。
此時(shí)還需要配置eureka.instance.hostname=${spring.application.name},如果你要自定義hostname,這里自己手動(dòng)定義,比如eureka.instance.hostname=www.zhongjima.net。
可以參考spring官網(wǎng)的文檔https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-eureka-server.html
eureka unavailable-replicas的詳細(xì)分析可以參考https://www.cnblogs.com/lonelyJay/p/9940199.html 分析得比較詳細(xì)。
隨便參數(shù)就這么幾個(gè),但是發(fā)現(xiàn)實(shí)際使用中出現(xiàn)問(wèn)題還是比較麻煩的。阿湯博客這里簡(jiǎn)單分享下自己使用過(guò)程中遇到的問(wèn)題,希望對(duì)你有幫助。
因?yàn)閗ubernetes pod的ip是隨時(shí)變換的,所以在在配置eureka.client.serviceUrl.defaultZone的時(shí)候,只能采用k8s內(nèi)部域名,所以按照正常的配置一步一步部署,當(dāng)部署好Eureka Server的時(shí)候,發(fā)現(xiàn)副本不可用,首先是懷疑自己參數(shù)配置有錯(cuò)誤,于是仔細(xì)檢查核對(duì)發(fā)現(xiàn)配置沒(méi)問(wèn)題,那為什么會(huì)出現(xiàn)unavailable-replicas這種情況呢,網(wǎng)上大部分資料都是說(shuō)著幾個(gè)參數(shù)的配置問(wèn)題,基本沒(méi)有其他情況會(huì)導(dǎo)致unavailable-replicas。
然后開(kāi)懷疑是kubernetes部署或kubernetes內(nèi)部網(wǎng)絡(luò)問(wèn)題導(dǎo)致,然后一一排查,不采用變量換成手動(dòng)配置hostname,還是無(wú)果,最后嘗試把eureka.instance.preferIpAddress改成true,手動(dòng)填寫(xiě)docker容器的IP測(cè)試,此時(shí)副本狀態(tài)為available-replicas。
現(xiàn)在慢慢有了點(diǎn)方向,初步判斷eureka.instance.preferIpAddress配置沒(méi)有生效,或有其他原因?qū)е耬ureka自己獲取的hostname并不是我配置hostname,導(dǎo)致了unavailable-replicas。于是我在兩臺(tái)物理機(jī)上部署了兩個(gè)Eureka Server,然后采用eureka.instance.preferIpAddress=false的方式,發(fā)現(xiàn)也是unavailable-replicas。
然而可以排除kubernetes部署和配置的問(wèn)題,問(wèn)題應(yīng)該出在eureka服務(wù)本身,于是本地debug測(cè)試,把配置清空以后,debug發(fā)現(xiàn)eureka.instance.preferIpAddress的值被強(qiáng)制設(shè)置了為了true,而官方默認(rèn)配置為false。問(wèn)題慢慢有了眉目,開(kāi)始把eureka服務(wù)所有依賴(lài)去掉,只保留原生的打包部署測(cè)試,發(fā)現(xiàn)完全正常,如下圖:
然后開(kāi)始一個(gè)依賴(lài),一個(gè)依賴(lài)添加,打包部署測(cè)試,終于在引入discovery-plugin-starter-eureka依賴(lài)打包部署以后,出現(xiàn)了unavailable-replicas,因?yàn)檫@個(gè)依賴(lài)包是開(kāi)源項(xiàng)目的,于是去問(wèn)了此開(kāi)源項(xiàng)目的負(fù)責(zé)人,他回復(fù)是把eureka.instance.preferIpAddress強(qiáng)制設(shè)置了為true。
到此困擾了兩天的問(wèn)題,終于找到了原因,找到原因以后處理就比較簡(jiǎn)單了,要么不引用,要么改源碼為false。
有時(shí)候遇到一些互聯(lián)網(wǎng)找不到答案的問(wèn)題,排查的思路比較重要,其次就是一定要?jiǎng)邮忠徊讲綔y(cè)試(這個(gè)過(guò)程很繁瑣、純體力活),只是靠冥想和推理,永遠(yuǎn)也得不到結(jié)果。
2020年8月9日 上午12:44 沙發(fā)
初來(lái)乍到,多多關(guān)照!