Spring Cloud 參考文檔(服務發現:Eureka Server)

服務發現:Eureka Server

本節介紹如何設置Eureka服務器。html

如何包含Eureka服務器

要在項目中包含Eureka Server,請使用組ID爲org.springframework.cloud和工件ID爲spring-cloud-starter-netflix-eureka-server的啓動器。java

若是你的項目已使用Thymeleaf做爲其模板引擎,則可能沒法正確加載Eureka服務器的Freemarker模板,在這種狀況下,有必要手動配置模板加載器:

application.ymlgit

spring:
  freemarker:
    template-loader-path: classpath:/templates/
    prefer-file-system-access: false

如何運行Eureka服務器

如下示例顯示了最小的Eureka服務器:github

@SpringBootApplication
@EnableEurekaServer
public class Application {

    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class).web(true).run(args);
    }

}

服務器有一個UI主頁和在/eureka/*下用於正常Eureka功能的HTTP API端點。web

如下連接有一些Eureka背景閱讀:flux capacitor谷歌小組討論spring

因爲Gradle的依賴關係解析規則和缺乏父bom特性,依賴spring-cloud-starter-netflix-eureka-server可能致使應用程序啓動失敗,要解決此問題,請添加Spring Boot Gradle插件並導入Spring cloud starter parent bom,以下所示:segmentfault

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

高可用性、Zones和Regions

Eureka服務器沒有後端存儲,但註冊表中的服務實例都必須發送心跳以使其註冊保持最新(所以能夠在內存中完成),客戶端還有一個Eureka註冊的內存緩存(所以,它們沒必要對服務的每一個請求都去註冊表)。api

默認狀況下,每一個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(兩個Peer Aware Eureka服務器)。

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

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

在前面的示例中,咱們有一個YAML文件,能夠經過在不一樣的Spring配置文件中運行它來在兩個主機(peer1peer2)上運行相同的服務器,你可使用此配置經過操做/etc/hosts來解析主機名來測試單個主機上的對等感知(在生產中執行此操做沒有太大價值)。實際上,若是你在知道本身的主機名的計算機上運行,​​則不須要eureka.instance.hostname(默認狀況下,使用java.net.InetAddress查找它)。

你能夠將多個對等體添加到系統中,而且只要它們經過至少一個邊緣彼此鏈接,它們就會在它們之間同步註冊,若是對等體在物理上是分開的(在數據中心內或在多個數據中心之間),那麼系統原則上能夠在「裂腦」類型故障中存活,你能夠向系統添加多個對等體,只要它們彼此直接鏈接,它們就會在它們之間同步註冊。

application.yml(三個Peer Aware Eureka服務器)。

eureka:
  client:
    serviceUrl:
      defaultZone: http://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保護你的Eureka服務器,默認狀況下,當Spring Security位於類路徑上時,它將要求應用程序的每次請求都要發送有效的CSRF令牌,Eureka客戶端一般不會擁有有效的跨站點請求僞造(CSRF)令牌,你須要爲/eureka/**端點禁用此要求,例如:

@EnableWebSecurity
class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().ignoringAntMatchers("/eureka/**");
        super.configure(http);
    }
}

有關CSRF的更多信息,請參閱Spring Security文檔

能夠在Spring Cloud Samples存儲庫中找到Eureka Server demo。

JDK 11支持

在JDK 11中刪除了Eureka服務器所依賴的JAXB模塊,若是你打算在運行Eureka服務器時使用JDK 11,則必須在POM或Gradle文件中包含這些依賴項。

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-core</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.3.0</version>
</dependency>

上一篇:服務發現:Eureka客戶端

下一篇:斷路器:Hystrix客戶端

相關文章
相關標籤/搜索