服務註冊-Eureka
Eureka 是基於AP的服務註冊發現,犧牲了一致性(將就著用)
Eureka 自我保護機制
首先對Eureka註冊中心需要了解的是Eureka各個節點都是平等的,沒有ZK中角色的概念, 即使N-1個節點掛掉也不會影響其他節點的正常執行。
預設情況下,如果Eureka Server在一定時間內(預設90秒)沒有接收到某個微服務例項的心跳,Eureka Server將會移除該例項。但是當網路分割槽故障發生時,微服務與Eureka Server之間無法正常通訊,而微服務本身是正常執行的,此時不應該移除這個微服務,所以引入了自我保護機制。
官方對於自我保護機制的定義:
自我保護模式正是一種針對網路異常波動的安全保護措施,使用自我保護模式能使Eureka叢集更加的健壯、穩定的執行。
自我保護機制的工作機制是:
如果在15分鐘內超過85%的客戶端節點都沒有正常的心跳,那麼Eureka就認為客戶端與註冊中心出現了網路故障,Eureka Server自動進入自我保護機制,此時會出現以下幾種情況:
Eureka Server不再從註冊列表中移除因為長時間沒收到心跳而應該過期的服務。
Eureka Server仍然能夠接受新服務的註冊和查詢請求,但是不會被同步到其它節點上,保證當前節點依然可用。
當網路穩定時,當前Eureka Server新的註冊資訊會被同步到其它節點中。
因此Eureka Server可以很好的應對因網路故障導致部分節點失聯的情況,而不會像ZK那樣如果有一半不可用的情況會導致整個叢集不可用而變成癱瘓。
因此也很有可能出現 服務故障卻沒有移除的情況
自我保護開關
Eureka自我保護機制,通過配置 eureka.server.enable-self-preservation 來true開啟/false禁用自我保護機制,預設開啟狀態,建議生產環境開啟此配置。 eviction-interval-timer-in-ms: 設定檢測週期
Eureka server 叢集搭建
spring-cloud-eureka7001-server
spring-cloud-eureka7002-server
兩個工程提供 eureka server ,分三步
1、引入pom檔案
<!-- 這個是重點 , -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
- 配置 application.yml
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com #eureka服務端的例項名稱
client:
register-with-eureka: false #false表示不向註冊中心註冊自己。
fetch-registry: false #false表示自己端就是註冊中心,我的職責就是維護服務例項,並不需要去檢索服務
service-url:
#叢集指向其它eureka
defaultZone: http://eureka7002.com:7002/eureka/
#單機就是7001自己
# defaultZone: http://eureka7001.com:7001/eureka/
#server:
#關閉自我保護機制,保證不可用服務被及時踢除-無情
enable-self-preservation: false
eviction-interval-timer-in-ms: 2000
server:
port: 7002
eureka:
instance:
hostname: eureka7002.com #eureka服務端的例項名稱
client:
register-with-eureka: false #false表示不向註冊中心註冊自己。
fetch-registry: false #false表示自己端就是註冊中心,我的職責就是維護服務例項,並不需要去檢索服務
service-url:
#叢集指向其它eureka
defaultZone: http://eureka7001.com:7001/eureka/
#單機就是自己
#defaultZone: http://eureka7002.com:7002/eureka/
- 寫啟動類 EurekaServerApplication
記得加上@EnableEurekaServer
現在有兩個需要Eureka服務的微服務模組:
spring-cloud-demo-provider-payment (提供支付服務,生產者)
spring-cloud-demo-consumer-order (訂單呼叫支付服務,消費者)
使用者發給order模組的請求轉發給payment處理。
搭建步驟:
同樣分為三步:
- 引入pom
只要是需要eureka server 提供服務的模組都要引入eureka client 的 依賴
<!--eureka 註冊中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 修改application.yml
spring-cloud-demo-consumer-order 消費者
eureka:
client:
#表示是否將自己註冊進EurekaServer預設為true。
register-with-eureka: true
#是否從EurekaServer抓取已有的註冊資訊,預設為true。單節點無所謂,叢集必須設定為true才能配合ribbon使用負載均衡
fetchRegistry: true
service-url:
#單機
#defaultZone: http://localhost:7001/eureka
# 叢集
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka # 叢集版
spring-cloud-demo-provider-payment 生產者
eureka:
client:
#表示是否將自己註冊進EurekaServer預設為true。
register-with-eureka: true
#是否從EurekaServer抓取已有的註冊資訊,預設為true。單節點無所謂,叢集必須設定為true才能配合ribbon使用負載均衡
fetchRegistry: true
service-url:
#單機版
# defaultZone: http://localhost:7001/eureka
# 叢集版
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
instance:
instance-id: payment8001
#訪問路徑可以顯示IP地址
prefer-ip-address: true
#Eureka客戶端向服務端傳送心跳的時間間隔,單位為秒(預設是30秒)
#lease-renewal-interval-in-seconds: 1
#Eureka服務端在收到最後一次心跳後等待時間上限,單位為秒(預設是90秒),超時將剔除服務
#lease-expiration-duration-in-seconds: 2
- 新增主啟動類
記得@EnableEurekaClient
架構圖:
單個eureka:
叢集版:
現在eureka server是叢集式式的,但payment provider不是
將pay模組也配置為叢集模式
0,建立新模組,8002
名稱: cloud_pay_8002
1,pom檔案,複製8001的
2,pom檔案複製8001的
3,配置檔案複製8001的
埠修改一下,改為8002
服務名稱不用改,用一樣的
4.主啟動類,複製8001的
5,mapper,service,controller都複製一份
然後就啟動服務即可
此時訪問order模組,發現並沒有負載均衡到兩個pay,模組中,而是隻訪問8001
雖然我們是使用RestTemplate訪問的微服務,但是也可以負載均衡的
下面是order模組呼叫payment模組程式碼的注意點:
然後需要讓RestTemplate開啟負載均衡註解,還可以指定負載均衡演算法,預設輪詢
測試:
不做任何更改重新整理網頁
現在的架構圖:
相關文章
- 服務註冊中心之Eureka使用
- Eureka服務註冊與發現
- 服務註冊與發現【Eureka】- Eureka簡介
- SpringColud Eureka的服務註冊與發現SpringGC
- SpringCloud(3)---Eureka服務註冊與發現SpringGCCloud
- Eureka服務註冊不可用問題
- SpringCloud服務的註冊與發現(Eureka)SpringGCCloud
- Eureka實現服務註冊與發現
- Eureka的InstanceInfoReplicator類(服務註冊輔助工具)
- [SpringCloud教程]3. Eureka服務註冊中心整合SpringGCCloud
- 通過Eureka中已經註冊的服務名,呼叫服務
- Spring Cloud Eureka 實現服務註冊與發現SpringCloud
- Spring Cloud 系列(一)Eureka 服務註冊與發現SpringCloud
- SpringCloud-eureka服務註冊發現以及消費流程SpringGCCloud
- Spring Cloud 入門教程 – Eureka服務註冊與發現SpringCloud
- Spring Cloud Eureka原理分析(一):註冊過程-服務端SpringCloud服務端
- 每天學點SpringCloud(二):服務註冊與發現EurekaSpringGCCloud
- Spring Cloud 入門教程 - Eureka服務註冊與發現SpringCloud
- 微服務學習小結-Eureka如何實現註冊中心,以及服務之間的註冊、呼叫微服務
- Spring Cloud Eureka 實現高可用服務發現註冊中心SpringCloud
- eureka踩過的坑之註冊服務相互之間呼叫
- Spring Cloud:使用Eureka叢集搭建高可用服務註冊中心SpringCloud
- Spring Cloud實戰系列(一) - 服務註冊與發現EurekaSpringCloud
- SpringCloud學習之路(二)- 服務的註冊與發現EurekaSpringGCCloud
- SpringCloud元件 & 原始碼剖析:Eureka服務註冊方式流程全面分析SpringGCCloud元件原始碼
- SpringCloud學習筆記:服務註冊與發現Eureka(2)SpringGCCloud筆記
- Eureka註冊中心
- 微服務之Eureka(二)服務中心互相註冊-Ribbon的結合使用微服務
- SpringCloud——Eureka-微服務的註冊中心SpringGCCloud微服務
- Spring Cloud Eureka原理分析(三):註冊資訊讀取(服務端)SpringCloud服務端
- mysql註冊服務MySql
- 微服務架構 | 3.1 Netflix Eureka 註冊中心微服務架構
- SpringCloud核心教程 | 第三篇:服務註冊與發現 Eureka篇SpringGCCloud
- SpringCloud 教程 | 第一篇: 服務的註冊與發現(Eureka)SpringGCCloud
- nacos 服務註冊原理
- SpringCloud之服務註冊SpringGCCloud
- consul 服務註冊中心
- 企業分散式微服務雲SpringCloud SpringBoot mybatis -服務的註冊與發現(Eureka)分散式微服務GCCloudSpring BootMyBatis