本節介紹如何設置Eureka服務器。html
要在項目中包含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服務器: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}" } }
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配置文件中運行它來在兩個主機(peer1
和peer2
)上運行相同的服務器,你可使用此配置經過操做/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
在某些狀況下,Eureka最好公佈服務的IP地址而不是主機名,將eureka.instance.preferIpAddress
設置爲true
,當應用程序向eureka註冊時,它使用其IP地址而不是其主機名。
若是Java沒法肯定主機名,則將IP地址發送給Eureka,設置主機名的明確方法是隻有設置eureka.instance.hostname
屬性,你可使用環境變量在運行時設置主機名 — 例如,eureka.instance.hostname=${HOST_NAME}
。
只需將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中刪除了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>