天天看點

Spring Cloud Eureka-服務注冊與發現

Spring Cloud是目前用于開發微服務的主流架構之一,我們都知道在微服務架構中最為基礎、核心的子產品,就是服務注冊與發現。

在Spring Cloud裡我們可以使用它的Eureka子產品來實作服務注冊與發現,Spring Cloud Eureka是基于Netflix Eureka做了二次封裝,它主要負責完成各個微服務執行個體的自動化注冊和發現功能。

Eureka由兩個元件組成:

Eureka Server(注冊中心)

Eureka Client (服務注冊)

分布式系統中為什麼需要服務發現:

在實際的分布式環境下,架構規模往往不再是幾台伺服器,而是每個獨立服務都跑在多台機器上。例如A服務部署在10台機器上,B服務也部署在10台機器上,C服務部署在5台機器上。 現在A服務的一些功能需要調用B服務來實作,那麼問題來了,A服務要如何才能調用B服務呢?通常情況下,我們可以想到将B服務所在的所有機器位址,通過配置檔案來配置到A服務中,使其能夠通過配置好的位址去發現并調用B服務。 這也的确是一個可行的方法,但是這些機器的位址都是有可能發生變化的,而且在生産環境中也會出現部分服務當機的情況,這樣就有可能導緻一些連鎖效應。随着業務的擴充,機器也會越來越多,也沒辦法再手動通過配置檔案這種方式來配置機器位址了。 鑒于人類的懶惰天性。。。呸,鑒于人類對高效工作、美好生活的追求。是以專門用于服務注冊與發現的工具被一一開發出來。有了服務治理架構後,服務發現就可以交由它來自動完成。這時候A服務隻需要到注冊中心進行服務注冊,同樣的B服務也到注冊中心進行服務注冊。注冊之後,注冊中心會通過類似心跳機制來确認服務的存活。如果确認某個服務當機後,注冊中心會把當機的服務剔除掉。當A服務要調用B服務的時候,則到注冊中心去擷取B服務的調用位址即可,B服務調用A服務也是同理。注冊中心就相當于一個服務與服務之間的橋梁或者說中間人,可以說幫我們管理了服務之間瑣事。

Eureka服務治理體系如下:

Spring Cloud Eureka-服務注冊與發現

Spring Cloud官網位址如下:

https://projects.spring.io/spring-cloud/

廢話不多說,本小節我們來搭建一個Eureka Server,即服務注冊中心。打開IDEA,建立一個Spring Initializr項目:

Spring Cloud Eureka-服務注冊與發現
Spring Cloud Eureka-服務注冊與發現

勾選Eureka Server子產品:

Spring Cloud Eureka-服務注冊與發現

完成項目的建立:

Spring Cloud Eureka-服務注冊與發現

項目生成的pom.xml檔案内容如下:

注:SpringBoot與SpringCloud元件的版本是有一個對應關系的,這個在官網上有詳細的對照圖。值得注意的是,SpringCloud不是以2.0.1這種數字的方式來辨別版本号,而是以倫敦地鐵站的名稱來辨別版本号,并且這些名稱是符合字母順序的。

項目建立好後,我們可以試着啟動看看,但是在啟動之前需要在啟動類中加上<code>@EnableEurekaServer</code>注解,表示啟用Eureka Server,否則通路就會報404。代碼如下:

啟動項目後,能夠通路到如下Eureka注冊中心的頁面代表成功:

Spring Cloud Eureka-服務注冊與發現

此時雖然能夠正常通路到注冊中心的頁面,但是會發現控制台一直在報錯,提示<code>Cannot execute request on any known server</code>。這是因為這個Eureka Server既是server的同時,也是一個client,它也是需要把自己注冊到一個注冊中心去的。因為我們并沒有配置注冊中心的位址,是以它沒辦法注冊自己就會報這個錯誤。

既然如此,我們隻需配置一下注冊中心的位址即可,編輯application.yml配置檔案内容如下:

注:由于server和client是采用心跳機制來确認存活的,是以在啟動項目的過程可能依舊會報錯。但是隻要啟動後不是一直報錯,并且能正常通路Eureka資訊面闆頁面的話,則代表項目是在正常運作的

在上一小節中,我們簡單介紹了如何建立、配置Eureka Server項目。既然我們已經知道了如何搭建Eureka Server,那麼本小節我們将介紹Eureka Client的使用,會簡單示範一下如何通過Eureka Client進行服務注冊。

同樣的,使用IDEA建立一個Spring Initializr項目,隻不過在勾選子產品的時候需要選擇Eureka Discovery,如下:

Spring Cloud Eureka-服務注冊與發現

項目的依賴都加載完成後,在啟動類中加上<code>@EnableDiscoveryClient</code>,聲明這是一個eureka client,否則不會進行服務注冊:

接着就是在application.yml配置檔案中,配置注冊中心即eureka server的位址,以及項目的名稱和啟動端口号。如下:

完成以上配置後,即可啟動項目。但是我這裡啟動項目的時候失敗了,控制台輸出如下警告資訊:

Invocation of destroy method failed on bean with name 'scopedTarget.eurekaClient': org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'eurekaInstanceConfigBean': Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!)

這是因為client裡不包含Tomcat的依賴,是以Spring容器無法建立一些執行個體,進而導緻項目無法啟動,隻需在pom.xml檔案中,加上web依賴即可:

項目啟動成功後,可以在eureka server的資訊面闆中檢視到已注冊的執行個體資訊,如下:

Spring Cloud Eureka-服務注冊與發現

高可用是在服務架構設計中,頻繁出現的詞彙。微服務架構裡自然也一樣需要保證服務的高可用性,是以本小節将簡單說明一下Eureka是如何實作高可用的。

在實際生産環境中伺服器是很脆弱的,單台伺服器肯定是無法滿足高可用的需求,為了保證高可用性我們通常會準備多台伺服器。但可以發現上文中所搭建的eureka server是單機的,若這個eureka server當機,則會導緻與之關聯的全部微服務發生故障。

既然單機無法保證高可用,那麼我們就加多一台機器好了,然後讓這兩個eureka server互相進行關聯。例如我現在有兩台eureka server。一台名叫eureka-server01跑在8761端口上,另一台名叫eureka-server02跑在8762端口上。然後隻需要兩個步驟即可實作高可用:

1.編輯這兩台eureka server的配置檔案,讓它們的注冊位址互相指向,即可關聯在一起

2.在eureka client的配置檔案中,配置上這兩台eureka server的位址,讓client能夠同時注冊到這兩台eureka server上。這樣即便其中一台eureka server挂掉,另一台依舊可以繼續工作

1.編輯兩台eureka server的配置檔案,eureka-server01:

eureka-server02:

2.編輯eureka client的配置檔案,多個url使用英文逗号分隔:

如果項目規模比較大,有兩個以上的eureka server,那該如何在配置檔案中配置呢?其實隻需要每台eureka server分别配置除自己之外的eureka server機器,然後eureka client則配置所有的eureka server位址即可。如下圖:

Spring Cloud Eureka-服務注冊與發現

配置檔案示例,eureka-server01:

配置檔案示例,eureka-server02:

配置檔案示例,eureka-server03:

eureka client的配置檔案示例:

繼續閱讀