1. 程式人生 > >微服務基礎設施之服務註冊中心: Spring Cloud Eureka

微服務基礎設施之服務註冊中心: Spring Cloud Eureka

對服務註冊中心的需求

在微服務架構中,由於每一個服務的粒度相對傳統SOA來說要小的多,所以服務的數量會成倍增加。這時如果有效管理服務的註冊資訊就尤為重要。我們對服務註冊中心的期望主要有以下幾條:

  • 簡單易用:最好對開發者透明
  • 高可用:幾臺註冊中心壞掉不會導致整個服務癱瘓,註冊服務整體持續可用
  • 避免跨越機房呼叫:最好呼叫優先同一個機房的服務以減少網路延遲
  • 跨語言:允許開發者使用多種程式語言構建微服務

Netflix Eureka如何滿足需求

簡單易用

Eureka的易用性體現在兩方面,一是通過與Spring Boot(Cloud)結合達到了只用註解和maven依賴就能部署和啟動服務的效果,二是Eureka自帶Client包,使得使用Eureka作為註冊中心的客戶端(即服務)不需要關心自己與Eureka的通訊機制只需要引入Client依賴即可,當然前提是使用Java。

構造一個Eureka Server非常簡單,首先引入依賴:

<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
    </dependencies>

然後編寫main方法加註解:

@SpringBootApplication
@EnableEurekaServer
public class AlanRegistryServer {
    public static void main(String[] args) {
        SpringApplication.run(AlanRegistryServer.class, args);
    }
}

最後打成jar包執行即可。

對於Eureka客戶端,我們也只需要上面的兩步:

<dependencies>
        <dependency>
            <groupId
>
org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> </dependencies>

然後:

@SpringBootApplication
@EnableEurekaClient
public class RegistryClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(RegistryClientApplication.class, args);
    }
}

Server和Client的配置資訊,都可以在Spring Boot專案的application.properties中配置。

高可用

Eureka通過“夥伴”機制實現高可用。每一臺Eureka都需要在配置中指定另一個Eureka的地址作為夥伴,Eureka啟動時會向自己的夥伴節點獲取當前已經存在的註冊列表, 這樣在向Eureka叢集中新加機器時就不需要擔心註冊列表不完整的問題。

除此之外,Eureka還支援RegionZone的概念。其中一個Region可以包含多個Zone。Eureka在啟動時需要指定一個Zone名,即當前Eureka屬於哪個zone, 如果不指定則屬於defaultZone。Eureka Client也需要指定Zone, Client(當與Ribbon配置使用時)在向Server獲取註冊列表時會優先向自己Zone的Eureka發請求,如果自己Zone中的Eureka全掛了才會嘗試向其它Zone。RegionZone可以對應於現實中的大區和機房,如在華北地區有10個機房,在華南地區有20個機房,那麼分別為Eureka指定合理的Region和Zone能有效避免跨機房呼叫,同時一個地區的Eureka壞掉不會導致整個該地區的服務都不可用。

跨語言

雖然Eureka是用Java編寫的,但它會將所有註冊資訊和心跳連線地址都暴露為HTTP REST介面,客戶端實際是通過HTTP請求與Server進行通訊的,因此,Client完全可以使用其它語言進行編寫,只需要即時呼叫註冊服務、登出服務、獲取服務列表和心跳請求的HTTP REST介面即可。到目前為止Eureka只提供了Java語言的Client, 因此如果使用其它語言會犧牲一定的易用性,因為需要了解Eureka與Client的通訊機制,對此官方wiki上有詳細說明。

Spring Cloud Netflix對微服務的支援還有:

  • Hystrix: 斷路器和資源隔離
  • Feign: 宣告式HTTP REST請求客戶端
  • Ribbon: 與Eureka結合實現軟負載均衡
  • Zuul: API請求路由,即Api Gateway
  • Bus: 各個微服務節點之間的訊息通訊
  • Config: 配置的中央化儲存