Spring Cloud Netflix 特性

服務發現:Eureka 客戶端

服務發現是基於微服務架構的關鍵原則之一。嘗試手動配置每個客戶端或某種形式的約定可能難以實現且脆弱。Eureka 是 Netflix 的服務發現伺服器和客戶端。伺服器可以配置和部署為高可用,每個伺服器將註冊服務的狀態複製給其他伺服器。

如何包含 Eureka 客戶端

要在專案中包含 Eureka 客戶端,請使用組 ID 為 org.springframework.cloud 且 artifact ID 為 spring-cloud-starter-netflix-eureka-client 的啟動器。有關使用當前 Spring Cloud 釋出列車設定構建系統的詳細資訊,請參閱 Spring Cloud 專案頁面

向 Eureka 註冊

當客戶端向 Eureka 註冊時,它會提供自身的元資料——例如主機、埠、健康指示器 URL、主頁和其他詳細資訊。Eureka 接收來自屬於服務的每個例項的心跳訊息。如果心跳在可配置的時間表內失敗,則該例項通常會從登錄檔中移除。

以下示例顯示了一個最小的 Eureka 客戶端應用程式

@SpringBootApplication
@RestController
public class Application {

    @RequestMapping("/")
    public String home() {
        return "Hello world";
    }

    public static void main(String[] args) {
		SpringApplication.run(CustomerServiceTestApplication.class, args);
	}


}

請注意,前面的示例顯示了一個普通的 Spring Boot 應用程式。透過在類路徑中包含 spring-cloud-starter-netflix-eureka-client,您的應用程式會自動向 Eureka 伺服器註冊。需要配置才能找到 Eureka 伺服器,如以下示例所示

application.yml
eureka:
  client:
    serviceUrl:
      defaultZone: https://:8761/eureka/

在前面的示例中,defaultZone 是一個神奇的字串回退值,它為任何未表達偏好(換句話說,它是一個有用的預設值)的客戶端提供服務 URL。

defaultZone 屬性區分大小寫並要求使用駝峰命名法,因為 serviceUrl 屬性是 Map<String, String>。因此,defaultZone 屬性不遵循 default-zone 的常規 Spring Boot 蛇形命名約定。

預設應用程式名稱(即服務 ID)、虛擬主機和非安全埠(取自 Environment)分別為 ${spring.application.name}${spring.application.name}${server.port}

在類路徑中包含 spring-cloud-starter-netflix-eureka-client 使應用程式既成為 Eureka“例項”(即它註冊自身)又成為“客戶端”(它可以查詢登錄檔以定位其他服務)。例項行為由 eureka.instance.* 配置鍵驅動,但如果您確保應用程式具有 spring.application.name 的值(這是 Eureka 服務 ID 或 VIP 的預設值),則預設值就足夠了。

有關可配置選項的更多詳細資訊,請參閱 EurekaInstanceConfigBeanEurekaClientConfigBean

要停用 Eureka 發現客戶端,您可以將 eureka.client.enabled 設定為 false。當 spring.cloud.discovery.enabled 設定為 false 時,Eureka 發現客戶端也將被停用。

目前不支援將 Spring Cloud Netflix Eureka 伺服器的版本指定為路徑引數。這意味著您無法在上下文路徑 (eurekaServerURLContext) 中設定版本。相反,您可以在伺服器 URL 中包含版本(例如,您可以設定 defaultZone: localhost:8761/eureka/v2)。

使用 Eureka 伺服器進行身份驗證

如果 eureka.client.serviceUrl.defaultZone URL 之一嵌入了憑據(curl 樣式,如下所示:user:password@localhost:8761/eureka),HTTP 基本身份驗證會自動新增到您的 eureka 客戶端。對於更復雜的需求,您可以建立 DiscoveryClientOptionalArgs 型別的 @Bean 並向其中注入 ClientFilter 例項,所有這些都將應用於從客戶端到伺服器的呼叫。

當 Eureka 伺服器需要客戶端證書進行身份驗證時,可以透過屬性配置客戶端證書和信任庫,如以下示例所示

application.yml
eureka:
  client:
    tls:
      enabled: true
      key-store: <path-of-key-store>
      key-store-type: PKCS12
      key-store-password: <key-store-password>
      key-password: <key-password>
      trust-store: <path-of-trust-store>
      trust-store-type: PKCS12
      trust-store-password: <trust-store-password>

eureka.client.tls.enabled 需要設定為 true 才能啟用 Eureka 客戶端 TLS。當省略 eureka.client.tls.trust-store 時,將使用 JVM 預設信任庫。eureka.client.tls.key-store-typeeureka.client.tls.trust-store-type 的預設值為 PKCS12。當省略密碼屬性時,假定為空密碼。

由於 Eureka 的限制,不支援每個伺服器的基本身份驗證憑據,因此只使用找到的第一組憑據。

如果您想自定義 Eureka HTTP 客戶端使用的 RestClient,您可能需要建立一個 EurekaClientHttpRequestFactorySupplier bean,並提供您自己的邏輯來生成 ClientHttpRequestFactory 例項。

Eureka HTTP 客戶端使用的 RestClient 的所有預設超時相關屬性都設定為 3 分鐘(與 Apache HC5 預設 RequestConfigSocketConfig 保持一致)。因此,要指定超時值,您必須直接透過 eureka.client.timeout 中的屬性來指定。所有超時屬性都以毫秒為單位。

application.yml
eureka:
  client:
    restclient:
      timeout:
        connect-timeout: 5000
        connect-request-timeout: 8000
        socket-timeout: 10000
    rest-template-timeout:
      connect-timeout: 5000
      connect-request-timeout: 8000
      socket-timeout: 10000

您還可以透過建立 EurekaClientHttpRequestFactorySupplier.RequestConfigCustomizer 型別的 bean 來定製底層 Apache HttpClient 5 的 RequestConfig

@Configuration
public class RestClientConfiguration {

	@Bean
	EurekaClientHttpRequestFactorySupplier.RequestConfigCustomizer requestConfigCustomizer() {
		return builder -> builder.setProtocolUpgradeEnabled(false);
	}

}

狀態頁面和健康指示器

Eureka 例項的狀態頁面和健康指示器分別預設為 /info/health,這是 Spring Boot Actuator 應用程式中有用端點的預設位置。即使對於 Actuator 應用程式,如果您使用非預設上下文路徑或 servlet 路徑(例如 server.servletPath=/custom),也需要更改這些設定。以下示例顯示了這兩個設定的預設值

application.yml
eureka:
  instance:
    statusPageUrlPath: ${server.servletPath}/info
    healthCheckUrlPath: ${server.servletPath}/health

這些連結顯示在客戶端使用的元資料中,並在某些場景中用於決定是否向您的應用程式傳送請求,因此它們準確無誤很有幫助。

在 Dalston 中,更改管理上下文路徑時還需要設定狀態和健康檢查 URL。從 Edgware 開始,此要求已被取消。

註冊安全應用程式

如果您的應用程式希望透過 HTTPS 聯絡,您可以在 EurekaInstanceConfigBean 中設定兩個標誌

  • eureka.instance.[nonSecurePortEnabled]=[false]

  • eureka.instance.[securePortEnabled]=[true]

這樣做會使 Eureka 釋出例項資訊,顯示對安全通訊的明確偏好。Spring Cloud DiscoveryClient 始終返回以 https 開頭的 URI,用於以這種方式配置的服務。同樣,當服務以這種方式配置時,Eureka(原生)例項資訊具有安全的健康檢查 URL。

由於 Eureka 內部工作方式的原因,除非您也明確覆蓋狀態和主頁,否則它仍然會發布非安全 URL。您可以使用佔位符配置 Eureka 例項 URL,如以下示例所示

application.yml
eureka:
  instance:
    statusPageUrl: https://${eureka.hostname}/info
    healthCheckUrl: https://${eureka.hostname}/health
    homePageUrl: https://${eureka.hostname}/

(請注意,${eureka.hostname} 是一個原生佔位符,僅在 Eureka 的更高版本中可用。您也可以使用 Spring 佔位符實現相同的目的——例如,透過使用 ${eureka.instance.hostName}。)

如果您的應用程式執行在代理後面,並且 SSL 終止發生在代理中(例如,如果您在 Cloud Foundry 或其他平臺即服務中執行),那麼您需要確保代理的“轉發”頭被應用程式截獲和處理。如果 Spring Boot 應用程式中嵌入的 Tomcat 容器對“X-Forwarded-\*` 頭有明確配置,這會自動發生。如果您的應用程式自身呈現的連結錯誤(主機、埠或協議錯誤),則表明您的配置有誤。

Eureka 的健康檢查

預設情況下,Eureka 使用客戶端心跳來確定客戶端是否正常執行。除非另有說明,否則 Discovery Client 不會根據 Spring Boot Actuator 傳播應用程式的當前健康檢查狀態。因此,成功註冊後,Eureka 始終宣佈應用程式處於“UP”狀態。可以透過啟用 Eureka 健康檢查來更改此行為,這將導致將應用程式狀態傳播到 Eureka。因此,所有其他應用程式都不會向處於“UP”狀態以外的應用程式傳送流量。以下示例顯示瞭如何為客戶端啟用健康檢查

application.yml
eureka:
  client:
    healthcheck:
      enabled: true
eureka.client.healthcheck.enabled=true 應該只在 application.yml 中設定。在 bootstrap.yml 中設定該值會導致不良的副作用,例如以 UNKNOWN 狀態註冊到 Eureka。

如果您需要對健康檢查進行更多控制,請考慮實現自己的 com.netflix.appinfo.HealthCheckHandler

Eureka 例項和客戶端的元資料

值得花一些時間瞭解 Eureka 元資料的工作原理,以便您可以以在您的平臺中有意義的方式使用它。有關於主機名、IP 地址、埠號、狀態頁面和健康檢查等資訊的標準元資料。這些資訊釋出在服務登錄檔中,客戶端使用它們以直接的方式聯絡服務。可以將額外的元資料新增到 eureka.instance.metadataMap 中的例項註冊中,並且此元資料可在遠端客戶端中訪問。通常,額外的元資料不會改變客戶端的行為,除非客戶端了解元資料的含義。本文件後面描述了一些特殊情況,其中 Spring Cloud 已經為元資料對映分配了含義。

在 Cloud Foundry 上使用 Eureka

Cloud Foundry 有一個全域性路由器,因此所有相同應用程式的例項都具有相同的主機名(其他具有類似架構的 PaaS 解決方案也有相同的安排)。這不一定是使用 Eureka 的障礙。但是,如果您使用路由器(推薦或甚至強制,具體取決於您的平臺設定方式),您需要明確設定主機名和埠號(安全或非安全),以便它們使用路由器。您可能還想使用例項元資料,以便您可以在客戶端區分例項(例如,在自定義負載均衡器中)。預設情況下,eureka.instance.instanceIdvcap.application.instance_id,如以下示例所示

application.yml
eureka:
  instance:
    hostname: ${vcap.application.uris[0]}
    nonSecurePort: 80

根據您的 Cloud Foundry 例項中安全規則的設定方式,您可能能夠註冊並使用主機 VM 的 IP 地址進行直接的服務到服務呼叫。此功能尚未在 Pivotal Web Services (PWS) 上提供。

在 AWS 上使用 Eureka

如果應用程式計劃部署到 AWS 雲,則必須將 Eureka 例項配置為支援 AWS。您可以透過如下自定義 EurekaInstanceConfigBean 來實現

@Bean
@Profile("!default")
public EurekaInstanceConfigBean eurekaInstanceConfig(InetUtils inetUtils) {
  EurekaInstanceConfigBean bean = new EurekaInstanceConfigBean(inetUtils);
  AmazonInfo info = AmazonInfo.Builder.newBuilder().autoBuild("eureka");
  bean.setDataCenterInfo(info);
  return bean;
}

更改 Eureka 例項 ID

一個普通的 Netflix Eureka 例項以與其主機名相等的 ID 註冊(即,每個主機只有一個服務)。Spring Cloud Eureka 提供了一個合理的預設值,定義如下

${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.instance_id:${server.port}}

一個例子是 myhost:myappname:8080

透過使用 Spring Cloud,您可以透過在 eureka.instance.instanceId 中提供唯一識別符號來覆蓋此值,如以下示例所示

application.yml
eureka:
  instance:
    instanceId: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}

透過前面示例中所示的元資料,以及部署在本地主機上的多個服務例項,隨機值插入其中以使例項唯一。在 Cloud Foundry 中,vcap.application.instance_id 會在 Spring Boot 應用程式中自動填充,因此不需要隨機值。

使用 EurekaClient

一旦您擁有一個作為發現客戶端的應用程式,您就可以使用它從 Eureka 伺服器發現服務例項。一種方法是使用原生的 com.netflix.discovery.EurekaClient(而不是 Spring Cloud DiscoveryClient),如以下示例所示

@Autowired
private EurekaClient discoveryClient;

public String serviceUrl() {
    InstanceInfo instance = discoveryClient.getNextServerFromEureka("STORES", false);
    return instance.getHomePageUrl();
}

請勿在 @PostConstruct 方法或 @Scheduled 方法(或任何 ApplicationContext 可能尚未啟動的地方)中使用 EurekaClient。它在 SmartLifecyclephase=0)中初始化,因此您最早可以依賴它可用是在具有更高 phase 的另一個 SmartLifecycle 中。

底層 HTTP 客戶端

EurekaClient 在底層使用 RestClientWebClientJerseyClient。要使用 EurekaClient,您需要在類路徑中包含其中一個受支援的 HTTP 客戶端。

要使用 RestClient,請將 spring-boot-restclient 新增到您的依賴項中。要使用 WebClient,請將 spring-boot-webclient 新增到您的依賴項中。如果 spring-boot-restclientspring-boot-webclient 都包含在依賴項中並且 eureka.client.webclient.enabled 標誌設定為 true,則將使用 WebClient。如果不是這種情況,則將使用 RestClient

對於任何這些客戶端實現,如果存在可用的構建器 bean,它將被用來建立底層客戶端。
我們計劃在下一個主要版本中將預設客戶端更改為 RestClient

如果您希望使用 Jersey,則需要將 Jersey 依賴項新增到您的類路徑中。以下示例顯示了您需要新增的依賴項

<dependencies>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-client</artifactId>
    </dependency>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-core</artifactId>
    </dependency>
    <dependency>
        <groupId>com.sun.jersey.contribs</groupId>
        <artifactId>jersey-apache-client4</artifactId>
    </dependency>
</dependencies>

如果您的類路徑中有 JerseyClient 但不想在 EuerekaClient 中使用它,請確保將 eureka.client.jersey.enabled 設定為 false

原生 Netflix EurekaClient 的替代方案

您無需使用原始的 Netflix EurekaClient。此外,通常更方便的是在某種包裝器後面使用它。Spring Cloud 支援 Feign(一個 REST 客戶端構建器)和 Spring Cloud LoadBalancer,透過邏輯 Eureka 服務識別符號(VIP)而不是物理 URL。

您還可以使用 org.springframework.cloud.client.discovery.DiscoveryClient,它為發現客戶端提供了一個簡單的 API(不特定於 Netflix),如以下示例所示

@Autowired
private DiscoveryClient discoveryClient;

public String serviceUrl() {
    List<ServiceInstance> list = discoveryClient.getInstances("STORES");
    if (list != null && list.size() > 0 ) {
        return list.get(0).getUri();
    }
    return null;
}

為什麼註冊服務如此緩慢?

作為例項還涉及透過客戶端的 serviceUrl 定期向註冊中心傳送心跳,預設持續時間為 30 秒。服務在例項、伺服器和客戶端都在其本地快取中擁有相同的元資料之前不可被客戶端發現(因此可能需要 3 次心跳)。您可以透過設定 eureka.instance.leaseRenewalIntervalInSeconds 來更改週期。將其設定為小於 30 的值會加快客戶端連線到其他服務的過程。在生產環境中,由於伺服器內部對租約續訂週期的假設進行了一些計算,因此最好堅持使用預設值。

區域

如果您已將 Eureka 客戶端部署到多個區域,您可能希望這些客戶端先使用同一區域內的服務,然後再嘗試其他區域的服務。要進行設定,您需要正確配置您的 Eureka 客戶端。

首先,您需要確保每個區域都部署了 Eureka 伺服器,並且它們是彼此的對等體。有關更多資訊,請參閱關於區域和地域的部分。

接下來,您需要告訴 Eureka 您的服務位於哪個區域。您可以透過使用 metadataMap 屬性來實現。例如,如果 service 1 同時部署到 zone 1zone 2,您需要在 service 1 中設定以下 Eureka 屬性

Zone 1 中的服務 1

eureka.instance.metadataMap.zone = zone1
eureka.client.preferSameZoneEureka = true

Zone 2 中的服務 1

eureka.instance.metadataMap.zone = zone2
eureka.client.preferSameZoneEureka = true

重新整理 Eureka 客戶端

預設情況下,EurekaClient bean 是可重新整理的,這意味著 Eureka 客戶端屬性可以更改和重新整理。當發生重新整理時,客戶端將從 Eureka 伺服器取消註冊,並且可能會出現給定服務的所有例項都不可用的短暫時間。消除這種情況發生的一種方法是停用重新整理 Eureka 客戶端的能力。為此,請設定 eureka.client.refresh.enable=false

將 Eureka 與 Spring Cloud LoadBalancer 結合使用

我們支援 Spring Cloud LoadBalancer 的 ZonePreferenceServiceInstanceListSupplier。Eureka 例項元資料(eureka.instance.metadataMap.zone)中的 zone 值用於設定 spring-cloud-loadbalancer-zone 屬性的值,該屬性用於按區域過濾服務例項。

如果缺少該值,並且 spring.cloud.loadbalancer.eureka.approximateZoneFromHostname 標誌設定為 true,它可以使用伺服器主機名中的域名作為區域的代理。

如果沒有其他區域資料來源,則會根據客戶端配置(而不是例項配置)進行猜測。我們取 eureka.client.availabilityZones,它是一個從區域名稱到區域列表的對映,併為例項自己的區域(即 eureka.client.region,預設為“us-east-1”,以與原生 Netflix 相容)提取第一個區域。

AOT 和 Native Image 支援

Spring Cloud Netflix Eureka 客戶端整合支援 Spring AOT 轉換和原生映象,但僅在停用重新整理模式下。

如果您想在 AOT 或原生映象模式下執行 Eureka 客戶端,請確保將 spring.cloud.refresh.enabled 設定為 false
鑑於 AOT 和原生映象的封閉世界假設,Eureka 客戶端使用隨機埠在提前編譯或原生映象中不受支援。

服務發現:Eureka 伺服器

本節描述如何設定 Eureka 伺服器。

如何包含 Eureka 伺服器

要在專案中包含 Eureka 伺服器,請使用組 ID 為 org.springframework.cloud 且 artifact ID 為 spring-cloud-starter-netflix-eureka-server 的啟動器。有關使用當前 Spring Cloud 釋出列車設定構建系統的詳細資訊,請參閱 Spring Cloud 專案頁面

如果您的專案已經使用 Thymeleaf 作為其模板引擎,那麼 Eureka 伺服器的 Freemarker 模板可能無法正確載入。在這種情況下,有必要手動配置模板載入器
application.yml
spring:
  freemarker:
    template-loader-path: classpath:/templates/
    prefer-file-system-access: false

如何執行 Eureka 伺服器

以下示例顯示了一個最小的 Eureka 伺服器

@SpringBootApplication
@EnableEurekaServer
public class Application {

    public static void main(String[] args) {
		SpringApplication.run(CustomerServiceTestApplication.class, args);
	}


}

伺服器具有帶 UI 的主頁和用於 /eureka/* 下的正常 Eureka 功能的 HTTP API 端點。

以下連結提供了一些 Eureka 背景閱讀材料:flux capacitorgoogle group discussion

由於 Gradle 的依賴解析規則以及缺少父 bom 功能,依賴 spring-cloud-starter-netflix-eureka-server 可能導致應用程式啟動失敗。為了解決這個問題,請新增 Spring Boot Gradle 外掛並匯入 Spring Cloud 啟動器父 bom,如下所示

build.gradle
buildscript {
  dependencies {
    classpath("org.springframework.boot:spring-boot-gradle-plugin:{spring-boot-docs-version}")
  }
}

apply plugin: "spring-boot"

dependencyManagement {
  imports {
    mavenBom "org.springframework.cloud:spring-cloud-dependencies:{spring-cloud-version}"
  }
}

defaultOpenForTrafficCount 及其對 EurekaServer 預熱時間的影響

Spring Cloud Eureka 伺服器在啟動時不會考慮 Netflix Eureka 的 waitTimeInMsWhenSyncEmpty 設定。要啟用預熱時間,請設定 eureka.server.defaultOpenForTrafficCount=0

高可用性、區域和地域

Eureka 伺服器沒有後端儲存,但登錄檔中的服務例項都必須傳送心跳以保持其註冊最新(因此可以在記憶體中完成)。客戶端也具有 Eureka 註冊的記憶體快取(因此它們不必為對服務的每個請求都訪問登錄檔)。

預設情況下,每個 Eureka 伺服器也是一個 Eureka 客戶端,並且需要(至少一個)服務 URL 來定位對等伺服器。如果您不提供它,服務會執行並工作,但會用大量關於無法向對等伺服器註冊的噪音填充您的日誌。

獨立模式

兩個快取(客戶端和伺服器)和心跳的結合使得獨立的 Eureka 伺服器在面對故障時相當具有彈性,只要有某種監視器或彈性執行時(如 Cloud Foundry)使其保持活動狀態。在獨立模式下,您可能更喜歡關閉客戶端行為,這樣它就不會不斷嘗試並失敗以聯絡其對等伺服器。以下示例顯示瞭如何關閉客戶端行為

application.yml(獨立 Eureka 伺服器)
server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

請注意,serviceUrl 指向與本地例項相同的主機。

對等感知

透過執行多個例項並要求它們相互註冊,Eureka 可以變得更加彈性和可用。實際上,這是預設行為,因此您只需向對等體新增一個有效的 serviceUrl 即可使其工作,如以下示例所示

application.yml(兩個對等感知的 Eureka 伺服器)
---
spring:
  profiles: peer1
eureka:
  instance:
    hostname: peer1
  client:
    serviceUrl:
      defaultZone: https://peer2/eureka/

---
spring:
  profiles: peer2
eureka:
  instance:
    hostname: peer2
  client:
    serviceUrl:
      defaultZone: https://peer1/eureka/

在前面的示例中,我們有一個 YAML 檔案,可以透過在不同的 Spring 配置檔案中執行它,在兩個主機(peer1peer2)上執行相同的伺服器。您可以使用此配置透過操縱 /etc/hosts 來解析主機名,從而在單個主機上測試對等感知(在生產環境中這樣做沒有太大價值)。實際上,如果您在知道自己主機名的機器上執行 (預設情況下,它透過 java.net.InetAddress 查詢),則不需要 eureka.instance.hostname

您可以向系統新增多個對等節點,只要它們都至少透過一條邊相互連線,它們就會相互同步註冊。如果對等節點物理分離(在資料中心內部或多個數據中心之間),那麼系統原則上可以承受“腦裂”型別的故障。您可以向系統新增多個對等節點,只要它們都直接相互連線,它們就會相互同步註冊。

application.yml(三個對等感知的 Eureka 伺服器)
eureka:
  client:
    serviceUrl:
      defaultZone: https://peer1/eureka/,http://peer2/eureka/,http://peer3/eureka/

---
spring:
  profiles: peer1
eureka:
  instance:
    hostname: peer1

---
spring:
  profiles: peer2
eureka:
  instance:
    hostname: peer2

---
spring:
  profiles: peer3
eureka:
  instance:
    hostname: peer3

何時優先使用 IP 地址

在某些情況下,Eureka 最好宣傳服務的 IP 地址而不是主機名。將 eureka.instance.preferIpAddress 設定為 true,當應用程式向 Eureka 註冊時,它將使用其 IP 地址而不是其主機名。

如果 Java 無法確定主機名,則會將 IP 地址傳送到 Eureka。設定主機名的唯一明確方法是設定 eureka.instance.hostname 屬性。您可以使用環境變數在執行時設定主機名——例如,eureka.instance.hostname=${HOST_NAME}

保護 Eureka 伺服器

您可以透過將 Spring Security 新增到伺服器的類路徑中,透過 spring-boot-starter-security 來簡單地保護您的 Eureka 伺服器。預設情況下,當 Spring Security 在類路徑中時,它會要求每個對應用程式的請求都發送有效的 CSRF 令牌。Eureka 客戶端通常不具備有效的跨站點請求偽造 (CSRF) 令牌,因此您需要停用 /eureka/** 端點的此要求。例如

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
	http.authorizeHttpRequests((authz) -> authz
        .anyRequest().authenticated())
	    .httpBasic(withDefaults());
    http.csrf().ignoringRequestMatchers("/eureka/**");
    return http.build();
}

有關 CSRF 的更多資訊,請參閱 Spring Security 文件

可以在 Spring Cloud 示例 倉庫 中找到一個演示 Eureka 伺服器。

JDK 11 支援

Eureka 伺服器依賴的 JAXB 模組在 JDK 11 中已被移除。如果您打算在執行 Eureka 伺服器時使用 JDK 11,則必須在 POM 或 Gradle 檔案中包含這些依賴項。

<dependency>
	<groupId>org.glassfish.jaxb</groupId>
	<artifactId>jaxb-runtime</artifactId>
</dependency>

AOT 和 Native Image 支援

Spring Cloud Netflix Eureka 伺服器不支援 Spring AOT 轉換或原生映象。

指標

EurekaInstanceMonitor 監聽與 Eureka 例項註冊相關的事件,並在 Micrometer 的 MeterRegistry 中建立/更新 Eureka 例項資訊的 Gauge。預設情況下,此行為已停用。如果您想啟用它,您需要將 eureka.server.metrics.enabled 設定為 true

預設情況下,Gauge 的名稱為 eureka.server.instances 並具有以下標籤

  • application:應用程式名稱

  • status:例項狀態(UP, DOWN, STARTING, OUT_OF_SERVICE, UNKNOWN,參見:com.netflix.appinfo.InstanceInfo.InstanceStatus

您可以透過注入自己的 EurekaInstanceTagsProvider 實現來新增額外的標籤。

配置屬性

要檢視所有 Spring Cloud Netflix 相關配置屬性的列表,請檢視附錄頁面

© . This site is unofficial and not affiliated with VMware.