Spring Cloud Netflix 功能

服務發現:Eureka 客戶端

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

如何包含 Eureka 客戶端

要在您的專案中包含 Eureka 客戶端,請使用 group ID 為 org.springframework.cloud、artifact ID 為 spring-cloud-starter-netflix-eureka-client 的啟動器。有關如何使用當前 Spring Cloud Release Train 設定您的構建系統,請參閱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 應用。透過在 classpath 中包含 spring-cloud-starter-netflix-eureka-client,您的應用會自動向 Eureka Server 註冊。需要進行配置以定位 Eureka 伺服器,如下例所示

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

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

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

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

在 classpath 中包含 spring-cloud-starter-netflix-eureka-client 會使應用既成為一個 Eureka“例項”(即它註冊自己),又成為一個“客戶端”(它可以查詢註冊中心來定位其他服務)。例項行為由 eureka.instance.* 配置鍵驅動,但如果您確保應用有 spring.application.name 的值(這是 Eureka 服務 ID 或 VIP 的預設值),則預設設定即可。

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

要停用 Eureka Discovery Client,可以將 eureka.client.enabled 設定為 false。當 spring.cloud.discovery.enabled 設定為 false 時,Eureka Discovery Client 也將被停用。

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

向 Eureka Server 進行認證

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

當 Eureka server 需要客戶端證書進行認證時,可以透過屬性配置客戶端證書和信任庫,如下例所示

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 的限制,無法支援每個伺服器的 Basic Auth 憑據,因此僅使用找到的第一組憑據。

如果您想自定義 Eureka HTTP 客戶端使用的 RestTemplate,您可以考慮建立 EurekaClientHttpRequestFactorySupplier 型別的 bean,並提供自己的邏輯來生成 ClientHttpRequestFactory 例項。

Eureka HTTP 客戶端使用的 RestTemplate 和 RestClient 的所有預設超時相關屬性都設定為 3 分鐘(與 Apache HC5 預設的 RequestConfigSocketConfig 保持一致)。因此,要指定超時值,您必須直接透過 eureka.client.rest-template-timeouteureka.client.restclient.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 使用客戶端心跳來判斷客戶端是否處於 UP 狀態。除非另有指定,否則 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.instanceId 的值是 vcap.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}}}

結合前面的示例中顯示的元資料,以及在 localhost 上部署的多個服務例項,可以將隨機值插入其中以使例項唯一。在 Cloud Foundry 中,vcap.application.instance_id 會在 Spring Boot 應用中自動填充,因此不需要隨機值。

使用 EurekaClient

一旦您擁有一個作為發現客戶端的應用,您就可以使用它從 Eureka Server 發現服務例項。一種方法是使用原生的 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 方法中使用 EurekaClient(或在 ApplicationContext 可能尚未啟動的任何地方)。它在 SmartLifecycle 中初始化(phase=0),因此您可以依賴它可用的最早時機是在另一個具有更高 phase 的 SmartLifecycle 中。

底層 HTTP 客戶端

EurekaClient 內部使用 RestClientRestTemplateWebClientJerseyClient。為了使用 EurekaClient,您的 classpath 中需要包含其中一個受支援的 HTTP 客戶端。

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

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

如果您希望改用 Jersey,您需要將 Jersey 依賴項新增到您的 classpath 中。以下示例顯示了您需要新增的依賴項

<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>

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

原生 Netflix EurekaClient 的替代方案

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

您還可以使用 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 的值可以加快客戶端連線到其他服務的速度。在生產環境中,由於伺服器內部計算對續約週期的假設,最好還是堅持使用預設值。

區域(Zones)

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

首先,您需要確保已將 Eureka 伺服器部署到每個區域,並且它們相互之間是對等節點。有關更多資訊,請參閱關於區域和地域(zones and regions)的部分。

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

Zone 1 中的 Service 1

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

Zone 2 中的 Service 1

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

重新整理 Eureka 客戶端

預設情況下,EurekaClient bean 是可重新整理的,這意味著可以更改和重新整理 Eureka 客戶端屬性。當發生重新整理時,客戶端將從 Eureka server 取消註冊,並且可能存在給定服務的所有例項短暫不可用的情況。避免這種情況發生的一種方法是停用重新整理 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 Client 整合支援 Spring AOT 轉換和 Native Image,但僅在停用重新整理模式時支援。

如果您想在 AOT 或 Native Image 模式下執行 Eureka Client,請務必將 spring.cloud.refresh.enabled 設定為 false
考慮到 AOT 和 Native Image 的封閉世界假設,提前編譯或 Native Image 不支援 Eureka 客戶端使用隨機埠。

服務發現:Eureka 伺服器

本節介紹如何設定 Eureka 伺服器。

如何包含 Eureka Server

要在您的專案中包含 Eureka Server,請使用 group ID 為 org.springframework.cloud、artifact ID 為 spring-cloud-starter-netflix-eureka-server 的啟動器。有關如何使用當前 Spring Cloud Release Train 設定您的構建系統,請參閱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 群組討論

由於 Gradle 的依賴解析規則以及缺少 parent bom 功能,依賴於 spring-cloud-starter-netflix-eureka-server 可能會導致應用啟動失敗。要解決此問題,請新增 Spring Boot Gradle 外掛並匯入 Spring cloud starter parent 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 預熱時間的影響

Netflix Eureka 的 waitTimeInMsWhenSyncEmpty 設定在 Spring Cloud Eureka server 啟動初期並未被考慮。為了啟用預熱時間,請設定 eureka.server.defaultOpenForTrafficCount=0

高可用性、區域和地域

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

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

獨立模式

兩個快取(客戶端和伺服器)與心跳的結合使得獨立的 Eureka 伺服器具有相當的容錯能力,只要有某種監控或彈性執行時(例如 Cloud Foundry)使其保持執行。在獨立模式下,您可能傾向於關閉客戶端行為,這樣它就不會不斷嘗試並失敗地連線到其對等節點。以下示例展示瞭如何關閉客戶端行為

application.yml (獨立 Eureka Server)
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 Profile 下執行,將同一個伺服器執行在兩個主機(peer1peer2)上。您可以使用此配置透過修改 /etc/hosts 來解析主機名,從而在單個主機上測試對等感知(這在生產環境中價值不大)。事實上,如果您執行在一臺知道自己主機名的機器上(預設情況下,它透過 java.net.InetAddress 查詢),則不需要 eureka.instance.hostname

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

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-boot-starter-security 將 Spring Security 新增到伺服器的 classpath 中,即可保護您的 Eureka 伺服器。預設情況下,當 classpath 中存在 Spring Security 時,它會要求每個傳送到應用程式的請求都附帶有效的 CSRF token。Eureka 客戶端通常不具備有效的跨站請求偽造 (CSRF) token,因此您需要對 /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 Samples 倉庫中找到一個 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 Server 不支援 Spring AOT 轉換或 native images。

指標

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 相關配置屬性的列表,請檢視附錄頁面