服務註冊-Eureka

kk阿彬發表於2020-12-19

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>

  1. 配置 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/
  1. 寫啟動類 EurekaServerApplication
    記得加上@EnableEurekaServer

現在有兩個需要Eureka服務的微服務模組:
spring-cloud-demo-provider-payment (提供支付服務,生產者)
spring-cloud-demo-consumer-order (訂單呼叫支付服務,消費者)
使用者發給order模組的請求轉發給payment處理。

搭建步驟:
同樣分為三步:

  1. 引入pom
    只要是需要eureka server 提供服務的模組都要引入eureka client 的 依賴
 <!--eureka 註冊中心-->
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
                </dependency>
  1. 修改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
  1. 新增主啟動類
    記得@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開啟負載均衡註解,還可以指定負載均衡演算法,預設輪詢
在這裡插入圖片描述
測試:
在這裡插入圖片描述
不做任何更改重新整理網頁
在這裡插入圖片描述

現在的架構圖:
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

相關文章