這篇文章主要介紹“SpringCloud高可用服務注冊中心Eureka的用法”,在日常操作中,相信很多人在SpringCloud高可用服務注冊中心Eureka的用法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”SpringCloud高可用服務注冊中心Eureka的用法”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
從網(wǎng)站建設到定制行業(yè)解決方案,為提供網(wǎng)站設計制作、成都網(wǎng)站設計服務體系,各種行業(yè)企業(yè)客戶提供網(wǎng)站建設解決方案,助力業(yè)務快速發(fā)展。成都創(chuàng)新互聯(lián)公司將不斷加快創(chuàng)新步伐,提供優(yōu)質(zhì)的建站服務。
服務注冊:將服務所在主機、端口、版本號、通信協(xié)議等信息登記到注冊中心上;
服務發(fā)現(xiàn):服務消費者向注冊中心請求已經(jīng)登記的服務列表,然后得到某個服務的主機、端口、版本號、通信協(xié)議等信息,從而實現(xiàn)對具體服務的調(diào)用;
Eureka是Netflix的子模塊之一,也是一個核心的模塊,Eureka 采用了 C-S(客戶端/服務端)的設計架構(gòu),也就是 Eureka 由兩個組件組成:Eureka 服務端和 Eureka 客戶端。
Eureka Server(一個獨立的項目) 用于注冊服務以及實現(xiàn)服務的負載平衡和故障轉(zhuǎn)移,它是服務的注冊中心,Eureka Client(我們的微服務) 它是用于與Eureka Server交互,獲取其上注冊的服務,使得交互變得非常簡單,只需要通過服務標識符即可拿到服務。
Eureka 是 Netflix 公司開發(fā)的(一家做版權(quán)視頻和云服務的公司),Spring Cloud 封裝了 Netflix 公司開發(fā)的Eureka 模塊來實現(xiàn)服務注冊和發(fā)現(xiàn),也就是說 Spring Cloud 對 Netflix Eureka 做了二次封裝;
角色關系圖:
Spring Cloud 要使用 Eureka 注冊中心非常簡單和方便,Spring Cloud 中的Eureka 服務注冊中心實際上也是一個 Spring Boot 工程,我們只需通過引入相關依賴和注解配置就能讓 Spring Boot 構(gòu)建的微服務應用輕松地與 Eureka 進行整合。
1、創(chuàng)建一個 SpringBoot 項目,并且添加 SpringBoot 的相關依賴;
34-sprinGCloud-service-eureka
2、添加 eureka 的依賴:
org.springframework.cloud spring-cloud-starter-netflix-eureka-server
3、在 Spring Boot 的入口類上添加一個@EnableEurekaServer 注解,用于開啟 Eureka 注冊中心服務端
4、在 application.properties 文件中配置 Eureka 服務注冊中心信息:
#內(nèi)嵌定時tomcat的端口
server.port=8761
#設置該服務注冊中心的hostname
eureka.instance.hostname=localhost
#由于我們目前創(chuàng)建的應用是一個服務注冊中心,而不是普通的應用,默認情況下,這個應用會向注冊中心(也是它自己)注冊它自己,設置為false表示禁止這種自己向自己注冊的默認行為
eureka.client.register-with-eureka=false
#表示不去從服務端檢索其他服務信息,因為自己就是服務端,服務注冊中心本身的職責就是維護服務實例,它不需要去檢索其他服務
eureka.client.fetch-registry=false
#指定服務注冊中心的位置
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
啟動與測試 Eureka 服務注冊中心
1、完成上面的項目搭建后,我們就可以啟動 SpringBoot 程序,main 方法運行;
2、啟動成功之后,通過在瀏覽器地址欄訪問我們的注冊中心;
向 Eureka 服務注冊中心注冊服務
我們前面搭建了服務提供者項目,接下來我們就可以將該服務提供者注冊到
Eureke 注冊中心,步驟如下:
1、在該服務提供者中添加 eureka 的依賴,因為服務提供者向注冊中心注冊服務,需要連接 eureka,所以需要 eureka 客戶端的支持;
org.springframework.cloud spring-cloud-starter-netflix-eureka-client
2、激活 Eureka 中的 EnableEurekaClient 功能:
在 Spring Boot 的入口函數(shù)處,通過添加@EnableEurekaClient 注解來表明自己是一個eureka 客戶端,讓我的服務提供者可以連接 eureka 注冊中心;
3、配置服務名稱和注冊中心地址
#每間隔2s,向服務端發(fā)送一次心跳,證明自己依然"存活"
eureka.instance.lease-renewal-interval-in-seconds=2
#告訴服務端,如果我10s之內(nèi)沒有給你發(fā)心跳,就代表我故障了,將我踢出掉
eureka.instance.lease-expiration-duration-in-seconds=10
#告訴服務端,服務實例以IP作為鏈接,而不是取機器名
eureka.instance.prefer-ip-address=true
#告訴服務端,服務實例的名字
eureka.instance.instance-id=34-sprinGCloud-service-goods
#eureka注冊中心的連接地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
4、啟動服務提供者 SpringBoot 程序的 main 方法運行;
5、啟動運行之后,通過在瀏覽器地址欄訪問我們之前搭建好的 eureka 注冊中心,就可以看到有一個服務已經(jīng)注冊成功了;
我們已經(jīng)搭建一個服務注冊中心,同時也向這個服務注冊中心注冊了服務,接下來我們就可以發(fā)現(xiàn)和消費服務了,這其中服務的發(fā)現(xiàn)由 eureka 客戶端實現(xiàn),而服務的消費由 Ribbon實現(xiàn),也就是說服務的調(diào)用需要 eureka 客戶端和 Ribbon,兩者配合起來才能實現(xiàn);
Eureka 客戶端是一個 Java 客戶端,用來連接 Eureka 服務端,與服務端進行交互、負載均衡,服務的故障切換等;
Ribbon 是一個基于 HTTP 和 TCP 的客戶端負載均衡器,當使用 Ribbon 對服務進行訪問的時候,它會擴展 Eureka 客戶端的服務發(fā)現(xiàn)功能,實現(xiàn)從Eureka注冊中心中獲取服務端列表,并通過 Eureka 客戶端來確定服務端是否己經(jīng)啟動。
Ribbon 在 Eureka 客戶端服務發(fā)現(xiàn)的基礎上,實現(xiàn)了對服務實例的選擇策略,從而實現(xiàn)對服務的負載均衡消費。
接下來我們來讓服務消費者去消費服務:
我們前面搭建了服務消費者項目,接下來我們就可以使用該服務消費者通過注冊中心去調(diào)用服務提供者,步驟如下:
1、在該消費者項目中添加 eureka 的依賴,因為服務消費者從注冊中心獲取服務,需要連接 eureka,所以需要 eureka 客戶端的支持;
org.springframework.cloud spring-cloud-starter-netflix-eureka-client
2、激活 Eureka 中的 EnableEurekaClient 功能:
在 Spring Boot 的入口函數(shù)處,通過添加@EnableEurekaClient 注解來表明自己是一個eureka 客戶端,讓我的服務消費者可以使用 eureka 注冊中心;
3、配置服務的名稱和注冊中心的地址:
spring.application.name=34-sprinGCloud-service-portal eureka.client.service-url.defaultZone=http://localhost:8761/eureka
4、前面我介紹了服務的發(fā)現(xiàn)由 eureka 客戶端實現(xiàn),而服務的真正調(diào)用由 ribbon實現(xiàn),所以我們需要在調(diào)用服務提供者時使用 ribbon 來調(diào)用:
@LoadBalanced//使用Ribbon實現(xiàn)負載均衡的調(diào)用 @Bean public RestTemplate restTemplate() { return new RestTemplate(); }
加入了 ribbon 的支持,那么在調(diào)用時,即可改為使用服務名稱來訪問:
restTemplate.getForEntity("http://34-SPRINGCLOUD-SERVICE-GOODS/service/goods", String.class).getBody();
5、完成上面的步驟后,我們就可以啟動消費者的 SpringBoot 程序,main 方法運行;
6、啟動成功之后,通過在瀏覽器地址欄訪問我們的消費者,看是否可以正常調(diào)用遠程服務提供者提供的服務;
著名的 CAP 理論指出,一個分布式系統(tǒng)不可能同時滿足 C(一致性)、A(可用性) 和 P(分區(qū)容錯性);
由于分區(qū)容錯性在是分布式系統(tǒng)中必須要保證的,因此我們只能在 A 和 C 之間進行權(quán)衡,在此 Zookeeper 保證的是 CP, 而 Eureka 則是 AP。
p 全稱:Partition tolerance (分區(qū)容忍)
主要是指網(wǎng)絡問題, 比如:A 、B、C 三臺機器之間相互ping不通、網(wǎng)絡不通,這種情況在分布式系統(tǒng)里面是允許的,也是很有可能發(fā)生的,我們要容忍這種情況的出現(xiàn),在這種情況出現(xiàn)的時候,我們 是選擇 “一致性的C” 還是選擇 “可用性的A”,就看應用場景。
在 ZooKeeper 中,當 master 節(jié)點因為網(wǎng)絡故障與其他節(jié)點失去聯(lián)系時,剩余節(jié)點會重新進行 leader 選舉,但是問題在于,選舉 leader 需要一定時間, 且選舉期間整個 ZooKeeper 集群都是不可用的,這就導致在選舉期間注冊服務癱瘓。在云部署的環(huán)境下,因網(wǎng)絡問題使得 ZooKeeper 集群失去 master 節(jié)點是大概率事件,雖然服務最終能夠恢復,但是在選舉時間內(nèi)導致服務注冊長期不可用是難以容忍的。
Eureka 優(yōu)先保證可用性,Eureka 各個節(jié)點是平等的,某幾個節(jié)點掛掉不會影響正常節(jié)點的工作,剩余的節(jié)點依然可以提供注冊和查詢服務。而 Eureka 的客戶端在向某個 Eureka 注冊或時如果發(fā)現(xiàn)連接失敗,則會自動切換至其它節(jié)點,只要有一臺 Eureka 還在,就能保證注冊服務可用(保證可用性),只不過查到的信息可能不是最新的(不保證強一致性)。
所以 Eureka 在網(wǎng)絡故障導致部分節(jié)點失去聯(lián)系的情況下,只要有一個節(jié)點可用, 那么注冊和查詢服務就可以正常使用,而不會像 zookeeper 那樣使整個注冊服務癱瘓,Eureka 優(yōu)先保證了可用性;
在微服務架構(gòu)的這種分布式系統(tǒng)中,我們要充分考慮各個微服務組件的高可用性問題,不能有單點故障,由于注冊中心 eureka 本身也是一個服務,如果它只有一個節(jié)點,那么它有可能發(fā)生故障,這樣我們就不能注冊與查詢服務了,所以我們需要一個高可用的服務注冊中心,這就需要通過注冊中心集群來解決。
eureka 服務注冊中心它本身也是一個服務,它也可以看做是一個提供者,又可以看做是一個消費者,我們之前通過配置:
eureka.client.register-with-eureka=false 讓注冊中心不注冊自己,但是我們可以向其他注冊中心注冊自己;
Eureka Server 的高可用實際上就是將自己作為服務向其他服務注冊中心注冊自己,這樣就會形成一組互相注冊的服務注冊中心,進而實現(xiàn)服務清單的互相同步,往注冊中心 A 上注冊的服務,可以被復制同步到注冊中心 B 上,所以從任何一臺注冊中心上都能查詢到已經(jīng)注冊的服務,從而達到高可用的效果。
我們知道,Eureka 注冊中心高可用集群就是各個注冊中心相互注冊,所以:
在 8761 的配置文件中,讓它的 service-url 指向 8762和8763,在 8762 的配置文件中讓它的 service-url 指向 8761和8763, 在 8763 的配置文件中讓它的 service-url 指向 8761和8762;
由于兩兩互相指向?qū)Ψ?,實際上我們構(gòu)建了一個三節(jié)點的服務注冊中心集群
eureka.client.service-url.defaultZone=http://eureka8762:8762/eureka/,http://eureka8763:8763/eureka/ eureka.client.service-url.defaultZone=http://eureka8761:8761/eureka/,http://eureka8763:8763/eureka/ eureka.client.service-url.defaultZone=http://eureka8761:8761/eureka/,http://eureka8762:8762/eureka/
然后在本地 hosts 文件配置:C:\Windows\System32\drivers\etc\hosts
127.0.0.1 eureka8761 127.0.0.1 eureka8762 127.0.0.1 eureka8763
運行時,在運行配置項目 Program Arguments 中配置:
--spring.profiles.active=eureka8761 --spring.profiles.active=eureka8762 --spring.profiles.active=eureka8763
分別啟動三個注冊中心,訪問三個注冊中心頁面,觀察注冊中心頁面是否正常;
Eureka 注冊中心高可用集群測試
在要進行注冊的服務中配置:
#eureka注冊中心的連接地址
eureka.client.service-url.defaultZone=http://eureka8761:8761/eureka,http://eureka8762:8762/eureka,http://eureka8763:8763/eureka
啟動服務提供者服務,然后觀察注冊中心頁面,可以看到服務會在三個注冊中心上都注冊成功;
集群的注冊中心打包發(fā)布
在真實項目中,需要將Eureka發(fā)布到具體服務器上進行執(zhí)行,打包部署其實和springboot里面的一樣,對于properties文件,不同的環(huán)境會有不同的配置文件;
運行:
java -jar sprinGCloud-eureka-server.jar --spring.profiles.active=eureka8762; java -jar sprinGCloud-eureka-server.jar --spring.profiles.active=eureka8762; java -jar sprinGCloud-eureka-server.jar --spring.profiles.active=eureka8763
可以寫個shell腳本實現(xiàn)三個注冊中心的啟動:
#!/bin/sh nohup java -jar 34-sprinGCloud-service-eureka-1.0.0.jar --spring.profiles.active=eureka8761 > ./logs/eureka8761.log & nohup java -jar 34-sprinGCloud-service-eureka-1.0.0.jar --spring.profiles.active=eureka8762 > ./logs/eureka8762.log & nohup java -jar 34-sprinGCloud-service-eureka-1.0.0.jar --spring.profiles.active=eureka8763 > ./logs/eureka8763.log &
修改linux的hosts文件:
vim /etc/hosts 192.168.10.128 eureka8761 192.168.10.128 eureka8762 192.168.10.128 eureka8763
自我保護機制是 Eureka 注冊中心的重要特性,當 Eureka 注冊中心進入自我保護模式時,在 Eureka Server 首頁會輸出如下警告信息:
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT.
RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED
JUST TO BE SAFE.
小寫是:
emergency! eureka may be incorrectly claiming instances are up when they're not. renewals are
lesser than threshold and hence the instances are not being expired just to be safe.
在沒有 Eureka 自我保護的情況下,如果 Eureka Server 在一定時間內(nèi)沒有接收到某個微服務實例的心跳,Eureka Server 將會注銷該實例,但是當發(fā)生網(wǎng)絡分區(qū)故障時,那么微服務與 Eureka Server 之間將無法正常通信,以上行為可能變得非常危險了,因為微服務本身其實是正常的,此時不應該注銷這個微服務,如果沒有自我保護機制,那么 Eureka Server 就會將此服務注銷掉。
Eureka 通過“自我保護模式”來解決這個問題——當 Eureka Server 節(jié)點在短時間內(nèi)丟失過多客戶端時(可能發(fā)生了網(wǎng)絡分區(qū)故障),那么就會把這個微服務節(jié)點進行保護。一旦進入自我保護模式,Eureka Server 就會保護服務注冊表中的信息,不刪除服務注冊表中的數(shù)據(jù)(也就是不會注銷任何微服務)。當網(wǎng)絡故障恢復后,該 Eureka Server 節(jié)點會再自動退出自我保護模式。
所以,自我保護模式是一種應對網(wǎng)絡異常的安全保護措施,它的架構(gòu)哲學是寧可同時保留所有微服務(健康的微服務和不健康的微服務都會保留),也不盲目注銷任何健康的微服務,使用自我保護模式,可以讓 Eureka 集群更加的健壯、穩(wěn)定。
當然也可以使用配置項:
eureka.server.enable-self-preservation = false 禁用自我保護模式。
關閉自我保護模式后會出現(xiàn)紅色:
THE SELF PRESERVATION MODE IS TURNED OFF. THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.
但是 Eureka Server 自我保護模式也會給我們帶來一些困擾,如果在保護期內(nèi)某個服務提供者剛好非正常下線了,此時服務消費者就會拿到一個無效的服務實例,此時會調(diào)用失敗,對于這個問題需要服務消費者端具有一些容錯機制,如重試,斷路器等。
Eureka 的自我保護模式是有意義的,該模式被激活后,它不會從注冊列表中剔除因長時間沒收到心跳導致注冊過期的服務,而是等待修復,直到心跳恢復正常之后,它自動退出自我保護模式。這種模式旨在避免因網(wǎng)絡分區(qū)故障導致服務不可用的問題。
例如,兩個微服務客戶端實例 A 和 B 之間有調(diào)用的關系,A 是消費者,B 是提供者,但是由于網(wǎng)絡故障,B 未能及時向 Eureka 發(fā)送心跳續(xù)約,這時候 Eureka 不能簡單的將 B 從注冊表中剔除,因為如果剔除了,A 就無法從 Eureka 服務器中獲取 B 注冊的服務,但是這時候 B 服務是可用的;
所以,Eureka 的自我保護模式最好還是開啟它。
關于自我保護常用幾個配置如下:
服務器端配置:
#測試時關閉自我保護機制,保證不可用服務及時踢出
eureka.server.enable-self-preservation=false
客戶配置:
#每間隔 2s,向服務端發(fā)送一次心跳,證明自己依然"存活"
eureka.instance.lease-renewal-interval-in-seconds=2
#告訴服務端,如果我 10s 之內(nèi)沒有給你發(fā)心跳,就代表我故障了,將我踢出掉
eureka.instance.lease-expiration-duration-in-seconds=10
到此,關于“SpringCloud高可用服務注冊中心Eureka的用法”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
新聞標題:SpringCloud高可用服務注冊中心Eureka的用法
當前網(wǎng)址:http://weahome.cn/article/jgpdod.html