Spring Cloud引入Eureka組件,完善服務(wù)治理
簡介
Netflix Eureka 是一款由 Netflix 開源的基于 REST 服務(wù)的注冊中心,用于提供服務(wù)發(fā)現(xiàn)功能。Spring Cloud Eureka 是 Spring Cloud Netflix 微服務(wù)套件的一部分,基于 Netflix Eureka 進(jìn)行了二次封裝,主要負(fù)責(zé)完成微服務(wù)架構(gòu)中的服務(wù)治理功能。
Spring Cloud Eureka 是一個基于 REST 的服務(wù),并提供了基于 Java 的客戶端組件,能夠非常方便的將服務(wù)注冊到 Spring Cloud Eureka 中進(jìn)行統(tǒng)一管理。
部署 Eureka Server
1.創(chuàng)建一個名為 eureka-server 的 Spring Cloud 的項(xiàng)目(略)
2.引入 eureka-server 依賴(maven)
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
3.開啟 EurekaServer
在啟動類上添加 @EnableEurekaServer注解,開啟 EurekaServer 的自動裝配功能。
4.修改服務(wù)端口為8761
5.修改 register-with-eureka 配置
添加一個eureka.client.register-with-eureka=false的配置,作為EurekaServer可以不將自己的實(shí)例注冊到 Eureka Server 中,如果是集群部署設(shè)置為true(不配置默認(rèn)值也是true)。
6.修改 fetch-registry 配置
添加一個 eureka.client.fetch-registry=false 的配置,表示不從 Eureka Server 中獲取 Eureka 的注冊表信息,如果是集群部署設(shè)置為true(不配置默認(rèn)值也是true)。
7.添加defaultZone配置
添加一條配置eureka.client.service-url.defaultZone=http://localhost:8761/eureka/(如果不加這個的話又自定義了端口,可能會報(bào)錯Connect to localhost:8761 timed out)
8.啟動 Eureka Server,訪問 http://localhost:8761/,如果順利的話可以看到如下成功頁面
至此,一個簡單的Eureka注冊中心就完成了,后面實(shí)戰(zhàn)中的 Eureka Client 都會注冊到這個注冊中心。上面的demo只是一個單機(jī)部署,接下里我們看看我們要部署多個Eureka節(jié)點(diǎn)時怎么做。
Eureka Server 集群部署
集群部署一般有兩種情況,一是偽集群部署,二是真正的集群部署。
集群部署,我們可以在多臺物理機(jī)上部署,這樣多個實(shí)例可以用同一個端口,不會出現(xiàn)偽集群端口沖突的問題,更推薦這種方式,性能更高,穩(wěn)定性也更好。
偽集群部署一般說的是在同一臺物理機(jī)器上部署多個節(jié)點(diǎn),這時候端口就必須不一樣,否則啟動的時候會出現(xiàn)端口沖突;
偽集群部署示例:
假設(shè)要部署3個節(jié)點(diǎn):master/slave1/slave2
1.在application.yml配置定義三個節(jié)點(diǎn)的端口:
port: master: 8761 slave1: 8762 slave2: 8763
2.我們可以分別創(chuàng)建三個配置文件application-master.yml、application-slave1.yml、application-slave2.yml,三個配置文件除了有沖突的地方端口不一樣,其他配置完全一樣
# application-master.yml server: port: ${port.slave1} # 服務(wù)端口 # application-master.yml server: port: ${port.slave1} # 服務(wù)端口 # application-slave2slave2.yml server: port: ${port.slave2} # 服務(wù)端口 # 以下配置三個配置文件都一樣 eureka: client: register-with-eureka: true #不將自己的實(shí)例注冊到 Eureka Server fetch-registry: true #不從 Eureka Server 中獲取 Eureka 的注冊表信息 service-url: defaultZone: http://127.0.0.1:${port.master}/eureka/,http://127.0.0.1:${port.slave1}/eureka/,http://127.0.0.1:${port.slave2}/eureka/ instance: hostname: eureka-server server: enable-self-preservation: true # 開啟自我保護(hù)機(jī)制,默認(rèn)也是開啟的
3.IDEA 分別以三個不同的profiles啟動
4.訪問 http://localhost:8761/ 或者 http://localhost:8762/ 或者 http://localhost:8761/,出現(xiàn)以下類似頁面則代表成功
觀察上面的頁面,發(fā)現(xiàn) Eureka Server 節(jié)點(diǎn)均出現(xiàn)在 unavailable-replicas 下,說明集群搭建還是失敗了,那這個問題怎么解決呢?
1.在host添加以下配置
127.0.0.1 eureka-server-master 127.0.0.1 eureka-server-slave1 127.0.0.1 eureka-server-slave2
2.修改三個配置文件的defaultZone信息
eureka: client: service-url: defaultZone: http://eureka-server-master:${port.master}/eureka/,http://eureka-server-slave1:${port.slave1}/eureka/,http://eureka-server-slave2:${port.slave2}/eureka/
3.配置eureka.instance.hostname信息(尤其是在同一臺物理機(jī)上配置三個節(jié)點(diǎn)時,需要修改為不同的host)
eureka: instance: hostname: eureka-server-master eureka: instance: hostname: eureka-server-slave1 **eureka: instance: hostname: eureka-server-slave2
4.重新啟動,訪問http://localhost:8761/ ,其他兩個節(jié)點(diǎn)君出現(xiàn)在 available-replicas 選項(xiàng)
注意:如果執(zhí)行完上面還是出現(xiàn)在,請檢查是否配置了 prefer-ip-address = true,true #以IP地址注冊到服務(wù)中心,相互注冊使用IP地址,如果是在一臺物理機(jī)上,IP都是一個,所以建議設(shè)置成false,或者不配置再試試。
部署 Eureka Client
1.創(chuàng)建一個名為eureka-client 的SprintBoot的項(xiàng)目(略)
2.引入eureka-client依賴(maven)
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
3.引入spring-boot-starter-web依賴,如果沒有加上spring-boot-starter-web,服務(wù)無法正常啟動
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
4.開啟 EurekaClient
在啟動類上加入注解@EnableEurekaClient,用于啟用Eureka發(fā)現(xiàn)配置
5.配置端口為8081
server.port = 8081 port.master = 8761 port.slave1 = 8762 port.slave2 = 8763
6.配置注冊中心地址
添加配置 eureka.client.serviceUrl.defaultZone=http://eureka-server-master:${port.master}/eureka/,http://eureka-server-slave1:${port.slave1}/eureka/,http://eureka-server-slave2:${port.slave2}/eureka/
7.啟動服務(wù),刷新 http://localhost:8761/ 頁面,如果看到了EUREKA-CLIENT應(yīng)用則表示注冊成功
Eureka自我保護(hù)機(jī)制
自我保護(hù)機(jī)制是為了避免因網(wǎng)絡(luò)分區(qū)故障而導(dǎo)致服務(wù)不可用的問題。具體現(xiàn)象為當(dāng)網(wǎng)絡(luò)故障后,所有的服務(wù)與 Eureka Server 之間無法進(jìn)行正常通信,一定時間后,Eureka Server 沒有收到續(xù)約的信息,將會移除沒有續(xù)約的實(shí)例。這個時候正常的服務(wù)也會被移除掉,所以需要引入自我保護(hù)機(jī)制來解決這種問題。
當(dāng)服務(wù)提供者出現(xiàn)網(wǎng)絡(luò)故障,無法與 Eureka Server 進(jìn)行續(xù)約,Eureka Server 會將該實(shí)例移除,此時服務(wù)消費(fèi)者從 Eureka Server 拉取不到對應(yīng)的信息,實(shí)際上服務(wù)提供者處于可用的狀態(tài),問題就是這樣產(chǎn)生的。
開啟自我保護(hù)機(jī)制
eureka.server.enable-self-preservation=true # 開啟自我保護(hù)機(jī)制,默認(rèn)也是開啟的
當(dāng)服務(wù)提供者出現(xiàn)網(wǎng)絡(luò)故障,無法與 Eureka Server 進(jìn)行續(xù)約時,雖然 Eureka Server 開啟了自我保護(hù)模式,但沒有將該實(shí)例移除,服務(wù)消費(fèi)者還是可以正常拉取服務(wù)提供者的信息,正常發(fā)起調(diào)用。
但是自我保護(hù)機(jī)制也有不好的地方,如果服務(wù)提供者真的下線了,由于 Eureka Server 自我保護(hù)還處于打開狀態(tài),不會移除任務(wù)信息,當(dāng)服務(wù)消費(fèi)者對服務(wù)提供者 B 進(jìn)行調(diào)用時,就會出錯。
自我保護(hù)模式有利也有弊,但我們建議在生產(chǎn)環(huán)境中還是開啟該功能,默認(rèn)配置也是開啟的。
完整代碼實(shí)例:
總結(jié)
- 使用@EnableEurekaServer 注解實(shí)現(xiàn)注冊中心
- 使用@EnableEurekaClient 注冊到注冊中心
- Eureka Server 集群部署的時候需要保證register-with-eureka和 fetch-registry 為true,單機(jī)部署可以為false
- 生產(chǎn)環(huán)境建議開啟自我保護(hù)機(jī)制
以上就是Spring Cloud引入Eureka組件,完善服務(wù)治理的詳細(xì)內(nèi)容,更多關(guān)于Spring Cloud引入Eureka組件的資料請關(guān)注腳本之家其它相關(guān)文章!
- SpringCloud Eureka的使用教程
- Springcloud Eureka配置及集群代碼實(shí)例
- Spring Cloud 系列之注冊中心 Eureka詳解
- springcloud微服務(wù)之Eureka配置詳解
- Springcloud eureka搭建高可用集群過程圖解
- springCloud服務(wù)注冊Eureka實(shí)現(xiàn)過程圖解
- SpringCloud添加客戶端Eureka Client過程解析
- SpringCloud Eureka搭建的方法步驟
- springboot2.0和springcloud Finchley版項(xiàng)目搭建(包含eureka,gateWay,F(xiàn)reign,Hystrix)
相關(guān)文章
Java Swing JCheckBox復(fù)選框的實(shí)現(xiàn)方法
這篇文章主要介紹了Java Swing JCheckBox復(fù)選框的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12Java中的ThreadLocal與ThreadLocalMap詳解
這篇文章主要介紹了Java中的ThreadLocal與ThreadLocalMap詳解,ThreadLocal 是一個線程局部變量,其實(shí)的功用非常簡單,就是為每一個使用該變量的線程都提供一個變量值的副本,是Java中一種較為特殊的線程綁定機(jī)制,需要的朋友可以參考下2023-09-09javaSE基礎(chǔ)如何通俗的理解javaBean是什么
所謂的Java Bean,就是一個java類,編譯后成為了一個后綴名是 .class的文件。這就是Java Bean,很多初學(xué)者,包括當(dāng)年的我自己,總是被這些專有名詞搞的暈頭轉(zhuǎn)向2021-10-10JAVA實(shí)現(xiàn)redis分布式雙重加鎖的示例代碼
在高并發(fā)環(huán)境下,通過Redis分布式鎖實(shí)現(xiàn)數(shù)據(jù)唯一性校驗(yàn)非常關(guān)鍵,為避免用戶數(shù)據(jù)重復(fù),可使用Redis鎖或集合數(shù)據(jù)結(jié)構(gòu)進(jìn)行前置檢查,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-10-10Java實(shí)現(xiàn)批量下載(打包成zip)的實(shí)現(xiàn)
這篇文章主要介紹了Java實(shí)現(xiàn)批量下載(打包成zip)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11JAVA中使用openoffice將Excel轉(zhuǎn)PDF再轉(zhuǎn)圖片功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了JAVA中使用openoffice將Excel轉(zhuǎn)PDF再轉(zhuǎn)圖片功能實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-12-12深入Parquet文件格式設(shè)計(jì)原理及實(shí)現(xiàn)細(xì)節(jié)
這篇文章主要介紹了深入Parquet文件格式設(shè)計(jì)原理及實(shí)現(xiàn)細(xì)節(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08