自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一文帶你掌握SpringCloud高可用服務(wù)注冊中心Eureka

開發(fā) 前端
Eureka是Netflix的子模塊之一,也是一個核心的模塊,Eureka 采用了 C-S(客戶端/服務(wù)端)的設(shè)計架構(gòu),也就是 Eureka 由兩個組件組成:Eureka 服務(wù)端和 Eureka 客戶端。

[[396439]]

 什么是服務(wù)注冊?

服務(wù)注冊:將服務(wù)所在主機、端口、版本號、通信協(xié)議等信息登記到注冊中心上;

什么是服務(wù)發(fā)現(xiàn)?

服務(wù)發(fā)現(xiàn):服務(wù)消費者向注冊中心請求已經(jīng)登記的服務(wù)列表,然后得到某個服務(wù)的主機、端口、版本號、通信協(xié)議等信息,從而實現(xiàn)對具體服務(wù)的調(diào)用;

Eureka是什么?

Eureka是Netflix的子模塊之一,也是一個核心的模塊,Eureka 采用了 C-S(客戶端/服務(wù)端)的設(shè)計架構(gòu),也就是 Eureka 由兩個組件組成:Eureka 服務(wù)端和 Eureka 客戶端。

Eureka Server(一個獨立的項目) 用于注冊服務(wù)以及實現(xiàn)服務(wù)的負(fù)載平衡和故障轉(zhuǎn)移,它是服務(wù)的注冊中心,Eureka Client(我們的微服務(wù)) 它是用于與Eureka Server交互,獲取其上注冊的服務(wù),使得交互變得非常簡單,只需要通過服務(wù)標(biāo)識符即可拿到服務(wù)。

與spring-cloud的關(guān)系:

Eureka 是 Netflix 公司開發(fā)的(一家做版權(quán)視頻和云服務(wù)的公司),Spring Cloud 封裝了 Netflix 公司開發(fā)的Eureka 模塊來實現(xiàn)服務(wù)注冊和發(fā)現(xiàn),也就是說 Spring Cloud 對 Netflix Eureka 做了二次封裝;

角色關(guān)系圖:

搭建與配置 Eureka 服務(wù)注冊中心

Spring Cloud 要使用 Eureka 注冊中心非常簡單和方便,Spring Cloud 中的Eureka 服務(wù)注冊中心實際上也是一個 Spring Boot 工程,我們只需通過引入相關(guān)依賴和注解配置就能讓 Spring Boot 構(gòu)建的微服務(wù)應(yīng)用輕松地與 Eureka 進行整合。

具體步驟如下:

1、創(chuàng)建一個 SpringBoot 項目,并且添加 SpringBoot 的相關(guān)依賴;

  1. 34-sprinGCloud-service-eureka 

2、添加 eureka 的依賴:

  1. <!--Spring Cloud 的 eureka-server 起步依賴--> 
  2.  
  3. <dependency> 
  4.  
  5. <groupId>org.springframework.cloud</groupId> 
  6.  
  7. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> 
  8.  
  9. </dependency> 

 3、在 Spring Boot 的入口類上添加一個@EnableEurekaServer 注解,用于開啟 Eureka 注冊中心服務(wù)端

4、在 application.properties 文件中配置 Eureka 服務(wù)注冊中心信息:

#內(nèi)嵌定時tomcat的端口

server.port=8761

#設(shè)置該服務(wù)注冊中心的hostname

eureka.instance.hostname=localhost

#由于我們目前創(chuàng)建的應(yīng)用是一個服務(wù)注冊中心,而不是普通的應(yīng)用,默認(rèn)情況下,這個應(yīng)用會向注冊中心(也是它自己)注冊它自己,設(shè)置為false表示禁止這種自己向自己注冊的默認(rèn)行為

eureka.client.register-with-eureka=false

#表示不去從服務(wù)端檢索其他服務(wù)信息,因為自己就是服務(wù)端,服務(wù)注冊中心本身的職責(zé)就是維護服務(wù)實例,它不需要去檢索其他服務(wù)

eureka.client.fetch-registry=false

#指定服務(wù)注冊中心的位置

eureka.client.service-url.defaultZone=http://localhost:8761/eureka

啟動與測試 Eureka 服務(wù)注冊中心

1、完成上面的項目搭建后,我們就可以啟動 SpringBoot 程序,main 方法運行;

2、啟動成功之后,通過在瀏覽器地址欄訪問我們的注冊中心;

向 Eureka 服務(wù)注冊中心注冊服務(wù)

我們前面搭建了服務(wù)提供者項目,接下來我們就可以將該服務(wù)提供者注冊到

Eureke 注冊中心,步驟如下:

1、在該服務(wù)提供者中添加 eureka 的依賴,因為服務(wù)提供者向注冊中心注冊服務(wù),需要連接 eureka,所以需要 eureka 客戶端的支持;

  1. <!--spring-cloud-starter-netflix-eureka-client--> 
  2.  
  3. <dependency> 
  4.  
  5. <groupId>org.springframework.cloud</groupId> 
  6.  
  7. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> 
  8.  
  9. </dependency> 

 2、激活 Eureka 中的 EnableEurekaClient 功能:

在 Spring Boot 的入口函數(shù)處,通過添加@EnableEurekaClient 注解來表明自己是一個eureka 客戶端,讓我的服務(wù)提供者可以連接 eureka 注冊中心;

3、配置服務(wù)名稱和注冊中心地址

#每間隔2s,向服務(wù)端發(fā)送一次心跳,證明自己依然"存活"

eureka.instance.lease-renewal-interval-in-seconds=2

#告訴服務(wù)端,如果我10s之內(nèi)沒有給你發(fā)心跳,就代表我故障了,將我踢出掉

eureka.instance.lease-expiration-duration-in-seconds=10

#告訴服務(wù)端,服務(wù)實例以IP作為鏈接,而不是取機器名

eureka.instance.prefer-ip-address=true

#告訴服務(wù)端,服務(wù)實例的名字

eureka.instance.instance-id=34-sprinGCloud-service-goods

#eureka注冊中心的連接地址

eureka.client.service-url.defaultZone=http://localhost:8761/eureka

4、啟動服務(wù)提供者 SpringBoot 程序的 main 方法運行;

5、啟動運行之后,通過在瀏覽器地址欄訪問我們之前搭建好的 eureka 注冊中心,就可以看到有一個服務(wù)已經(jīng)注冊成功了;

從 Eureka 服務(wù)注冊中心發(fā)現(xiàn)與消費服務(wù)

我們已經(jīng)搭建一個服務(wù)注冊中心,同時也向這個服務(wù)注冊中心注冊了服務(wù),接下來我們就可以發(fā)現(xiàn)和消費服務(wù)了,這其中服務(wù)的發(fā)現(xiàn)由 eureka 客戶端實現(xiàn),而服務(wù)的消費由 Ribbon實現(xiàn),也就是說服務(wù)的調(diào)用需要 eureka 客戶端和 Ribbon,兩者配合起來才能實現(xiàn);

Eureka 客戶端是一個 Java 客戶端,用來連接 Eureka 服務(wù)端,與服務(wù)端進行交互、負(fù)載均衡,服務(wù)的故障切換等;

Ribbon 是一個基于 HTTP 和 TCP 的客戶端負(fù)載均衡器,當(dāng)使用 Ribbon 對服務(wù)進行訪問的時候,它會擴展 Eureka 客戶端的服務(wù)發(fā)現(xiàn)功能,實現(xiàn)從Eureka注冊中心中獲取服務(wù)端列表,并通過 Eureka 客戶端來確定服務(wù)端是否己經(jīng)啟動。

Ribbon 在 Eureka 客戶端服務(wù)發(fā)現(xiàn)的基礎(chǔ)上,實現(xiàn)了對服務(wù)實例的選擇策略,從而實現(xiàn)對服務(wù)的負(fù)載均衡消費。

接下來我們來讓服務(wù)消費者去消費服務(wù):

我們前面搭建了服務(wù)消費者項目,接下來我們就可以使用該服務(wù)消費者通過注冊中心去調(diào)用服務(wù)提供者,步驟如下:

1、在該消費者項目中添加 eureka 的依賴,因為服務(wù)消費者從注冊中心獲取服務(wù),需要連接 eureka,所以需要 eureka 客戶端的支持;

  1. <!--spring-cloud-starter-netflix-eureka-client--> 
  2.  
  3. <dependency> 
  4.  
  5. <groupId>org.springframework.cloud</groupId> 
  6.  
  7. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> 
  8.  
  9. </dependency> 

 2、激活 Eureka 中的 EnableEurekaClient 功能:

在 Spring Boot 的入口函數(shù)處,通過添加@EnableEurekaClient 注解來表明自己是一個eureka 客戶端,讓我的服務(wù)消費者可以使用 eureka 注冊中心;

3、配置服務(wù)的名稱和注冊中心的地址:

  1. spring.application.name=34-sprinGCloud-service-portal 
  2.  
  3. eureka.client.service-url.defaultZone=http://localhost:8761/eureka 

 4、前面我介紹了服務(wù)的發(fā)現(xiàn)由 eureka 客戶端實現(xiàn),而服務(wù)的真正調(diào)用由 ribbon實現(xiàn),所以我們需要在調(diào)用服務(wù)提供者時使用 ribbon 來調(diào)用:

  1. @LoadBalanced//使用Ribbon實現(xiàn)負(fù)載均衡的調(diào)用 
  2.  
  3. @Bean 
  4.  
  5. public RestTemplate restTemplate() { 
  6.  
  7. return new RestTemplate(); 
  8.  

 加入了 ribbon 的支持,那么在調(diào)用時,即可改為使用服務(wù)名稱來訪問:

  1. restTemplate.getForEntity("http://34-SPRINGCLOUD-SERVICE-GOODS/service/goods"
  2.  
  3. String.class).getBody(); 

 5、完成上面的步驟后,我們就可以啟動消費者的 SpringBoot 程序,main 方法運行;

6、啟動成功之后,通過在瀏覽器地址欄訪問我們的消費者,看是否可以正常調(diào)用遠程服務(wù)提供者提供的服務(wù);

Eureka 與 Zookeeper 的比較

著名的 CAP 理論指出,一個分布式系統(tǒng)不可能同時滿足 C(一致性)、A(可用性) 和 P(分區(qū)容錯性);

由于分區(qū)容錯性在是分布式系統(tǒng)中必須要保證的,因此我們只能在 A 和 C 之間進行權(quán)衡,在此 Zookeeper 保證的是 CP, 而 Eureka 則是 AP。

p 全稱:Partition tolerance (分區(qū)容忍)

主要是指網(wǎng)絡(luò)問題, 比如:A 、B、C 三臺機器之間相互ping不通、網(wǎng)絡(luò)不通,這種情況在分布式系統(tǒng)里面是允許的,也是很有可能發(fā)生的,我們要容忍這種情況的出現(xiàn),在這種情況出現(xiàn)的時候,我們 是選擇 “一致性的C” 還是選擇 “可用性的A”,就看應(yīng)用場景。

Zookeeper 保證 CP

在 ZooKeeper 中,當(dāng) master 節(jié)點因為網(wǎng)絡(luò)故障與其他節(jié)點失去聯(lián)系時,剩余節(jié)點會重新進行 leader 選舉,但是問題在于,選舉 leader 需要一定時間, 且選舉期間整個 ZooKeeper 集群都是不可用的,這就導(dǎo)致在選舉期間注冊服務(wù)癱瘓。在云部署的環(huán)境下,因網(wǎng)絡(luò)問題使得 ZooKeeper 集群失去 master 節(jié)點是大概率事件,雖然服務(wù)最終能夠恢復(fù),但是在選舉時間內(nèi)導(dǎo)致服務(wù)注冊長期不可用是難以容忍的。

Eureka 保證 AP

Eureka 優(yōu)先保證可用性,Eureka 各個節(jié)點是平等的,某幾個節(jié)點掛掉不會影響正常節(jié)點的工作,剩余的節(jié)點依然可以提供注冊和查詢服務(wù)。而 Eureka 的客戶端在向某個 Eureka 注冊或時如果發(fā)現(xiàn)連接失敗,則會自動切換至其它節(jié)點,只要有一臺 Eureka 還在,就能保證注冊服務(wù)可用(保證可用性),只不過查到的信息可能不是最新的(不保證強一致性)。

所以 Eureka 在網(wǎng)絡(luò)故障導(dǎo)致部分節(jié)點失去聯(lián)系的情況下,只要有一個節(jié)點可用, 那么注冊和查詢服務(wù)就可以正常使用,而不會像 zookeeper 那樣使整個注冊服務(wù)癱瘓,Eureka 優(yōu)先保證了可用性;

Eureka 注冊中心高可用集群

在微服務(wù)架構(gòu)的這種分布式系統(tǒng)中,我們要充分考慮各個微服務(wù)組件的高可用性問題,不能有單點故障,由于注冊中心 eureka 本身也是一個服務(wù),如果它只有一個節(jié)點,那么它有可能發(fā)生故障,這樣我們就不能注冊與查詢服務(wù)了,所以我們需要一個高可用的服務(wù)注冊中心,這就需要通過注冊中心集群來解決。

eureka 服務(wù)注冊中心它本身也是一個服務(wù),它也可以看做是一個提供者,又可以看做是一個消費者,我們之前通過配置:

eureka.client.register-with-eureka=false 讓注冊中心不注冊自己,但是我們可以向其他注冊中心注冊自己;

Eureka Server 的高可用實際上就是將自己作為服務(wù)向其他服務(wù)注冊中心注冊自己,這樣就會形成一組互相注冊的服務(wù)注冊中心,進而實現(xiàn)服務(wù)清單的互相同步,往注冊中心 A 上注冊的服務(wù),可以被復(fù)制同步到注冊中心 B 上,所以從任何一臺注冊中心上都能查詢到已經(jīng)注冊的服務(wù),從而達到高可用的效果。

一文帶你掌握SpringCloud高可用服務(wù)注冊中心Eureka

Eureka 注冊中心高可用集群搭建

我們知道,Eureka 注冊中心高可用集群就是各個注冊中心相互注冊,所以:

在 8761 的配置文件中,讓它的 service-url 指向 8762和8763,在 8762 的配置文件中讓它的 service-url 指向 8761和8763, 在 8763 的配置文件中讓它的 service-url 指向 8761和8762;

由于兩兩互相指向?qū)Ψ剑瑢嶋H上我們構(gòu)建了一個三節(jié)點的服務(wù)注冊中心集群

  1. eureka.client.service-url.defaultZone=http://eureka8762:8762/eureka/,http://eureka8763:8763/eureka/ 
  2.  
  3. eureka.client.service-url.defaultZone=http://eureka8761:8761/eureka/,http://eureka8763:8763/eureka/ 
  4.  
  5. eureka.client.service-url.defaultZone=http://eureka8761:8761/eureka/,http://eureka8762:8762/eureka/ 

 然后在本地 hosts 文件配置:C:\Windows\System32\drivers\etc\hosts

  1. 127.0.0.1 eureka8761 
  2.  
  3. 127.0.0.1 eureka8762 
  4.  
  5. 127.0.0.1 eureka8763 

 運行時,在運行配置項目 Program Arguments 中配置:

  1. --spring.profiles.active=eureka8761 
  2.  
  3. --spring.profiles.active=eureka8762 
  4.  
  5. --spring.profiles.active=eureka8763 

 分別啟動三個注冊中心,訪問三個注冊中心頁面,觀察注冊中心頁面是否正常;

Eureka 注冊中心高可用集群測試

在要進行注冊的服務(wù)中配置:

#eureka注冊中心的連接地址

  1. eureka.client.service-url.defaultZone=http://eureka8761:8761/eureka,http://eureka8762:8762/eureka,http://eureka8763:8763/eureka 

啟動服務(wù)提供者服務(wù),然后觀察注冊中心頁面,可以看到服務(wù)會在三個注冊中心上都注冊成功;

集群的注冊中心打包發(fā)布

在真實項目中,需要將Eureka發(fā)布到具體服務(wù)器上進行執(zhí)行,打包部署其實和springboot里面的一樣,對于properties文件,不同的環(huán)境會有不同的配置文件;

運行:

  1. java -jar sprinGCloud-eureka-server.jar --spring.profiles.active=eureka8762; 
  2.  
  3. java -jar sprinGCloud-eureka-server.jar --spring.profiles.active=eureka8762; 
  4.  
  5. java -jar sprinGCloud-eureka-server.jar --spring.profiles.active=eureka8763 

 可以寫個shell腳本實現(xiàn)三個注冊中心的啟動:

  1. #!/bin/sh 
  2.  
  3. nohup java -jar 34-sprinGCloud-service-eureka-1.0.0.jar --spring.profiles.active=eureka8761 > ./logs/eureka8761.log & 
  4.  
  5. nohup java -jar 34-sprinGCloud-service-eureka-1.0.0.jar --spring.profiles.active=eureka8762 > ./logs/eureka8762.log & 
  6.  
  7. nohup java -jar 34-sprinGCloud-service-eureka-1.0.0.jar --spring.profiles.active=eureka8763 > ./logs/eureka8763.log & 

 修改linux的hosts文件:

  1. vim /etc/hosts 
  2.  
  3. 192.168.10.128 eureka8761 
  4.  
  5. 192.168.10.128 eureka8762 
  6.  
  7. 192.168.10.128 eureka8763 

 Eureka服務(wù)注冊中心自我保護機制

自我保護機制是 Eureka 注冊中心的重要特性,當(dāng) 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)沒有接收到某個微服務(wù)實例的心跳,Eureka Server 將會注銷該實例,但是當(dāng)發(fā)生網(wǎng)絡(luò)分區(qū)故障時,那么微服務(wù)與 Eureka Server 之間將無法正常通信,以上行為可能變得非常危險了,因為微服務(wù)本身其實是正常的,此時不應(yīng)該注銷這個微服務(wù),如果沒有自我保護機制,那么 Eureka Server 就會將此服務(wù)注銷掉。

Eureka 通過“自我保護模式”來解決這個問題——當(dāng) Eureka Server 節(jié)點在短時間內(nèi)丟失過多客戶端時(可能發(fā)生了網(wǎng)絡(luò)分區(qū)故障),那么就會把這個微服務(wù)節(jié)點進行保護。一旦進入自我保護模式,Eureka Server 就會保護服務(wù)注冊表中的信息,不刪除服務(wù)注冊表中的數(shù)據(jù)(也就是不會注銷任何微服務(wù))。當(dāng)網(wǎng)絡(luò)故障恢復(fù)后,該 Eureka Server 節(jié)點會再自動退出自我保護模式。

所以,自我保護模式是一種應(yīng)對網(wǎng)絡(luò)異常的安全保護措施,它的架構(gòu)哲學(xué)是寧可同時保留所有微服務(wù)(健康的微服務(wù)和不健康的微服務(wù)都會保留),也不盲目注銷任何健康的微服務(wù),使用自我保護模式,可以讓 Eureka 集群更加的健壯、穩(wěn)定。

當(dāng)然也可以使用配置項:

eureka.server.enable-self-preservation = false 禁用自我保護模式。

關(guān)閉自我保護模式后會出現(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)某個服務(wù)提供者剛好非正常下線了,此時服務(wù)消費者就會拿到一個無效的服務(wù)實例,此時會調(diào)用失敗,對于這個問題需要服務(wù)消費者端具有一些容錯機制,如重試,斷路器等。

Eureka 的自我保護模式是有意義的,該模式被激活后,它不會從注冊列表中剔除因長時間沒收到心跳導(dǎo)致注冊過期的服務(wù),而是等待修復(fù),直到心跳恢復(fù)正常之后,它自動退出自我保護模式。這種模式旨在避免因網(wǎng)絡(luò)分區(qū)故障導(dǎo)致服務(wù)不可用的問題。

例如,兩個微服務(wù)客戶端實例 A 和 B 之間有調(diào)用的關(guān)系,A 是消費者,B 是提供者,但是由于網(wǎng)絡(luò)故障,B 未能及時向 Eureka 發(fā)送心跳續(xù)約,這時候 Eureka 不能簡單的將 B 從注冊表中剔除,因為如果剔除了,A 就無法從 Eureka 服務(wù)器中獲取 B 注冊的服務(wù),但是這時候 B 服務(wù)是可用的;

所以,Eureka 的自我保護模式最好還是開啟它。

關(guān)于自我保護常用幾個配置如下:

服務(wù)器端配置:

#測試時關(guān)閉自我保護機制,保證不可用服務(wù)及時踢出

eureka.server.enable-self-preservation=false

客戶配置:

#每間隔 2s,向服務(wù)端發(fā)送一次心跳,證明自己依然"存活"

eureka.instance.lease-renewal-interval-in-seconds=2

#告訴服務(wù)端,如果我 10s 之內(nèi)沒有給你發(fā)心跳,就代表我故障了,將我踢出掉

eureka.instance.lease-expiration-duration-in-seconds=10

 

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2022-12-20 07:39:46

2023-12-21 17:11:21

Containerd管理工具命令行

2023-12-15 09:45:21

阻塞接口

2020-12-18 11:54:22

Linux系統(tǒng)架構(gòu)

2021-02-22 09:05:59

Linux字符設(shè)備架構(gòu)

2021-06-04 09:35:05

Linux字符設(shè)備架構(gòu)

2020-12-21 06:13:52

高可用Nacos服務(wù)端

2022-08-30 22:12:19

Nacos組件服務(wù)注冊

2025-03-31 08:35:00

Eureka微服務(wù)架構(gòu)

2025-01-16 00:20:41

2022-11-09 09:15:31

ProtoBufGo語言

2022-10-21 17:24:34

契約測試定位

2023-09-11 06:32:30

VPAHPA容量

2023-11-20 08:18:49

Netty服務(wù)器

2023-11-06 08:16:19

APM系統(tǒng)運維

2021-05-29 10:11:00

Kafa數(shù)據(jù)業(yè)務(wù)

2023-07-31 08:18:50

Docker參數(shù)容器

2022-11-11 19:09:13

架構(gòu)

2019-08-23 10:34:05

微服務(wù)Eureka架構(gòu)

2024-10-10 09:12:10

Spring接口初始化
點贊
收藏

51CTO技術(shù)棧公眾號