Eureka服務(wù)發(fā)現(xiàn)注冊(cè)實(shí)現(xiàn)教程
一、服務(wù)發(fā)現(xiàn)簡(jiǎn)介
1.服務(wù)提供者、服務(wù)消費(fèi)者、服務(wù)發(fā)現(xiàn)組件三者之間的關(guān)系大致如下:
- 各個(gè)微服務(wù)在啟動(dòng)時(shí)時(shí),將自己的網(wǎng)絡(luò)地址等信息注冊(cè)到服務(wù)發(fā)現(xiàn)組件上(eureka,zookeeper,Consul,spring cloud alibaba的nacos),服務(wù)發(fā)現(xiàn)組件會(huì)存儲(chǔ)這些信息。
- 服務(wù)消費(fèi)者會(huì)從服務(wù)發(fā)現(xiàn)組件查詢服務(wù)提供者的網(wǎng)絡(luò)地址,然后將服務(wù)地址列表緩存到本地,然后根據(jù)服務(wù)名負(fù)載均衡調(diào)用服務(wù)提供者的接口。
- 各個(gè)微服務(wù)與服務(wù)發(fā)現(xiàn)組件使用一定的機(jī)制來(lái)維持心跳,服務(wù)發(fā)現(xiàn)組件若發(fā)現(xiàn)有服務(wù)沒(méi)有提供心跳,那么服務(wù)發(fā)現(xiàn)組件會(huì)將該服務(wù)剔除。
- 微服務(wù)網(wǎng)絡(luò)地址發(fā)生變更(例如實(shí)例增減或者IP端口發(fā)生變化等),會(huì)重新注冊(cè)到服務(wù)發(fā)現(xiàn)組件上,使用這種方式,可以避免因網(wǎng)絡(luò)變化導(dǎo)致服務(wù)之間的通訊停止,服務(wù)消費(fèi)者也無(wú)須人工的修改網(wǎng)絡(luò)地址。
二、Eureka簡(jiǎn)介
Eureka是Netflix開(kāi)發(fā)的服務(wù)發(fā)現(xiàn)框架,本身是一個(gè)基于REST的服務(wù),主要用于定位運(yùn)行在AWS域中的中間層服務(wù),以達(dá)到負(fù)載均衡和中間層服務(wù)故障轉(zhuǎn)移的目的。SpringCloud將它集成在其子項(xiàng)目spring-cloud-netflix中,以實(shí)現(xiàn)SpringCloud的服務(wù)發(fā)現(xiàn)功能。
1.Eureka包含兩個(gè)組件:Eureka Server和Eureka Client。
- Eureka Server提供服務(wù)注冊(cè)服務(wù),各個(gè)節(jié)點(diǎn)啟動(dòng)后,會(huì)在Eureka Server中進(jìn)行注冊(cè),這樣EurekaServer中的服務(wù)注冊(cè)表中將會(huì)存儲(chǔ)所有可用服務(wù)節(jié)點(diǎn)的信息,服務(wù)節(jié)點(diǎn)的信息可以在界面中直觀的看到。
- Eureka Client是一個(gè)java客戶端,用于簡(jiǎn)化與Eureka Server的交互,客戶端同時(shí)也就是一個(gè)內(nèi)置的、使用輪詢負(fù)載算法的負(fù)載均衡器。
2.在應(yīng)用啟動(dòng)后,Eureka Client會(huì)向Eureka Server發(fā)送心跳,默認(rèn)周期為30秒,如果Eureka Server在多個(gè)心跳周期內(nèi)沒(méi)有接收到某個(gè)節(jié)點(diǎn)的心跳,Eureka Server將會(huì)從服務(wù)注冊(cè)表中把這個(gè)服務(wù)節(jié)點(diǎn)移除(默認(rèn)90秒)。
3.Eureka Server之間通過(guò)復(fù)制的方式完成數(shù)據(jù)的同步,Eureka還提供了客戶端緩存機(jī)制,即使所有的Eureka Server都掛掉,客戶端依然可以利用緩存中的信息消費(fèi)其他服務(wù)的API。綜上,Eureka通過(guò)心跳檢查、客戶端緩存等機(jī)制,確保了系統(tǒng)的高可用性、靈活性和可伸縮性。
三、Eureka一些特性及配置過(guò)程時(shí)需要注意的問(wèn)題
1.Eureka能夠保證AP,即當(dāng)Eureka中的某個(gè)節(jié)點(diǎn)掛掉后,剩余的節(jié)點(diǎn)繼續(xù)仍然可以提供服務(wù)的發(fā)現(xiàn)與注冊(cè)服務(wù)。而Eureka的客戶端在向某個(gè)Eureka或者發(fā)現(xiàn)了當(dāng)前的Eureka不可用時(shí),會(huì)自動(dòng)切換到其他的節(jié)點(diǎn),也就是說(shuō)Eureka的節(jié)點(diǎn)是平等的,只要有一臺(tái)Eureka服務(wù)器在,就能保證服務(wù)的可以繼續(xù)被使用。
2.Eureka的自我保護(hù)機(jī)制,我們?cè)谧?cè)服務(wù)時(shí),如發(fā)生斷網(wǎng)的情況,Eureka不能接收到當(dāng)前服務(wù)的任何心跳請(qǐng)求,Eureka會(huì)在默認(rèn)的90s后,將該服務(wù)進(jìn)行強(qiáng)制剔除,這樣就能保證到網(wǎng)絡(luò)故障時(shí),雖然失去了部分節(jié)點(diǎn),但不會(huì)像zookeeper那樣會(huì)使整個(gè)注冊(cè)服務(wù)癱瘓。當(dāng)網(wǎng)絡(luò)穩(wěn)定時(shí),新的實(shí)例會(huì)同步到其他節(jié)點(diǎn)中。
3.相關(guān)配置問(wèn)題
服務(wù)端的配置如下,不注冊(cè)自身:
security:
basic:
enabled: true
user:
name: user
password: password123
eureka:
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://user:password123@localhost:8761/eureka如果我們需要使用ip地址來(lái)配置的話,先添加一行:
eureka.instance.prefer.IpAddress=true;
如果我們想要關(guān)閉保護(hù)機(jī)制,則設(shè)置以下代碼:
eureka.server.enable-self-preservation=false
設(shè)置eureka剔除服務(wù)的時(shí)間間隔:
eureka.server.eviction-interval-timer-in-ms=3000
需要注意的是要在應(yīng)用類的頭上添加@EnableEurekaServer來(lái)啟用Eureka服務(wù)器。
接下來(lái):訪問(wèn)Eureka,Url為:http://localhost:8761/

可以發(fā)現(xiàn)eureka注冊(cè)中心就啟動(dòng)了?。。?/p>
在這里解釋一下register-with-eureka=fasle和fetch-registry的用法,如果不指定該屬性,服務(wù)端會(huì)將自身作為一個(gè)服務(wù)注冊(cè)到注冊(cè)中心去,因此我們需要在服務(wù)端啟動(dòng)前,指定這兩個(gè)屬性值為false。
假如我們把以下代碼給注釋掉,指定一個(gè)應(yīng)用名,重新啟動(dòng)eureka-server端:
security:
basic:
enabled: true
user:
name: user
password: password123
server:
port: 8888
eureka:
instance:
hostname: 192.168.43.246
prefer-ip-address: true
instance-id: ${eureka.instance.hostname}:${server.port}
client:
# register-with-eureka: false
# fetch-registry: false
service-url:
defaultZone: http://user:password123@${eureka.instance.hostname}:${server.port}/eureka
spring:
application:
name: eureka-server發(fā)現(xiàn)eureka-server也注冊(cè)到eureka上去了!

注:
如果使用ip地址來(lái)注冊(cè)時(shí),一定要添加以下兩行代碼:
第一種方式:使用參數(shù)占位符來(lái)引用已經(jīng)配置好的信息:
eureka.instance.prefer-ip-adderss=true
eureka.instance.instance-id=${eureka.instance.hostname}:${server.port}第二種方式:使用springcloud來(lái)自動(dòng)獲取ip地址:
eureka.instance.hostname=${spring.cloud.client.ip-address}
eureka.instance.instance-id=${eureka.instance.hostname}:${server.port}eureka客戶端的配置添加上這兩行代碼,可以發(fā)現(xiàn),添加以上兩行代碼的服務(wù)是以ip地址形式來(lái)注冊(cè)的,沒(méi)有添加的則以默認(rèn)的方式來(lái)進(jìn)行注冊(cè),即使用的主機(jī)名的方式來(lái)注冊(cè):

附上使用ip地址注冊(cè)服務(wù)的完整配置:
- eureka服務(wù)端:
security:
basic:
enabled: true
user:
name: user
password: password123
server:
port: 8888
eureka:
instance:
hostname: 192.168.43.246
# 使用ip地址的方式進(jìn)行注冊(cè)
# prefer-ip-address: true
# instance-id: ${eureka.instance.hostname}:${server.port}
client:
# 不注冊(cè)自身
# register-with-eureka: false
# fetch-registry: false
service-url:
defaultZone: http://user:password123@${eureka.instance.hostname}:${server.port}/eureka
spring:
application:
name: eureka-server- eureka客戶端:
security:
basic:
enabled: true
user:
name: user
password: password123
server:
port: 9999
spring:
application:
name: eurekaClient
eureka:
instance:
hostname: 192.168.43.246
prefer-ip-address: true
instance-id: ${eureka.instance.hostname}:${server.port}
client:
service-url:
defaultZone: http://user:password123@${eureka.instance.hostname}:8888/eureka此處的server-url的端口號(hào)要為服務(wù)端的端口號(hào)。注: 是 deafaultZone, 不是default-zone
附:使用指定的ip去注冊(cè)

客戶端配置如下,如果你在pom文件中添加了如下依賴,客戶端可以不用在啟動(dòng)類上面添加@EnableEurekaClient注解。
只需要在applicantion.properties文件中添加配置即可:
eureka客戶端和eureka服務(wù)端:
<!-- eureka-server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<version>1.2.3.RELEASE</version>
</dependency>
<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.2.3.RELEASE</version>
</dependency>

四、EurekaServer和EurekaClient的作用分析
1. EurekaServer提供服務(wù)發(fā)現(xiàn)的能力,當(dāng)有服務(wù)來(lái)注冊(cè)時(shí),EurekaServer會(huì)將這些服務(wù)的信息存儲(chǔ)到起來(lái)。
2. EurekaClient是一個(gè)java客戶端,可以與服務(wù)發(fā)現(xiàn)組件來(lái)交互。
3. 續(xù)約。微服務(wù)啟動(dòng)后,會(huì)默認(rèn)底向EurekaServer發(fā)送心跳,默認(rèn)時(shí)間為30s,這樣的作用就是續(xù)約自己的租約。
4. 剔除。如果Eureka在一定時(shí)間內(nèi)沒(méi)有收到客戶端的心跳,那么EurekaServer會(huì)剔除掉沒(méi)有發(fā)生心跳客戶端,默認(rèn)時(shí)間為90s。
5. 緩存。EurekaClient會(huì)緩存服務(wù)器的信息,這種方式的好處是當(dāng)EurekaServer宕機(jī)時(shí),,服務(wù)消費(fèi)者依然可以訪問(wèn)服務(wù)。
6. eureka 服務(wù)器默認(rèn)是將自身注冊(cè)到服務(wù)器里??梢允褂萌缦麓a不講自身注冊(cè)進(jìn)去:
eureka: client: # 不注冊(cè)自身 # register-with-eureka: false
7. 如果設(shè)置多個(gè)eureka時(shí),需要設(shè)置 eureka.client.fetchRegistry=true,表示多個(gè)服務(wù)器之間的數(shù)據(jù)同步。單個(gè)節(jié)點(diǎn)直接設(shè)置成false即可。
五、Eureka開(kāi)發(fā)實(shí)戰(zhàn)
1. 在Spring Cloud Edgware以及更高的版本中,只需要添加相關(guān)依賴,即可自動(dòng)注冊(cè)服務(wù)到EurekaServer中,在實(shí)際的項(xiàng)目中,我們可以直接實(shí)現(xiàn)服務(wù)消費(fèi)者連接服務(wù)提供者,這樣我們可以不用將服務(wù)注冊(cè)到eureka上,以便于調(diào)試。
2. 如果不想將服務(wù)注冊(cè)到EurekaServer上,只需要設(shè)置spring.cloud.service-registry.auto-registration.enabled=false,或使用注解@EnableDiscoveryClient(auto-Registry=false)。
微服務(wù)之間的調(diào)用采用feign來(lái)進(jìn)行遠(yuǎn)程調(diào)用,我們可以不通過(guò)eureka直接調(diào)用服務(wù)提供方,為了便于調(diào)試,可以這樣做:
1) 在resources目錄下新建application-local.yml文件中添加調(diào)用各服務(wù)的url, 該參數(shù)為Feign接口上配置的url。
@FeignClient(
name = "${hcf.application.accounting.name:fec-accounting}",
url = "${hcf.application.payment.url:}",
contextId = "AccountingClient"
)- 如果是遠(yuǎn)程服務(wù)的提供者,那么配置網(wǎng)關(guān)+地址。
- 如果是本地的服務(wù)提供者,就是本地的ip地址+端口號(hào)。

2) 啟動(dòng)需要指定profiles文件為local

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解基于IDEA2020.1的JAVA代碼提示插件開(kāi)發(fā)例子
這篇文章主要介紹了詳解基于IDEA2020.1的JAVA代碼提示插件開(kāi)發(fā)例子,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
javax.validation.constraints.NotNull找不到的問(wèn)題及解決
文章主要介紹了Java Bean驗(yàn)證注解的使用,包括`@NotNull`、`@AssertFalse`、`@DecimalMax`、`@Pattern`等,并提供了每個(gè)注解的使用范例2026-02-02
如何用ObjectMapper將復(fù)雜Map轉(zhuǎn)換為實(shí)體類
這篇文章主要介紹了如何用ObjectMapper將復(fù)雜Map轉(zhuǎn)換為實(shí)體類的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
maven打包spring項(xiàng)目縮小體積實(shí)現(xiàn)方式
文章介紹了如何在Maven的pom.xml文件中配置跳過(guò)測(cè)試以縮小Spring項(xiàng)目的打包體積,并提供了具體的配置步驟和運(yùn)行jar包的方法2026-03-03
Maven分模塊開(kāi)發(fā)與依賴管理和聚合和繼承及屬性深入詳細(xì)介紹
依賴管理是項(xiàng)目管理中非常重要的一環(huán)。幾乎任何項(xiàng)目開(kāi)發(fā)的時(shí)候需要都需要使用到庫(kù)。而這些庫(kù)很可能又依賴別的庫(kù),這樣整個(gè)項(xiàng)目的依賴形成了一個(gè)樹(shù)狀結(jié)構(gòu),而隨著這個(gè)依賴的樹(shù)的延伸和擴(kuò)大,一系列問(wèn)題就會(huì)隨之產(chǎn)生2022-10-10
IDEA?下?Gradle?刪除多余無(wú)用依賴的處理方法
這篇文章主要介紹了IDEA下Gradle刪除多余無(wú)用依賴,使用該插件可以一定程度上幫助我們刪除無(wú)用依賴,但是也可能會(huì)多刪除有用的依賴,需要在使用插件自動(dòng)修復(fù)后手動(dòng)檢測(cè)項(xiàng)目,驗(yàn)證是否會(huì)出現(xiàn)問(wèn)題,避免導(dǎo)致上線發(fā)布錯(cuò)誤的負(fù)優(yōu)化2022-03-03
Fluent Mybatis學(xué)習(xí)之Update語(yǔ)法實(shí)踐
Fluent MyBatis是一個(gè)MyBatis的增強(qiáng)工具,沒(méi)有對(duì)mybatis做任何修改。本篇文章將詳細(xì)介紹對(duì)Fluent Mybatis中的update語(yǔ)法進(jìn)行驗(yàn)證。代碼具有一定價(jià)值,感興趣的小伙伴可以學(xué)習(xí)一下2021-11-11
java實(shí)現(xiàn)pgsql自動(dòng)更新創(chuàng)建時(shí)間與更新時(shí)間的兩種方式小結(jié)
本文主要介紹了java實(shí)現(xiàn)pgsql自動(dòng)更新創(chuàng)建時(shí)間與更新時(shí)間的兩種方式小結(jié),主要包括通過(guò)數(shù)據(jù)庫(kù)自身實(shí)現(xiàn)以及通過(guò)mybatisplus的TableField注解添加,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01

