《Spring Cloud Netflix官方文件》2. 服務發現:Eureka伺服器
原文連結 譯者:Acamy
2. 服務發現:Eureka伺服器
2.1 如何建立Eureka伺服器
引用org.springframework.cloud的spring-cloud-starter-eureka-server就可以建立Eureka伺服器。在當前Spring Cloud版本中如何進行詳細設定可以檢視Spring Cloud工程頁面。
2.2 如何執行Eureka伺服器
Eureka伺服器的示例程式碼:
@SpringBootApplication @EnableEurekaServer public class Application { public static void main(String[] args) { new SpringApplicationBuilder(Application.class).web(true).run(args); } }
該伺服器有一個UI主頁,並且Eureka每一個功能點都可以通過/eurake/*形式的HTTP API來訪問。
Eureka背景閱讀:檢視flux capacitor和google group discussion頁面。
提示:由於Gradle缺少設定父工程的方式,僅僅靠spring-cloud-starter-eureka-server會使得應用在啟動時失敗。要解決這個問題必須將Spring Boot的Gradle外掛新增進來,並且像下面這種方式匯入Spring cloud的父工程。
build.gradle.
buildscript { dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.5.RELEASE") } } apply plugin: "spring-boot" dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:Brixton.RELEASE" } }
2.3 高可用性,區塊和區域
Eureka伺服器並沒有一個後臺儲存,但是登錄檔中的所有服務例項都要得傳送心跳以更新它們的註冊資訊(所以這可以在記憶體中操作)。客戶端也會有一個對eurake註冊資訊的快取(所以它們的每次單獨服務請求並不非得去登錄檔中查詢)。
預設情況下Eureka伺服器也是一個Eureka客戶端並且需要(至少)一個服務URL來定位到節點。如果你沒有提供它也會執行,但是在日誌中會出現很多關於沒有註冊該節點的雜亂資訊。
關於客戶端側的區塊和區域可以檢視如下Ribbon詳細支援頁面。
2.4 單機模式
只要有某種監控或者是彈性執行時間(比如Cloud Foundry)來使服務存活,兩個快取(客戶端和伺服器)和心跳機制的整合使得單機Eureka伺服器對故障保有相關的彈性。在單機模式下,你可能更喜歡關掉伺服器的客戶端行為,使得它不會不斷失敗的訪問節點。例如:
server: port: 8761 eureka: instance: hostname: localhost client: registerWithEureka: false fetchRegistry: false serviceUrl: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
注意serviceUrl和本地例項指向同一個主機。
2.5 節點感知
Eureka通過執行多個例項並要求它們彼此註冊來使其高可用。實際上,這是它的預設行為,所以你需要做的就是給節點新增一個有效的serviceUrl來使其正常工作,例如:
Application.yml(兩個相互感知的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 profiles使得同一個伺服器可以執行在兩臺主機上。你可更改/etc/hosts檔案來解析主機名,用這個配置檔案在單機上測試節點感知(在生產中這樣做是沒有多少意義的)。實際上如果你執行的機器知道自己的主機名(預設會通過java.net.InetAddress查詢),那麼eureka.instance.hostname是不需要的。
你可以在一個系統中新增多個節點,他們之間只要相互連線就能自己同步註冊資訊。如果這些節點在物理上是分離的(在一個或多個數據中心),那麼該系統原則上是可以避免split-brain型故障。
2.6 IP地址偏好
在某些情況下,使用服務的IP地址比主機名好。通過將eureka.instance.preferIPAddress設定為true,應用在註冊eureka時就會使用IP地址而不是主機名。