Eureka使用總結

bei_er發表於2021-10-18

關於Eureka:

提供基於 REST的服務,在叢集中主要用於服務管理。使用該框架,可以將業務元件註冊到Eureka容器中,這些元件可進行叢集部署,Eureka主要維護這些服務的列表並自動檢查他們的狀態。

架構圖:

image

常用配置說明:

服務端:

eureka.client.register-with-eureka 屬性,宣告是否將自己的資訊註冊到Eureka伺服器,預設為true。

eureka.client.fetch-registry 屬性,表示是否到Eureka伺服器中抓取註冊資訊。

eureka.server.eviction-interval-timer-in-ms 屬性來修改登錄檔的清理間隔,單位是毫秒。

eureka.server.enable-self-preservation 屬性,將值設定為false來關閉自我保護機制。預設為true。

eureka.server.renewal-percent-threshold : 0.85 ,自我保護閾值。

eureka.server. use-read-only-response-cache: false ,關閉從 readOnly (快取)讀登錄檔資訊。

eureka.server.response-cache-update-interval-ms: 1000 ,readwrite 和 readonly 同步時間間隔。單位毫秒。

優化

  server:
    # 自我保護,看服務多少。如果服務數量少需要開啟,如果服務數量多可以關閉。
    enable-self-preservation: true
    # 自我保護閾值
    renewal-percent-threshold: 0.85
    # 剔除服務時間間隔
    eviction-interval-timer-in-ms: 1000
    # 關閉從readOnly(快取)讀登錄檔
    use-read-only-response-cache: false
    # readWrite 和 readOnly 同步時間間隔。
    response-cache-update-interval-ms: 1000

客戶端:

eureka.instance.lease-renewal-interval-in-seconds屬性,客戶端的例項會向伺服器週期性的傳送心跳,預設是30秒傳送一次。

eureka.client.registry-fetch-interval-seconds屬性,客戶端抓取登錄檔並快取的間隔時間。預設是30秒。

eureka.instance.leaseExpirationDurationInSecond 屬性,伺服器端接收心跳請求,如果在一定期限內沒有接收到服務例項的心跳,那麼會將該例項從登錄檔中清理掉,其他的客戶端將會無法訪問這個例項。預設是90 秒,伺服器90秒沒有收到客戶端的心跳,就會將這個例項從列表中清理掉。但是需要注意的是,清理登錄檔有一個定時器在執行,預設是60秒執行一次,如果將該值設定小於60秒,雖然符合刪除例項的條件,但是還沒到60秒,這個例項將仍然存在登錄檔中(因為還沒有執行清理)。我們可以在伺服器端配置eureka.server.eviction-interval-timer-in-ms 屬性來修改登錄檔的清理間隔,單位是毫秒。

優化

	client:
		#重新整理登錄檔(拉取登錄檔)間隔
		registry-fetch-interval-seconds: 5 
	intance:
		#心跳續約間隔
		lease-renewal-interval-in-seconds: 10
		#心跳過期時間
		lease-expiration-duration-in-seconds: 10

叢集配置

雙臺叢集的配置

服務端配置

service1的配置

#是否將自己註冊到Eureka Server,預設為true
eureka.client.register-with-eureka=true
#是否從eureka server獲取註冊資訊
eureka.client.fetch-registry=true
#設定服務註冊中心的URL,用於client和server端交流
eureka.client.service-url.defaultZone=http://euk2.com:8002/eureka/
#例項主機名
eureka.instance.hostname=euk1.com
#應用服務名
spring.application.name=EurekaServer
server.port=8001

service2的配置

#是否將自己註冊到Eureka Server,預設為true
eureka.client.register-with-eureka=true
#是否從eureka server獲取註冊資訊
eureka.client.fetch-registry=true
#設定服務註冊中心的URL,用於client和server端交流
eureka.client.service-url.defaultZone=http://euk2.com:8001/eureka/
#例項主機名
eureka.instance.hostname=euk2.com
#應用服務名
spring.application.name=EurekaServer
server.port=8002

客戶端配置

#客戶端每次都會使用第一個註冊服務拉取資料。在使用的時候,需要打亂前兩個註冊服務的順序。
eureka.client.service-url.defaultZone = http://euk1.com:8001/eureka/,http://euk2.com:8002/eureka/
spring.application.name=user-provider

三臺叢集的配置

服務端配置

eureka:
    client:
        serviceUrl:
            defaultZone: http://euk1.com:8001/eureka/,http://euk2.com:8002/eureka/,http://euk3.com:8003/eureka/
spring:
    application:
        name: ThreeClustersEurake
---
spring:
    profiles: euk1
eureka:
    instance:
        hostname: euk1.com
server:
    port: 8001
---
spring:
    profiles: euk2
eureka:
    instance:
        hostname: euk2.com
server:
    port: 8002
---
spring:
    profiles: euk3
eureka:
    instance:
        hostname: euk3.com
server:
    port: 8003


客戶端配置

eureka.client.service-url.defaultZone = http://euk1.com:8001/eureka/,http://euk2.com:8002/eureka/,http://euk3.com:8003/eureka/
server.port=8004
spring.application.name=user-provider

服務通知

@Component
public class EurekaStateChangeListener {

    @EventListener
    public void listen(EurekaInstanceCanceledEvent event){
        System.out.println(event.getServerId()+"\t"+event.getAppName()+"服務下線");
    }

    @EventListener
    public void listen( EurekaInstanceRegisteredEvent event){
        InstanceInfo instanceInfo = event.getInstanceInfo();
        System.out.println(instanceInfo.getAppName()+"進行註冊");
    }

    @EventListener
    public void listen(EurekaInstanceRenewedEvent event){
        System.out.println(event.getServerId()+"\t"+event.getAppName()+"服務進行續約");
    }

    @EventListener
    public void listen(EurekaRegistryAvailableEvent event){
        System.out.println("註冊中心啟動");
    }

    @EventListener
    public void listen(EurekaServerStartedEvent event){
        System.out.println("Eureka Server啟動");
    }
}